Python Newbie Frage

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.
Sonjiru
User
Beiträge: 6
Registriert: Sonntag 8. September 2013, 20:06

Python Version : 3.3.2

Ich versuche mir derzeit Python beizubringen. Also geht es erstmal los mit einfachen Dingen. Print Befehle. Dann eine Eingabe machen die später wieder ausgegeben wird. Das funktioniert schon mal so weit.

Nun habe ich vor das man 2 Zahlen eingibt. Diese zwei Zahlen sollen dann addiert werden und die summe ausgegeben werden. Da dachte ich mir ach das ist doch ganz einfach. Schreib die paar Zeilen Code. Geb in der Eingabeaufforderung den befehl ein das Script zu starten (bis ich eine GUI machen kann dauert das wohl noch eine Weile :D) und zack kommt folgender Fehler :
NameError : name 'zahl1' is not defined.

Der dazugehörige Code

Code: Alles auswählen

def rechnen():

# Anfang Eingabe der Zahlen
  zahl1 = int(input('Erster Wert: '))
  zahl2 = int(input('Zweiter Wert: '))
# Ende Eingabe der Zahlen



summe = zahl1 + zahl2

print("Ergebnis: " + summe)

rechnen()
Der Fehler kommt ja bevor ich die Zahlen überhaupt eingeben kann.
BlackJack

@Sonjiru: Natürlich kommt der Fehler bevor Du eine Eingabe machen kannst, denn 1) rufst Du die Funktion für die Eingabe erst *nach* dem Versuch die Summe zu berechnen auf, und 2) würde es selbst dann den Fehler geben wenn Du die Funktion vorher aufrufst weil die beiden Namen `zahl1` und `zahl2` nur innerhalb der Funktion an die Eingabe gebunden werden. Das sind in der Funktion lokale Namen die nur so lange existieren wie die Funktion ausgeführt wird.

Vielleicht wolltest Du auch ein paar mehr Zeilen *einrücken*. Überlege Dir mal welche Zeilen zu der Funktion gehören sollen und wie der Compiler erkennt welche Zeilen in die Funktion gehören und welche nicht.
Sonjiru
User
Beiträge: 6
Registriert: Sonntag 8. September 2013, 20:06

BlackJack hat geschrieben:@Sonjiru: Natürlich kommt der Fehler bevor Du eine Eingabe machen kannst, denn 1) rufst Du die Funktion für die Eingabe erst *nach* dem Versuch die Summe zu berechnen auf, und 2) würde es selbst dann den Fehler geben wenn Du die Funktion vorher aufrufst weil die beiden Namen `zahl1` und `zahl2` nur innerhalb der Funktion an die Eingabe gebunden werden. Das sind in der Funktion lokale Namen die nur so lange existieren wie die Funktion ausgeführt wird.

Vielleicht wolltest Du auch ein paar mehr Zeilen *einrücken*. Überlege Dir mal welche Zeilen zu der Funktion gehören sollen und wie der Compiler erkennt welche Zeilen in die Funktion gehören und welche nicht.

Das heißt der komplette Code ist erstmal falsch?

Selbst wenn ich die Funktion rechnen() vor summe aufrufe funktioniert es nicht. Ich kann dann zwar die Zahlen eingeben. Allerdings werden diese nicht berechnet.

Code: Alles auswählen

def rechnen():

# Anfang Eingabe der Zahlen
  zahl1 = int(input('Erster Wert: '))
  zahl2 = int(input('Zweiter Wert: '))
# Ende Eingabe der Zahlen

rechnen()

   summe = zahl1 + zahl2

  print("Ergebnis: " + summe)
Wenn ichs dann so einrücke (sprich alles was zur Funktion gehört auf eine höhe einrücke) funktioniert es auch nicht.

Dann kommt :
File "rechnen.py", line 10
summe = zahl1 + zahl2
^
IndentationError: unexpected indent

