Seite 1 von 1
Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 16:50
von junii
Hallo,
gleich im voraus: ich habe die Foreneinträge zu Schüler/Studenten und Neulingen gelesen. Ich habe 2 Bücher (von denen ich nur eines verstehe) und Google auch. Ich beschäftige mich seit 3 Tagen mit Python und habe keine Vorbildung was Programmieren angeht.
Dennoch brauche ich Hilfe, bei einem Problem: folgender Code gibt mir Quadratzahlen aus:
Code: Alles auswählen
import sys
n=input()
n=int(n)
for i in range(1,n):
while i < n:
i=i+1
y=(i*i)
print(y)
else:
print("ende")
break
Python schreibt die Ergebnisse untereinander, soweit sogut.
Ich will aber das Ergebnis in der Art ausgegeben haben: y1 + y2 + y3 + ... + yn = x
Nun, ich verstehe einfach nicht wie ich python sage, dass ich das so haben will. dazu müsste ich doch erstmal festlegen, dass es y1, y2 usw. gibt. das geht aber nicht manuell, da ich ja für ein beliebiges n alle y haben will.
ich wäre auch über Anregungen froh, wie ich es anders anstellen könnte!
lieben Gruß
ps: sorry für die unklare Überschrift, ich hab keinen Namen für mein Problem.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:02
von cofi
Willkommen zu Python und hier im Forum!
2 Stichwoerter: Listen und
Stringformatting.
Sammle deine `y` in eine Liste und gib sie am Ende mit einem Formatstring aus, statt einzeln.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:07
von BlackJack
@junii: Der Inhalt der ``for``-Schleife ist unsinnig. Diese Schleife würde `i` an alle Zahlen von 1 bis n-1 binden. Und Du machst damit gar nichts. Stattdessen zählst Du in einer ``while``-Schleife `i` im ersten Durchlauf der ``for``-Schleife ”manuell” hoch, etwas was man eigentlich mit einer ``for``-Schleife machen sollte, und brichst dann nach Ablauf der ``while``-Schleife die äussere ``for``-Schleife grundsätzlich in ihrem ersten Durchlauf ab. Du hast da also eine ``for``-Schleife deren Schleifenvariable überhaupt nicht (sinnvoll) verwendet wird und die *immer* nur *einmal* durchlaufen wird. Dafür braucht man keine Schleife. Schleifen sind dazu da zumindest potentiell etwas zu *wiederholen*.
Das ``else`` zum ``while`` ist ebenfalls unsinnig. Wenn innerhalb einer Schleife kein ``break`` vorkommt, dann macht ein ``else``-Zweig zur Schleife ganz grundsätzlich keinen Sinn, weil der Inhalt *immer* ausgeführt wird. Dann kann man den entsprechenden Code aber auch ganz normal hinter die Schleife schreiben.
Zum Ausgabeproblem: Man nummeriert keine Namen durch. Insbesondere nicht wenn die Anzahl der Namen erst zur Laufzeit bekannt ist. Dann geht das ja auch gar nicht die Namen alle hin zu schreiben. Du müsstest Deine Zwischenergebnisse in einer Liste sammeln. Am besten dort schon in Zeichenketten umwandeln. Dann kannst Du diese Teilergebnisse mit der `join()`-Methode auf Zeichenketten mit dem ' + ' zusammensetzen. Das 'x' in der Ausgabe solltest Du in der Schleife vielleicht auch gleich berechnen.
Warum wird `sys` importiert?
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:22
von Gary123456
Dennoch brauche ich Hilfe, bei einem Problem: folgender Code gibt mir Quadratzahlen aus:
Ich gehe davon aus, dass der Benutzer eine Zahl eingeben muss und diese dann quadriert wird. Nehmen wir ein Beispiel: Der User will 5 eingeben. Das Quadrat wäre 25. Nun aber macht Dein Programm was anderes. Mit range erstellst Du eine Liste von 1 bis zahl - 1. Warum zahl - 1? Weil Du ja mit 1 beginnst und nicht mit 0!
Wenn Du jedoch die einzelnen Elemente der Liste quadrieren möchtest, passt der Code. Wenn Du aber nur
eine Zahl quadrieren möchtest, ist die for Schleife unnötig. Schau: print range(1, 5) erstellt die Liste [1, 2, 3, 4]. Danach eine eine Bedingungsschleife. Diese Schleife ist meines Erachtens sinnlos. Lass Doch mal diese while Schleife weg.
Dein Code vereinfacht:
Code: Alles auswählen
import sys
zahl = int(input("Geben Sie eine Zahl ein!"))
for i in range(1, zahl):
print(i * i)
print("Ende")
Ausgabe wäre jetzt:
Im ursprünglichem Code wars doch ohne 1? Wie könnte man das lösen? Denk drüber nach!
Allgemein sollten aussagekräftiger Namen ausgesucht werden und man sollte auch die PEP8 Richtlinien beachten.
Warum wird sys importiert?
Ich will aber das Ergebnis in der Art ausgegeben haben: y1 + y2 + y3 + ... + yn = x
Du könntest die Ergebnise ja in eine Liste packen

