Ce que vous voulez est ceci:
print(sum(decimal.Decimal(1)/i for i in range(1, 31)))
La raison pour laquelle votre code ne fonctionne pas, est que vous essayez de itérer sur unDecimal
instance (par l'utilisation de sum
). De plus, votre définition de var
n'est pas valide. Votre intention était probablement quelque chose comme ceci:
var = lambda i: decimal.Decimal(str(1.0/i))
(Notez l'utilisation de str
, Decimal
does not permit un argument en virgule flottante). Mais même alors, votre boucle ne fonctionnerait pas, car l'utilisation de à l'intérieur de la boucle est intrinsèquement erronée. sum
doit être utilisé après la boucle a créé toutes les fractions que vous souhaitez additionner. Donc, ce serait soit de:
print(sum(var(i) for i in range(1,31)))
print(sum(map(var, range(1, 31))))
Pour être complet, une autre façon de faire est la suivante:
one = decimal.Decimal(1)
unitFractions = (one/i for i in itertools.count(1))
print(sum(itertools.islice(unitFractions, 30)))
Cependant, comme mentionné par gs, la fractions fournit une méthode alternative qui donne un réponse fractionnelle:
>>> unitFractions = (fractions.Fraction(1, i) for i in itertools.count(1))
>>> print(sum(itertools.islice(unitFractions, 30)))
9304682830147/2329089562800
Merci pour votre réponse! –