Also irgendwas hab ich da noch nicht verstanden.
BlackJack

@Sonjiru: Du hast das mit der Einrückung nicht verstanden. So hast Du die Funktion `rechnen()` mit zwei Zeilen definiert, danach den Aufruf, und *danach* steht dann eingerückter Quelltext bei dem sich der Compiler fragt *warum* der eingerückt ist. Zu der Funktion kann der ja nicht mehr gehören weil die durch das Ende der Einrückung beim Aufruf der Funktion schon zuende definiert war. Oder denkst Du man kann das beliebig mischen, also Code der nicht zur Funktion gehört mitten zwischen die Zeilen der Funktion schreiben? Was würde das denn für ein Chaos geben…

Du musst auch sauberer Einrücken. Konvention sind vier Leezeichen pro Ebene. Die beiden letzten Code-Zeilen sind ja unterschiedlich weit eingerückt, das sollte wohl auch nicht so sein.

Edit: Kommentare sollte man auch entsprechend dem Code einrücken, denn sonst unterbrechen die die visuelle Struktur, so dass man nicht mehr so leicht erkennen kann was alles zu dem eingerückten Block gehört.
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

@Sonjiru: Ich nehme an, dass Python deine erste Programmiersprache ist? Dann schnapp dir das [url=http://docs.python.org/3.3/tutorial/]Python-Tutorial[/code] und arbeite es durch.

Die Einrückung ist die Grundlage, auf der Python basiert. Ohne das entsprechende Verständnis dafür bist du nicht in der Lage mit der Sprache zu arbeiten, das Tutorial vermittelt das Wissen.

Gruß
Sebastian

Edit: Kommentare müssen in manchen Umgebungen sogar eingerückt werden:

Code: Alles auswählen

>>> def test():
... #kommentar
... 
  File "<stdin>", line 3
    
    ^
IndentationError: expected an indented block
>>> 
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sonjiru hat geschrieben:

Code: Alles auswählen

def rechnen():

# Anfang Eingabe der Zahlen
  zahl1 = int(input('Erster Wert: '))
  zahl2 = int(input('Zweiter Wert: '))
# Ende Eingabe der Zahlen

rechnen()

   summe = zahl1 + zahl2

  print("Ergebnis: " + summe)
Also irgendwas hab ich da noch nicht verstanden.
Du verteilst deine Einrückungen völlig wahlfrei im Code. Einrückungen dienen dazu, die Zugehörigkeit von Code zu anderen Codeteilen festzulegen.

Du hast erst einmal mit def rechnen() eine Funktionsdeklaration. Die folgenden Zeilen mit input sind eingerückt und gehören folglich dazu. Anschließend rufst du mit rechnen() die Funktion rechnen auf. Die folgende Zeile ist jetzt wieder eingerückt, aber es gibt nichts vorhergehendes, wozu die Einrückung gehören könnte (if, for, ...) und damit bekommst du dann den von dir genannten Fehler. Die Zeile mit dem print ist dann auch noch eingerückt, aber zu dem Zeitpunkt ist das Kind ohnehin schon in den Brunnen gefallen. Erschwerend kommt noch dazu, dass deine Einrückungen inkonsistent sind mit mal 2 und mal 3 Leerzeichen. Der Style Guide für Python Code (PEP 8) empfiehlt 4 Leerzeichen pro Einrückungsebene.

Was du vermutlich willst ist, dass die Funktion rechnen zwei Werte addiert und ihre Summe zurückgibt.

Code: Alles auswählen

def rechnen():
    zahl1 = int(input('Erster Wert: '))
    zahl2 = int(input('Zweiter Wert: '))
    summe = zahl1 + zahl2
    return summe

ergebnis = rechnen()
print("Ergebnis: " + str(ergebnis))
(Ich würde den Code zwar eigentlich deutlich anders schreiben und anders aufteilen, aber du sollst ihn ja wiedererkennen)

Was nicht geht, ist das was du in deinem ersten Versuch gemacht hast, nämlich zahl1 und zahl2 außerhalb ihrer Funktion weiter zu benutzen. Dort existieren diese Namen aber überhaupt nicht.

Code: Alles auswählen

x = 23
def test():
    x = 42

test()
print(x)
Mit diesem Code kannst du das ganze selber ausprobieren. Das x außerhalb und das x innerhalb der Funktion heißen zwar gleich, haben aber nichts miteinander zu tun. Lass das Miniprogramm mal laufen und überlege dir vorher mal selber, welches Ergebnis du erwartest.
Sonjiru
User
Beiträge: 6
Registriert: Sonntag 8. September 2013, 20:06

/me hat geschrieben:

Code: Alles auswählen

x = 23
def test():
    x = 42

test()
print(x)
Mit diesem Code kannst du das ganze selber ausprobieren. Das x außerhalb und das x innerhalb der Funktion heißen zwar gleich, haben aber nichts miteinander zu tun. Lass das Miniprogramm mal laufen und überlege dir vorher mal selber, welches Ergebnis du erwartest.
Habe die 23 erwartet.

Der Grund ist folgender : Die 23 ist nicht eingerückt genauso wie der befehl "print(x)". Ist die Erklärung richtig?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sonjiru hat geschrieben:Der Grund ist folgender : Die 23 ist nicht eingerückt genauso wie der befehl "print(x)". Ist die Erklärung richtig?
Nein, nicht wirklich. Vielleicht ist es aber richtig gemeint und klingt nur falsch. Wenn es nur an den Einrückungen läge, dann müsste ja der folgende Code auch 23 ausgeben. Tut er aber nicht.

Code: Alles auswählen

x = 23
if True:
    x = 42
print(x)
Der wirkliche Grund ist, dass die beiden x im ursprünglichen Code zu unterschiedlichen "Umgebungen" gehören. Einmal findet sich das x auf Modulebene selber, das andere Mal im lokalen Kontext einer Funktion.

OK, der Funktionsrumpf definiert sich über die Einrückungen, aber das bedeutet nicht, dass alles mit gleicher Einrücktiefe identisch behandelt wird. Es hängt vom Kontext ab.

Code: Alles auswählen

# x wird auf Modulebene definiert
x = 23

def test_1():
    # hier wird ein neues lokales x definiert
    x = 42
    print(x)

def test_2():
    # ein lokales x existiert hier nicht, also wird das x der höheren Ebene ausgegeben
    print(x)

# Aufruf der Funktionen
test_1()
test_2()
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

sparrow hat geschrieben:Edit: Kommentare müssen in manchen Umgebungen sogar eingerückt werden:

Code: Alles auswählen

>>> def test():
... #kommentar
... 
  File "<stdin>", line 3
    
    ^
IndentationError: expected an indented block
>>> 
Nein, das ist ein Irrtum. Die Einrückung von Kommentaren ist egal.

Hast du mal ausprobiert, was mit eingerücktem Kommentar passiert? Es kommt die gleiche Fehlermeldung.

In Zeile 3 steht ja auch gar kein Kommentar. Es fehlt aber ein eingerückter Block.
In der Dokumentation stehts noch mal deutlich:
Comments are ignored by the syntax; they are not tokens.

Zugegen: Die Fehlermeldung "IndentationError" passt deutlich besser, wenn anschließend noch eine nicht eingerückte Zeile kommt.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Sonjiru hat geschrieben:Python Version : 3.3.2

Ich versuche mir derzeit Python beizubringen. Also geht es erstmal los mit einfachen Dingen. Print Befehle. Dann eine Eingabe machen die später wieder ausgegeben wird. Das funktioniert schon mal so weit.
Sehr löblich, dass du dich für Python entschieden hast ;-) Darf man fragen, wie du dir das Programmieren bei bringst? Hast du dir ein Buch gekauft oder hast du andere Quellen im Internet?
Sonjiru
User
Beiträge: 6
Registriert: Sonntag 8. September 2013, 20:06

