То, что вы хотите, это:
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