无法在Python中创建可迭代的十进制函数
我想计算一下
1/1 + 1/2 + 1/3 + ... + 1/30
我运行代码的时候没有成功
import decimal
import math
var=decimal.Decimal(1/i)
for i in range(1,31):
print(sum(var))
我遇到了这个错误
'Decimal' object is not iterable
怎样才能在Python中创建一个可迭代的函数呢?
3 个回答
2
3
你写道:
var=decimal.Decimal(1/i)
这有点奇怪,因为在那个时候'i'并没有被定义。那么这样怎么样:
one = decimal.Decimal( "1" )
total = decimal.Decimal( "0" )
for i in range( 1, 31 ):
total += one / decimal.Decimal( "%d" % i )
11
你想要的结果是这样的:
print(sum(decimal.Decimal(1) / i for i in range(1, 31)))
你的代码之所以不工作,是因为你试图对一个 Decimal 实例进行循环(通过使用 sum
)。而且,你定义的 var
是不正确的。你可能想要的是这样的:
var = lambda i: decimal.Decimal(str(1.0 / i))
(注意使用 str
,Decimal
不允许 使用浮点数作为参数)。但即便如此,你的循环也不会正常工作,因为在循环中使用 sum
是有问题的。sum
应该在循环完成后再使用,这样才能把你想要的所有分数加起来。所以可以用以下任意一种方式:
print(sum(var(i) for i in range(1,31)))
print(sum(map(var, range(1, 31))))
为了完整起见,还有另一种方法可以做到这一点:
one = decimal.Decimal(1)
unitFractions = (one / i for i in itertools.count(1))
print(sum(itertools.islice(unitFractions, 30)))
不过,正如 gs 提到的,fractions 提供了一种替代方法,可以得到一个分数的结果:
>>> unitFractions = (fractions.Fraction(1, i) for i in itertools.count(1))
>>> print(sum(itertools.islice(unitFractions, 30)))
9304682830147/2329089562800