0

我想计算总和

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 中创建可迭代函数?

4

3 回答 3

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所提到的,分数提供了一种产生分数答案的替代方法:

>>> unitFractions = (fractions.Fraction(1, i) for i in itertools.count(1))
>>> print(sum(itertools.islice(unitFractions, 30)))
9304682830147/2329089562800
于 2009-05-10T18:19:59.380 回答
3

你写:

var=decimal.Decimal(1/i)

这很奇怪,因为当时没有定义“我”。怎么样:

one = decimal.Decimal( "1" )
total = decimal.Decimal( "0" )
for i in range( 1, 31 ):
    total += one / decimal.Decimal( "%d" % i )
于 2009-05-10T18:22:50.967 回答
2

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


顺便说一句:看起来分数(Python 2.6)模块是您真正需要的。

于 2009-05-10T18:31:57.240 回答