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
, Decimal
does 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
Vielen Dank für Ihre Antwort! –