Невозможно создать итеративную десятичную функцию в Python - PullRequest
0 голосов
/ 10 мая 2009

Я хочу рассчитать сумму

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 ]

11 голосов
/ 10 мая 2009

То, что вы хотите, это:

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
3 голосов
/ 10 мая 2009

Вы пишете:

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 )
2 голосов
/ 10 мая 2009

Ваша ошибка в том, что decimal.Decimal(4) не функция, а объект.


Кстати: похоже, модуль Fractions (Python 2.6) - это то, что вам действительно нужно.

...