Anfängerin braucht Hilfe..

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
junii
User
Beiträge: 6
Registriert: Montag 22. April 2013, 16:34

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.
Zuletzt geändert von Anonymous am Montag 22. April 2013, 16:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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?
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

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:

Code: Alles auswählen

Geben Sie eine Zahl ein!5
1
4
9
16
Ende
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.
junii
User
Beiträge: 6
Registriert: Montag 22. April 2013, 16:34

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.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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?

Code: Alles auswählen

>>> sum(daten)
42
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.

Code: Alles auswählen

>>> ' + '.join(daten)
'1 + 4 + 37'
Zuletzt geändert von /me am Montag 22. April 2013, 17:38, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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. :)
junii
User
Beiträge: 6
Registriert: Montag 22. April 2013, 16:34

okay das ist nun ziemlich viel input für mich, ich werde das alles erstmal nehmen und probieren.
junii
User
Beiträge: 6
Registriert: Montag 22. April 2013, 16:34

achso, sys wird aufgrund meiner unwissenheit importiert. vor den aufgaben steht, man solle immer erst sys importieren :K
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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. :D
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. :-)
junii
User
Beiträge: 6
Registriert: Montag 22. April 2013, 16:34

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:

Code: Alles auswählen

>>> 
Type any number:
6
4
9
16
25
36
>>> 
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?
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

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?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

junii hat geschrieben:

Code: Alles auswählen

i=1
for i in range (1,n):
    i=i+1
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.
junii
User
Beiträge: 6
Registriert: Montag 22. April 2013, 16:34

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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)))
Antworten