2009-05-10 8 views
0

Ich möchte berechnen die Summe vonkann nicht

1/1 + 1/2 + 1/3 + ... + 1/30 

Ich betreibe den Code erfolglos

import decimal 
import math 
var=decimal.Decimal(1/i) 

for i in range(1,31): 
    print(sum(var)) 

Ich erhalte den Fehler

'Decimal' object is not iterable 

eine iterable dezimal Funktion in Python machen Wie können Sie die iterierbare Funktion in Python erstellen?

Antwort

11

Was Sie wollen, ist dies:

print(sum(decimal.Decimal(1)/i for i in range(1, 31))) 

Der Grund Code nicht funktioniert, ist, dass Sie versuchen, über eineDecimal Instanz iterieren (durch die Verwendung von sum). Außerdem ist Ihre Definition von var ungültig. Ihre Absicht war wohl so etwas wie folgt aus:

var = lambda i: decimal.Decimal(str(1.0/i)) 

(Beachten Sie die Verwendung von str, Decimaldoes not permit eine Gleitkomma-Argument). Aber selbst dann würde Ihre Schleife nicht funktionieren, weil die Verwendung der Schleife inhärent fehlerhaft ist. sum sollte verwendet werden nach die Schleife hat alle Brüche erstellt, die Sie summieren möchten. So dass entweder sein würde:

print(sum(var(i) for i in range(1,31))) 
print(sum(map(var, range(1, 31)))) 

Der Vollständigkeit halber noch eine andere Möglichkeit, dies zu tun, ist die folgende:

one = decimal.Decimal(1) 
unitFractions = (one/i for i in itertools.count(1)) 
print(sum(itertools.islice(unitFractions, 30))) 

Wie jedoch durch gs erwähnt, stellt die fractions eine alternative Methode, die eine ergibt fraktionierte Antwort:

>>> unitFractions = (fractions.Fraction(1, i) for i in itertools.count(1)) 
>>> print(sum(itertools.islice(unitFractions, 30))) 
9304682830147/2329089562800 
+0

Vielen Dank für Ihre Antwort! –

3

Sie schreiben:

var=decimal.Decimal(1/i) 

was seltsam ist, da 'i' an diesem Punkt nicht definiert ist. Wie wäre es:

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

Ihr Fehler ist, dass decimal.Decimal(4) keine Funktion, sondern ein Objekt.


BTW: Es sieht aus wie die Fractions (Python 2.6) Modul ist das, was Sie wirklich brauchen.

+0

Ich stimme Fraktion zu. Dezimal soll nur endliche Basis-10-Dezimalstellen darstellen. Es wird keine Sachen wie 1/3 genau darstellen. Warum also benutzen? Fraktion ist, was Sie mit Brüchen rechnen wollen. – newacct