Du speicherst das Ergebnis des i * i in einer Variablen ab, und erweiterst bei jedem Durchlauf dieser For Schleife die Liste. Danach wendest Du eine erneute for Schleife an, um die Elemente der Liste auszugeben.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:32
von junii
hey toll, danke für die schnellen antworten!
blackjack: verstehe ich dich richtig, dass weder while noch for-schleife angebracht sind?
gary: die ausgabe ist schon gut so, nur die form ist noch nicht richtig. man soll das n eingeben, und dann für alle zahlen von 1 bis n das quadrat erhalten.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:32
von nomnom
Gary123456 hat geschrieben:Mit range erstellst Du eine Liste von 1 bis zahl - 1. Warum zahl - 1? Weil Du ja mit 1 beginnst und nicht mit 0!
Nein, deswegen "zahl - 1", weil range(m, n) immer einen
Iterator (in Python 2 wäre es eine Liste, aber das hier ist Python 3) von m bis einschließlich "n-1" zurückgibt.
Danach wendest Du eine erneute for Schleife an, um die Elemente der Liste auszugeben.
Ich finde auch `str.join` schöner.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:34
von /me
Nur mal ein paar Ansätze.
Daten in einer Liste sammeln ist prima.
Code: Alles auswählen
>>> daten = []
>>> daten.append(1)
>>> daten.append(4)
>>> daten.append(37)
>>> daten
[1, 4, 37]
Wie sieht es denn mit der Summe aus?
Strings haben eine join-Methode mit der man einzelne Elemente einer Liste zu einem String verbinden kann.
Code: Alles auswählen
>>> ' + '.join(daten)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
' + '.join(daten)
TypeError: sequence item 0: expected string, int found
Oh, das passt nicht. Die Elemente der Liste müssen Strings sein (
expected strings) und keine Zahlen (
int found). Wir erstellen also eine neue Liste aus der alten Liste und kovertieren die Integer-Werte dabei in Strings.
Code: Alles auswählen
>>> daten = [str(element) for element in daten]
>>> daten
['1', '4', '37']
Probieren wir es noch einmal.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:36
von /me
junii hat geschrieben:blackjack: verstehe ich dich richtig, dass weder while noch for-schleife angebracht sind?
Eine Schleife wirst du auf jeden Fall brauchen und da bietet sich die for-Schleife an.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:39
von nomnom
junii hat geschrieben:blackjack: verstehe ich dich richtig, dass weder while noch for-schleife angebracht sind?
for-Schleife ist schon richtig, aber die while-Schleife ist nicht notwendig. Garys for-Schleife ist einfacher, erfüllt aber immer noch genau deinen Zweck.
gary: die ausgabe ist schon gut so, nur die form ist noch nicht richtig. man soll das n eingeben, und dann für alle zahlen von 1 bis n das quadrat erhalten.
Wie schon erwähnt, bietet sich dafür
`str.join` an. Kleines Beispiel, wie man es verwendet:
Code: Alles auswählen
l = ["dies", "sind", "ein", "paar", "Zeichenketten"]
print("...".join(l))
Edit: /me kam mir zuvor.

Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:44
von junii
okay das ist nun ziemlich viel input für mich, ich werde das alles erstmal nehmen und probieren.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 17:46
von junii
achso, sys wird aufgrund meiner unwissenheit importiert. vor den aufgaben steht, man solle immer erst sys importieren :K
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 19:25
von bords0
nomnom hat geschrieben:Nein, deswegen "zahl - 1", weil range(m, n) immer einen Iterator (in Python 2 wäre es eine Liste, aber das hier ist Python 3) von m bis einschließlich "n-1" zurückgibt.
Das ist nicht richtig, range-Objekte sind keine Iteratoren.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 19:30
von nomnom
bords0 hat geschrieben:nomnom hat geschrieben:Nein, deswegen "zahl - 1", weil range(m, n) immer einen Iterator (in Python 2 wäre es eine Liste, aber das hier ist Python 3) von m bis einschließlich "n-1" zurückgibt.
Das ist nicht richtig, range-Objekte sind keine Iteratoren.
Code: Alles auswählen
>>> next(range(10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'range' object is not an iterator
tatsächlich.

aber ich dachte, dinge, über die man iterieren kann, sind iteratoren.

Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 20:16
von BlackJack
@nomnom: Dinge über die man iterieren kann sind iterierbar weil die einen Iterator liefern wenn man mit ihnen `iter()` aufruft. Und Iteratoren sind auch iterierbar.

Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 20:29
von junii
Hallo,
ich habe nun meinen code geändert:
Code: Alles auswählen
print("Type any number:")
n=input()
n=int(n)
i=1
for i in range (1,n):
i=i+1
y=(i*i)
print(y)
die ausgabe sieht so aus, ähnlich wie vorher:
aber ich kann y nicht sortieren oder in eine liste tun - die fehlermeldung lautet "int object is not iterable".
sehe ich das richtig: die elemente von y werden erst definiert, dadurch, dass der benutzer ein n angibt. kann ich sie deswegen nicht einordnen bzw sortieren?
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 20:41
von Gary123456
Hallo,
Code: Alles auswählen
Zahl = int(input("Type any numbers: "))
Zahlenmenge = []
for i in range (2, Zahl + 1):
y = i * i
Zahlenmenge.append(y)
print Zahlenmenge
Das sollte ein Denkanstoß sein. Du machst Dir vieles zu kompliziert.
Diese Zeilen sind unnötig:
Code: Alles auswählen
print("Type any number:")
n=int(n)
i=1
i=i+1
y=(i*i) => Die Klammern
Mit meinem Code hast Du dieselbe Ausgabe mit viel kürzerem Code. Versuche ihn zu verstehen. Vll sollest Du als Übung erstmal Listen erstellen, Elemente hinzufuegen etc.
aber ich kann y nicht sortieren oder in eine liste tun - die fehlermeldung lautet "int object is not iterable".
Dazu bräuchten wir aber auch den Code + vollständige Fehlermeldung
EDIT: Mein COde ginge noch kürzer. Kleine Aufgabe für Dich: Wie würde mein Code noch kürzer gehen?
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 20:54
von /me
Du hast die for-Schleife in Verbindung mit
range noch nicht verstanden oder nutzt zumindest die Möglichkeiten nicht aus.
range liefert dir die Zahlen im angegebenen Bereich. Mit dem
for i durchläufst du alle diese Zahlen in einer Schleife. Es gibt keine Notwendigkeit
i vorher auf irgendeinen Wert zu setzen oder
i innerhalb der Schleife manuell hochzuzählen.
Mir ist bisher nicht ganz klar geworden ob die 1 Teil der zu berechnenden Zahlen sein soll oder nicht. Du müsstest bei Bedarf die Parameter von
range entsprechend anpassen.
Re: Anfängerin braucht Hilfe..
Verfasst: Montag 22. April 2013, 21:08
von junii
danke für die hinweise. ich werde nochmal von vorn anfangen und mich mit diesen ausdrücken vertraut machen und die aufgaben dann für nächste woche bearbeiten.
Re: Anfängerin braucht Hilfe..
Verfasst: Dienstag 23. April 2013, 07:39
von /me
junii hat geschrieben:danke für die hinweise. ich werde nochmal von vorn anfangen und mich mit diesen ausdrücken vertraut machen und die aufgaben dann für nächste woche bearbeiten.
Ich habe hier mal eine simple Logik verwendet.
number ist die Zahl bis zu der berechnet werden soll.
result nimmt die Summe auf. In
infotext wird der auszugebende Text aufgebaut.
Code: Alles auswählen
number = 5
result = 0
infotext = ''
for i in range(1, number + 1):
# Ergebnisse aufaddieren
result += i * i
# Ausgabetext zusammensetzen
infotext += str(i * i) + ' + '
# Mal schauen wie es aussieht
print(infotext)
# letztes Plus-Zeichen und Leerzeichen abschneiden und die Summe ergänzen
infotext = infotext[:-2] + '= ' + str(result)
print(infotext)
Das funktioniert, ist aber nicht besonders schön.
Alternativ kommt jetzt hier eine sehr kurze Variante in der alle Zahlen in einer Liste gesammelt werden. Was beim
print passiert mag für einen Anfänger erst einmal erschreckend aussehen ist aber eigentlich gar nicht dramatisch. Das ließe sich für eine anfängliche Übersichtlichkeit auch durchaus auf mehrere Zeilen verteilen. Das Wesentliche ist der Ansatz alle Einzelergebnisse in einer Liste zu sammeln und dann damit zu arbeiten.
Code: Alles auswählen
number = 5
results = [i * i for i in range(1, number + 1)]
print('{} = {}'.format(' + '.join(map(str, results))), (sum(results)))