2009-05-10 5 views

Répondre

11

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, Decimaldoes 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 
+0

Merci pour votre réponse! –

3

Vous écrivez:

var=decimal.Decimal(1/i) 

ce qui est étrange car 'i' n'est pas défini à ce stade. Que diriez-vous:

one = decimal.Decimal("1") 
total = decimal.Decimal("0") 
for i in range(1, 31): 
    total += one/decimal.Decimal("%d" % i) 
2

Votre erreur est que decimal.Decimal(4) est pas une fonction, mais un objet.


BTW: Il ressemble le module Fractions (Python 2.6) est ce que vous avez vraiment besoin.

+0

Je suis d'accord sur Fraction. La décimale est censée représenter des décimales de base-10 finies. Il ne représentera pas des choses comme 1/3 précisément. Alors pourquoi l'utiliser? La fraction est ce que vous voulez faire l'arithmétique avec des fractions. – newacct

Questions connexes