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

Léo*_* 준영 0 python iteration sum

我想计算总和

1/1 + 1/2 + 1/3 + ... + 1/30
Run Code Online (Sandbox Code Playgroud)

我运行代码失败了

import decimal
import math
var=decimal.Decimal(1/i)

for i in range(1,31):
   print(sum(var))
Run Code Online (Sandbox Code Playgroud)

我收到了错误

'Decimal' object is not iterable
Run Code Online (Sandbox Code Playgroud)

如何在Python中创建可迭代函数?

Ste*_*202 11

你想要的是这个:

print(sum(decimal.Decimal(1) / i for i in range(1, 31)))
Run Code Online (Sandbox Code Playgroud)

您的代码不起作用的原因是您尝试迭代一个 Decimal实例(通过使用sum).此外,您的定义var无效.你的意图可能是这样的:

var = lambda i: decimal.Decimal(str(1.0 / i))
Run Code Online (Sandbox Code Playgroud)

(注意使用str,Decimal 不允许浮点参数).但即使这样你的循环也行不通,因为循环sum 内部的使用本质上是有缺陷的.sum应该在循环创建了要求求和的所有分数之后使用.所以这将是:

print(sum(var(i) for i in range(1,31)))
print(sum(map(var, range(1, 31))))
Run Code Online (Sandbox Code Playgroud)

为了完整起见,另一种方法是:

one = decimal.Decimal(1)
unitFractions = (one / i for i in itertools.count(1))
print(sum(itertools.islice(unitFractions, 30)))
Run Code Online (Sandbox Code Playgroud)

然而,正如gs所提到的,这些分数提供了一种替代方法,可以产生一个分数答案:

>>> unitFractions = (fractions.Fraction(1, i) for i in itertools.count(1))
>>> print(sum(itertools.islice(unitFractions, 30)))
9304682830147/2329089562800
Run Code Online (Sandbox Code Playgroud)