peddy hat geschrieben:
Sonjiru hat geschrieben:Python Version : 3.3.2

Ich versuche mir derzeit Python beizubringen. Also geht es erstmal los mit einfachen Dingen. Print Befehle. Dann eine Eingabe machen die später wieder ausgegeben wird. Das funktioniert schon mal so weit.
Sehr löblich, dass du dich für Python entschieden hast ;-) Darf man fragen, wie du dir das Programmieren bei bringst? Hast du dir ein Buch gekauft oder hast du andere Quellen im Internet?

Wieso sehr löblich :)

Über Internet Tutorials + das openbook auf galileocomputing. :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonjiru hat geschrieben: Über Internet Tutorials + das openbook auf galileocomputing. :)
Also letzteres vergiss am besten sofort! Es gibt viele gute Gründe, dieses *nicht* zu benutzen! (Kannst ja mal im Forum danach suchen)

Benutze doch eines der hier empfohlenen Tutorials. Auch dafür wirst Du nach ein wenig Suche im Forum alle möglichen Links finden. Aus dem Kopf kurz und knapp:
  • Learn Python the hard way (für Programmieranfänger sehr zu empfehlen!)
  • A Byte of Python
  • Das "offizielle Tutorial" (aus der Doku; gibt eine deutsche Übersetzung)
