Summer der Quadratzahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Casio
User
Beiträge: 5
Registriert: Dienstag 23. Oktober 2018, 17:32

Hallo Zusammen,
versuche mir gerade zuhause selber Python beizubringen (Tag 3) und habe Probleme mit einer for-Schleife.
Ziel ist die Summe der Quadrate von 1 bis 99, die sich idealerweise in der Variable b bilden sollte.
Der Debugger sagt mir es gibt einen Type-Error, aber sowohl a als auch Quadratur(a) sind doch integer oder nicht?

def Quadratur(Operator):
return print(Operator**2)

a = 1
b = 0

for number in range(1,100):
b += Quadratur(a)
a += 1

print(b)

Grüße, Casio
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du gibst ja auch das Ergebnis der print-Funktion zurueck. Das ist nunmal None.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

und die Zählervariable a ist überflüssig da du dazu die Variable number nehmen kannst
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Casio
User
Beiträge: 5
Registriert: Dienstag 23. Oktober 2018, 17:32

Habs hinbekommen.
Danke für die Hinweise!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktionen sollten als Name eine Tätigkeit haben, also bei Dir "quadrieren". Einen Operator quadrierst Du hier auch nicht, sondern einen Quadranten, oder eben einfach eine Zahl. Die richtige Wahl der Namen hilft Dir, ein Problem zu verstehen und fehlerfrei in ein Programm zu übersetzen:

Code: Alles auswählen

def quadrieren(zahl):
    return zahl ** 2

summe = 0
for zahl in range(1, 101):
    summe += quadrieren(zahl)
print(summe)
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier noch zwei Varianten. Einmal wenn man mehr Python-Syntax gelernt hat (Generatorausdrücke) und die `sum()`-Funktion verwendet kann man das als Einzeiler ausdrücken:

Code: Alles auswählen

print(sum(zahl**2 for zahl in range(1, 101)))
Und wenn man ein bisschen Mathemagie macht, kann man aus der Summe, die ja über eine Schleife realisiert wird und damit von der Laufzeit her von der grösse der Obergrenze bis wohin Quadratzahlen gebildet und summiert werden sollen, abhängt, einen geschlossenen Ausdruck machen, der konstanter in der benötigten Laufzeit ist:

Code: Alles auswählen

def summe_der_quadrate_bis(n):
    return int(n**3/3 + n**2/2 + n/6)

print(summe_der_quadrate_bis(100))
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Casio
User
Beiträge: 5
Registriert: Dienstag 23. Oktober 2018, 17:32

__blackjack__ hat geschrieben: Donnerstag 25. Oktober 2018, 09:57

Code: Alles auswählen

def summe_der_quadrate_bis(n):
    return int(n**3/3 + n**2/2 + n/6)

print(summe_der_quadrate_bis(100))
Hab gerade 20 min überlegt warum das funktioniert. Nicht schlecht, sehr elegant!
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@__blackjack__: Man kann die Berechnung komplett auf Integern durchführen und damit unnötige Rundungsfehler vermeiden. ;-)
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Casio: Ich habe da fast gar nicht drüber nachgedacht, nur in soweit das es da ja diese Geschichte vom kleinen Gauss und der Summe von allen Zahlen von 1 bis 100 gibt. Den Rest habe ich dann mit dem `sympy`-Package erledigt:

Code: Alles auswählen

In [31]: import sympy

In [32]: sympy.init_printing()

In [33]: from sympy.abc import i, n

In [34]: sympy.Sum(i**2, (i, 1, n))
Out[34]: 
  n     
 ___    
 ╲      
  ╲    2
  ╱   i 
 ╱      
 ‾‾‾    
i = 1   

In [35]: sympy.Sum(i**2, (i, 1, n)).doit()
Out[35]: 
 3    2    
n    n    n
── + ── + ─
3    2    6
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten