无法在Python中创建可迭代的十进制函数

0 投票
3 回答
2746 浏览
提问于 2025-04-15 11:30

我想计算一下

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

你的错误在于,decimal.Decimal(4) 不是一个函数,而是一个对象。


顺便说一下,看起来你真正需要的是 Fractions(Python 2.6)模块。

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))

(注意使用 strDecimal 不允许 使用浮点数作为参数)。但即便如此,你的循环也不会正常工作,因为在循环中使用 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

撰写回答