Einiges davon ist sicher auch im Wiki verlinkt; aber ich weiß nicht wie aktuell das ist. Dennoch ist auch das immer einen Blick wert!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sonjiru
User
Beiträge: 6
Registriert: Sonntag 8. September 2013, 20:06

Hyperion hat geschrieben:
Sonjiru hat geschrieben: Über Internet Tutorials + das openbook auf galileocomputing. :)
Also letzteres vergiss am besten sofort! Es gibt viele gute Gründe, dieses *nicht* zu benutzen! (Kannst ja mal im Forum danach suchen)

Benutze doch eines der hier empfohlenen Tutorials. Auch dafür wirst Du nach ein wenig Suche im Forum alle möglichen Links finden. Aus dem Kopf kurz und knapp:
  • Learn Python the hard way (für Programmieranfänger sehr zu empfehlen!)
  • A Byte of Python
  • Das "offizielle Tutorial" (aus der Doku; gibt eine deutsche Übersetzung)
Einiges davon ist sicher auch im Wiki verlinkt; aber ich weiß nicht wie aktuell das ist. Dennoch ist auch das immer einen Blick wert!

Hui okay alles klar. Von Galileocomputing habe ich auch den Ausbildungsbegleiter (lerne Fachinformatiker Systemintegration) und bin mit dem Buch eigentlich recht zufrieden. Aber gut das Buch über Python vergesse ich schon getan. Vielen Dank :)

Das "offizielle Tutorial" habe ich auch das ist das Tutorial was ich derzeit habe :)

Vielen Dank für die schnelle Hilfe schon mal :) und die Vorschläge
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonjiru hat geschrieben:Von Galileocomputing habe ich auch den Ausbildungsbegleiter (lerne Fachinformatiker Systemintegration) und bin mit dem Buch eigentlich recht zufrieden.
Naja, du siehst ja selbst dass du es nicht hinbekommst einen funktionsfähigen Fünfzeiler zu schreiben. Nimm lieber etwas anständiges, von jemandem geschrieben der auch Python kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Sonjiru
User
Beiträge: 6
Registriert: Sonntag 8. September 2013, 20:06

Leonidas hat geschrieben:
Sonjiru hat geschrieben:Von Galileocomputing habe ich auch den Ausbildungsbegleiter (lerne Fachinformatiker Systemintegration) und bin mit dem Buch eigentlich recht zufrieden.
Naja, du siehst ja selbst dass du es nicht hinbekommst einen funktionsfähigen Fünfzeiler zu schreiben. Nimm lieber etwas anständiges, von jemandem geschrieben der auch Python kann.

