NameError: Wohl ein Anfängerfehler

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
doni

Montag 1. August 2005, 11:31

Hallo

ich bin 100% neu mit Python und bin gerade über ein Problem gestolpert als ich meine ersten Gehversuche machte:

der Code:

Code: Alles auswählen

name[0] = input("Bitte geben sie einen Namen ein:")
name[1] = input("Bitte geben sie noch einen Namen ein:")

x = name[0]

name[0] = name[1]
name[1] = x

print name
die Idee dahinter war, das zwei Namen eingegeben werden, diese in der Reihenfolge vertauscht werden und dann so ausgegeben werden. Nicht wirklich sinnvol und sicher einfacher zu machen, aber ist ja auch nur zum üben :)

Nun auf jeden Fall kann ich den ersten Namen eingeben, dann kommt aber immer eine Fehlermeldung, und zwar egal was ich eingebe:

Code: Alles auswählen

aaron@zoe:~/projects/testing$ python try1.py
Bitte geben sie einen Namen ein:
"2"
Traceback (most recent call last):
  File "try1.py", line 24, in ?
    name[0] = input()
NameError: name 'name' is not defined
Nun ich habe versucht raw_input stattdessen zu nehmen (haben sie in einem tutorial geschrieben), hat aber auch nix gebracht. Den Wert in Anführungzeichen einzugeben ist auch nix.

Nun ich hoffe jemand kann mir weiterhelfen :)

danke
doni

Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 1. August 2005, 11:38

Die Fehlermeldung sagt dir, dass es die Variable name nicht gibt, du musst sie zuerst erstellen.

Da ich aber ein Spielverderber bin hier mal mein Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

name = []
name.append(raw_input("Bitte geben sie einen Namen ein:"))
name.append(raw_input("Bitte geben sie noch einen Namen ein:"))

print name[::-1]
Erstmal kommt der Header, dann wird eine Liste name erstellt, daran wird der erste Name und dann der zweite Name angehängt und schließlich wird sie umgekehrtherum ausgegeben (das letzte Element zuerst).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
doni

Montag 1. August 2005, 11:47

vielen dank :D

den header hatte ich gar nicht drin *g*
muss der gesetzt sein?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 1. August 2005, 12:05

doni hat geschrieben:den header hatte ich gar nicht drin *g*
muss der gesetzt sein?
Der Header besteht wie du siehst aus zwei Zeilen, in der ersten Zeile ist das Shebang, das unter Unix benutzt werden kann um das Script mit ./scriptname.py zu starten und in der zweiten die -*- coding Zeile, die angibt in welchem Encoding die Datei ist. Letztere wird nur von neueren Python-versionen verwendet, aber ältere störts nicht und man kann es praktisch als guten Stil angehen, so einen Header zu schreiben. Schaden tut's ja nicht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Montag 1. August 2005, 12:15

Danke!

Nun ein weiteres Problem (gleicher Fehler, andere Ursache?)...

zuerst einmal der Code:

Code: Alles auswählen

# Namen vom Benutzer einlesen:
name = []
name.append(raw_input("Bitte geben sie einen Namen ein:"))
name.append(raw_input("Bitte geben sie noch einen Namen ein:"))

# Eingelese Namen an Funktion übergeben:
ausgabe = namen_vertauschen(name[0],name[1])

# Funktion zum vertauschen:
def namen_vertauschen(name1,name2):
	x = name1
	
	name1 = name2
	name2 = x

# ausgeben:
print ausgabe
Ich habe gedacht, ich möchte das ganze noch ein wenig modifizieren: Namen einlesen und an Funktion übergeben, welche für das Austauschen der Namen verantwortlich ist.

Nun der Fehler wieder gleich / ähnlich:

Code: Alles auswählen

aaron@zoe:~/projects/testing$ python try1.py
Bitte geben sie einen Namen ein:aaron
Bitte geben sie noch einen Namen ein:meder
Traceback (most recent call last):
  File "try1.py", line 49, in ?
    ausgabe = namen_vertauschen(name[0],name[1])
NameError: name 'namen_vertauschen' is not defined
Das verstehe ich jetzt wirklich nicht :) def steht ja für definieren, oder?!

Vielen Dank für eure Hilfe
doni

Edit (Leonidas): Wieder Code in Python-Tags gesetzt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 1. August 2005, 12:33

Das wird nicht funktionieren, da die Funktion namen_vertauschen() _nach_ ihrem Aufruf definiert wurde. Mit anderen Worten: du rufst eine Funktion auf, die es zu dem Zeitpunkt noch gar nicht gibt. Du musst die Funktion etwas weiter nach oben stellen. Das hat was damit zu tun dass der Python-Interpreter ein Single-Pass Interpreter ist, was aber meist nicht stört.

Warum vertauscht du die Variablen auf eine solchermaßen seltsame Weise? Das geht in Python viel einfacher ohne temproräre Variabel x:

Code: Alles auswählen

In [1]: sprache1 = 'Python'
In [2]: sprache2 = 'Ruby'
In [3]: sprache1, sprache2 = sprache2, sprache1
In [4]: sprache1, sprache2
Out[4]: ('Ruby', 'Python')
Und dann noch mein Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

def main():
    # Namen vom Benutzer einlesen:
    name = []
    name.append(raw_input("Bitte geben sie einen Namen ein:"))
    name.append(raw_input("Bitte geben sie noch einen Namen ein:"))

    # Eingelese Namen an Funktion übergeben:
    ausgabe = namen_vertauschen(name[0],name[1])
    print ausgabe 

def namen_vertauschen(name1, name2):
    """Funktion zum vertauschen"""
    return name2, name1

if __name__ == '__main__':
    main()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Dienstag 2. August 2005, 20:00

Zwei Variablen zu vertauschen ist in Python übrigens einfacher als irgendwo sonst:

Code: Alles auswählen

 
[GCC 3.3.2 20031022 (Red Hat Linux 3.3.2-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "erster"
>>> b = "zweiter"
>>> print a
erster
>>> print b
zweiter
>>> a,b = b,a
>>> print a
zweiter
>>> print b
erster
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 2. August 2005, 20:47

Hihi, fs111, was habe ich denn im ersten Abschnitt meines letzten Postins gezeigt? Okay.. es ist Aufgrund von IPython vielleicht etwas undeutlich geworden.
fs111 hat geschrieben:Zwei Variablen zu vertauschen ist in Python übrigens einfacher als irgendwo sonst:

Code: Alles auswählen

irb(main):001:0> a = 'a'
=> "a"
irb(main):002:0> b = 'b'
=> "b"
irb(main):003:0> a, b = b, a
=> ["b", "a"]
irb(main):004:0> a
=> "b"
irb(main):005:0> b
=> "a"
Naja, das wäre ein Beispiel, bei dem es exakt genauso in einer anderen Programmiersprache geht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten