如何以可读的方式指定大整数字面值



我想指定一个大整数序列(有许多零),如:

a = [1e13, 1e14, 1e19, ...]

我的直觉是使用科学符号。但在python中,它是浮点数而不是整数。在python中是否有一种简单的方法来编写这些整数字面值而不写所有的零,因为确保零的数量正确是一场噩梦。

我相信我可以使用int将浮点数转换回整数,但只是想知道是否有更好的方法?

供将来观看

因为python 3.6 PEP 515将包含在内。

所以你可以用a = 1_000_000_000_000来提高代码的可读性

使用***,它不漂亮,但给你正确的结果。

print(2e10)
20000000000.0
print(2*10**10)
20000000000

你也可以像这样生成一个完整的列表:

result = []
for i in range(5):
    result.append(1*10**i)

>>> result
[1, 10, 100, 1000, 10000]

如果你真的想使用科学记数法,那么

result = []
for n in range(5):
    result.append(int(float(f"1e{n}"))) #converting to int directly gives: ValueError: invalid literal for int() with base 10: '1e0'

>>> result
[1, 10, 100, 1000, 10000]

输入中,您可以指定带有下划线的整数。

从python 3.10开始,您还可以使用pprint库方法,例如pprint.pprintpprint.pformatunderscore_numbers=True一起输出带下划线的整数。这对非整数没有影响。

例子:

from pprint import pformat
nums = [1000000, 1_000_000, 1e6, 1000000.1]
for num in nums:
    print(num, pformat(num), pformat(num, underscore_numbers=True))
# 1000000 1000000 1_000_000
# 1000000 1000000 1_000_000
# 1000000.0 1000000.0 1000000.0
# 1000000.1 1000000.1 1000000.1

参见:

python人类可读的大数

可以设置一些后缀

K=1000
M=K*K
G=K*M
T=K*G
P=K*T
E=K*P
print 12*P

或使用较长的名称(kilo等)

您可以使用逗号分隔符,作为字符串,然后转换为整型。

import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
def bigint(s):
    return locale.atoi(s)
print bigint('1,000,000,000,000')

您可以这样做,这样可以避免float到int的转换问题,并且在我看来是相当可读的:

a = map(int, ['1'+'0'*13, '1'+'0'*14, '1'+'0'*19, '1'+'0'*23])
for value in a:
    print(format(value, ','))
输出:

10,000,000,000,000
100,000,000,000,000
10,000,000,000,000,000,000
100,000,000,000,000,000,000,000

最新更新