Ja eben :) Deswegen greife ich jetzt auch auf die Tutorials zurück die mir hier genannt worden sind :)
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Leonidas hat geschrieben:
Sonjiru hat geschrieben:Von Galileocomputing habe ich auch den Ausbildungsbegleiter (lerne Fachinformatiker Systemintegration) und bin mit dem Buch eigentlich recht zufrieden.
Naja, du siehst ja selbst dass du es nicht hinbekommst einen funktionsfähigen Fünfzeiler zu schreiben. Nimm lieber etwas anständiges, von jemandem geschrieben der auch Python kann.
Na, ob man das dem Buch in die Schuhe schieben kann? Ich verstehe ohnehin nicht warum dermaßen über das Buch hergezogen wird. Es ist sicher nicht das Gelbe vom Ei und man hätte vieles besser machen können, aber so schlecht? Bei einige Kommentaren könnte man meinen, es hätte nicht einmal die Note 6 verdient. Ich gebe ihm noch eine 4-.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Sonjiru hat geschrieben:Wieso sehr löblich :)
Ein paar ausgesuchte pros für Python, die mir gerade einfallen:
- Große Community (bei Problemen wichtig, gelle)
- Große Verbreitung
- Plattform übergreifend
- Viele Module (Wahlmöglichkeiten)
- Gute Doku
- Lange und stetige Entwicklung der Sprache
- Ich mag die Syntax
- ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

peddy hat geschrieben:Bei einige Kommentaren könnte man meinen, es hätte nicht einmal die Note 6 verdient. Ich gebe ihm noch eine 4-.
Und wieso sollte man aus einem Buch lernen, bei dem man nicht *weiß*, was gut und was schlecht ist? Und wieso überhaupt ein Buch wählen, welches Du mit 4- bewerten würdest, wenn es einfach bessere gibt?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

peddy hat geschrieben:Ich verstehe ohnehin nicht warum dermaßen über das Buch hergezogen wird. Es ist sicher nicht das Gelbe vom Ei und man hätte vieles besser machen können, aber so schlecht?
Das Kernproblem des Buches ist es, dass die Autoren keine Python-Programmierer sind, sondern Java-Programmierer. Es ist ein Java-Buch mit Python-Syntax was zudem noch ne Reihe von (mehr oder weniger schlimmen) Fehlern/Ungenauigkeiten hat. Die Leute die daraus Python lernen lernen kein idiomatisches Python sondern wie Python ausschaut wenn man Java-Programmierer ist. Python is not Java wurde schon 2004, also vor fast 9 Jahren publiziert, aber das scheint beim Openbook nicht angekommen zu sein.

Klar, man kann nicht alle Fehler der Lernenden dem Buch in die Schuhe schieben, aber wenn man die Leute auf ein Tutorial abschieben kann dass von Python-Programmierern für zukünftige Python-Programmierer ist, finde ich diese etwas hinterlistige Taktik ok ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Hyperion hat geschrieben:Und wieso sollte man aus einem Buch lernen, bei dem man nicht *weiß*, was gut und was schlecht ist? Und wieso überhaupt ein Buch wählen, welches Du mit 4- bewerten würdest, wenn es einfach bessere gibt?
Die Note 4 ist in der Schriftsprache eine "ausreichend" und genau so sehe ich das Buch. Es ist "ausreichend", um in die Sprache rein zu schnuppern und erste Gehversuche zu unternehmen, zumal es Kostenlos im Netz verfügbar ist.

Ich muss dir aber insofern recht geben, wenn es eine bessere Alternative gibt, dann sollte diese gewählt werden. Leider sieht es am deutschen Markt ziemlich mau aus. Mir fällt auf jeden Fall kein Buch ein, über das nicht geschimpft wird.
Antworten