if name ==

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.
Saphareas
User
Beiträge: 6
Registriert: Freitag 11. November 2011, 20:16

Hallo,
ich bin neu beim programmieren in Python und auch in diesem Forum.
Ich habe folgendes Problem. Ich habe mir ein Anfängerprogramm geschrieben:

Code: Alles auswählen

# -*- coding: cp1252 -*-
name = input("Guten Tag. Mein Name ist DoS. Wie heißen Sie? (Bitte Vor- und Nachnamen eingeben)")
if name == "Name1":
    print ("Name1.")
    feeling = input("Wie geht's dir?")
if feeling == "gut":
    print ("Das freut mich.")
    bye = input("Schüssikofski.")    
else:
        print ("Schade. Naja, da kann man nichts machen.")
        bye = input("Schüssikofski.")
name = input("Guten Tag. Mein Name ist DoS. Wie heißen Sie? (Bitte Vor- und Nachnamen eingeben)")
if name == "Name2":
    print ("Guten Tag Herr Name2. Gut, dass ich Sie sehe.")
    task = input("Haben sie ihre Aufgabenliste schon abgearbeitet?")
if task == "ja":
    print ("Gut gemacht. Sie haben sich ein oder zwei Bier wirklich verdient.")
if task == "nein":
    print ("Vielleicht hilft Ihnen ein Bier zur motivation.")
bye2 = input("Auf Wiedersehen.")
. Nun möchte ich, dass entweder die Floskel für Name1 (Umgangssprache) oder für Name2 (Formell) eingeblendet wird. Name1 funktioniert. Bei Name2 wird aber die Console(CMD) geschlossen.
Wie schaffe ich es, dass das Programm DIE BEIDEN Namen annimmt, nicht nur einen, nicht mehr? :K
Rechtschreibfehler unterliegen meinem Copyright.
BlackJack

@Saphareas: Führe das mal in einer Konsole/DOS-Eingabeaufforderung aus, dann siehst Du auch die Fehlermeldung.
Saphareas
User
Beiträge: 6
Registriert: Freitag 11. November 2011, 20:16

Aha. Danke. Jetzt bin ich schon mal einen Schritt weiter bzw. CMD spuckt einen Fehler aus:
File "Pfad der Datei", line 6, in <module> if feelung == "gut":
NameError: name 'feeling' is not defined

Und das sagt mir jetzt bitteschön was?
Rechtschreibfehler unterliegen meinem Copyright.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das sagt Dir, das Python mit dem Bezeichner 'feeling' nix anfangen kann.

Tipp: Lauf doch mal Deinen Code von oben her ab, dann merkst Du wo und warum es klemmt.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Saphareas: Welchen Wert hat deiner Meinung nach feeling, wenn name != "Name1"?
In specifications, Murphy's Law supersedes Ohm's.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Kann es sein dass du Python 2.x benutzt?
Aufgrund dessen dass du print als Funktion benutzt hätte ich auf 3.x geschätzt aber für mich sieht es danach aus als würde input versuchen das eingegebene zu interpretieren.
Versuche es mal mit "raw_input" anstatt "input"

In meinem installierten python 2.7 kann ich print sowohl als Statement als auch als Funktion benutzten.
BlackJack

@JonasR: Wo siehst Du den einen Hinweis dafür? Wenn es ein Python 2.x `input()` wäre und der TE irgendetwas eingeben würde was interpretiert wird, dann wäre ein Hinweis wenn das `input()` einen `NameError` oder einen `SyntaxError` auslöst. Das passiert aber nicht. Es sieht einfach nach einem Problem mit dem Verständnis vom Programmablauf aus, wann welche Namen an Werte gebunden werden.

Zu ``print`` in 2.7 sollte man vielleicht noch dazu sagen, dass innerhalb eines Moduls entweder nur das eine oder nur das andere möglich ist, und dass man für ``print`` als Funktion einen `__future__`-Import machen muss.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Code: Alles auswählen

>>> input()
test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'test' is not defined
Und man muss keinen `__future__`-Import machen. Klappt bei mir ohne alles ;)

edit:

Code: Alles auswählen

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print ("test")
test
BlackJack

@JonasR: Ja und da bekommst Du von dem `input()` einen `NameError`. Das ist aber nicht das Problem welches der TE gezeigt hat. Bei ihm gab es kein Problem mit dem `input()` sondern eines bei einem Vergleich der *danach* gemacht wurde und der offensichtlich einen Namen verwendet der nicht in jedem Fall auch tatsächlich vorher definiert wird.

Du verwendest nicht die `print()`-Funktion, sondern immer noch die ``print``-Anweisung. Nur weil Du überflüssige Klammern um den Ausdruck für die Anweisung setzt, wird ``print`` dadurch nicht auf magische Weise zu einer Funktion. Wenn es eine Funktion wäre, könnt man sie auch mit mehreren Argumenten aufrufen, dem Namen etwas zuweisen, oder die Funktion als Argument an andere Funktionen übergeben. Das geht alles mit der Anweisung nicht:

Code: Alles auswählen

Python 2.7.1 (r271:86832, Apr  8 2011, 17:52:17)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print ('test', 42)
('test', 42)
>>> print = my_print
  File "<stdin>", line 1
    print = my_print
          ^
SyntaxError: invalid syntax
>>> id(print)
  File "<stdin>", line 1
    id(print)
           ^
SyntaxError: invalid syntax
>>> from __future__ import print_function
>>> print ('test', 42)
test 42
>>> print = 42
>>> id(print)
152358596
>>>
Man benötigt den `__future__`-Import also zwingend um aus der Anweisung tatsächlich eine Funktion zu machen.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

@Blackjack Jetzt wo ich den Quelltext genauer betrachte sehe ich das Problem auch :D
Zu dem print: es hat sich halt erst einmal wie eine Funktion angefühlt... Naja wieder was gelernt =)
Denke an meinen analytischen Fähigkeiten muss ich noch üben :P
Saphareas
User
Beiträge: 6
Registriert: Freitag 11. November 2011, 20:16

So. Lange keine Zeit gehabt. Dann hier nachgeschaut. Tipps befolgt. Prog umgeschrieben. Klappt alles. Nun aber noch DAS:

Wie drücke ich es aus, wenn ich zwei Namen habe, der eine wird eingegeben: Text1 wird gelistet|der andere wird eingegeben: text2 erscheint, aber bei fremden Namen(egal welchen) soll text3 erscheinen. bei mir wird text3 trotzdem immer ganz am ende von text1/text2 angezeigt.

Code: Alles auswählen

# -*- coding: cp1252 -*-
name = input("Guten Tag. Mein Name ist DoS. Wie heißen Sie? (Bitte Vor- und Nachnamen angeben)")
if name == "name1":
            print ("Hallo name1.")
            feeling = input("text1.1")
            if feeling == "antwort1.":
                     print ("text1.2")
                     bye = input("antwort1.1")
            else:
                     print ("text1.3")
                     bye = input("antwort1.2")
if name == "name2":
            print ("Guten Tag Herr name2.")
            task = input("text2.1")
            if task == "ja":
                     print ("text2.2")
                     bye = input("Auf Wiedersehen.")
            else:
                     print ("text2.3")
                     bye = input("Auf Wiedersehen Herr name2.")
if name != "name1" or "name2":
    know = input("text3")
Das Ergebnis aber sieht immer so aus:
Guten Tag. Mein Name ist... name1
texte/antworten1
text3

bzw.:
Guten Tag. Mein Name ist... name2
texte/antworten2
text3
Rechtschreibfehler unterliegen meinem Copyright.
Benutzeravatar
MikeDee
User
Beiträge: 31
Registriert: Samstag 5. November 2011, 12:41

BlackJack hat geschrieben:Du verwendest nicht die `print()`-Funktion, sondern immer noch die ``print``-Anweisung. Nur weil Du überflüssige Klammern um den Ausdruck für die Anweisung setzt, wird ``print`` dadurch nicht auf magische Weise zu einer Funktion. Wenn es eine Funktion wäre, könnt man sie auch mit mehreren Argumenten aufrufen, dem Namen etwas zuweisen, oder die Funktion als Argument an andere Funktionen übergeben. Das geht alles mit der Anweisung nicht:
Korrigiere mich wenn ich falsch liege, kenne mich mit der Semantik noch nicht so aus, aber man kann doch print() mehrer Argumente aufrufen/übergeben/whatever?
print("text", sep=Seperator/Trennungszeichen, end=Zeilenende)
BlackJack

@MikeDee: Damit liegst Du richtig. Genau das habe ich doch gesagt. Wenn es eine Funktion wäre — und das ist es in Python 2.x ohne den `__future__`-Import nicht — dann kann man das machen.
Benutzeravatar
MikeDee
User
Beiträge: 31
Registriert: Samstag 5. November 2011, 12:41

BlackJack hat geschrieben:@MikeDee: Damit liegst Du richtig. Genau das habe ich doch gesagt. Wenn es eine Funktion wäre — und das ist es in Python 2.x ohne den `__future__`-Import nicht — dann kann man das machen.
Ach so, du meinst er/sie benutzt Python 2.x schreibt aber print() statt print, dann wird mir's klar.
Saphareas
User
Beiträge: 6
Registriert: Freitag 11. November 2011, 20:16

Könnte mir bitte jemand erklären warum das nicht funktioniert?:

Code: Alles auswählen

# -*- coding: cp1252 -*-
name = input("Guten Tag. Mein Name ist DoS. Wie heißen Sie? (Bitte Vor- und Nachnamen angeben): ")
if name == "Name1":
            print ("Hallo name1.")
            feeling = input("Wie geht's dir denn heute?")
            if feeling == "gut":
                     print ("Schon das zu hören.")
                     bye = input("Schüssikofski! ;~D")
            else:
                     print ("Schade. Naja, da kann man nichts machen.")
                     bye = input("Schüssikofski! Und Kopf hoch. ;~D")
if name == "name2":
            print ("Guten Tag Herr name2.")
            task = input("Haben sie schon ihre heutige Aufgabenliste abgearbeitet?")
            if task == "ja":
                     print ("Sehr gut. Sie haben sich den Feierabend verdient.")
                     bye = input("Auf Wiedersehen.")
            else:
                     print ("Wirklich nicht?\nVieleicht hilft ihenen eine Pause zur motivation.\nSie verstehen, was ich meine?\nIch frage später noch einmal nach.\nBis dahin sollten Sie alles erledigt haben.\n")
                     bye = input("Auf Wiedersehen Herr name2.")
while name != ["name1", "name2"]:
    print ("Ich kenne sie nicht. Der Zugang wird gesperrt.")
    name = input("Wie heißen Sie? (Bitte Vor- und Nachnamen angeben): ")
Nach dem man bei bye = input("...") nur Enter oder Return gedrückt hat, sollte sich das programm eigendlich beenden. Stattdessen wird

Code: Alles auswählen

while name != ["name1", "name2"]:
    print ("Ich kenne sie nicht. Der Zugang wird gesperrt.")
    name = input("Wie heißen Sie? (Bitte Vor- und Nachnamen angeben): ")
angezeigt.
Zuletzt geändert von Saphareas am Dienstag 15. November 2011, 19:19, insgesamt 1-mal geändert.
Rechtschreibfehler unterliegen meinem Copyright.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Saphareas hat geschrieben:PS: Nach dem man bei bye = input("...") nur Enter oder Return gedrückt hat, sollte sich das programm eigendlich beenden. Stattdessen wird

Code: Alles auswählen

while name != ["name1", "name2"]:
    print ("Ich kenne sie nicht. Der Zugang wird gesperrt.")
    name = input("Wie heißen Sie? (Bitte Vor- und Nachnamen angeben): ")
angezeigt.
Angezeigt? Nicht ausgeführt?
Was glaubst du denn, was bei dem name != ["name1", "name2"] miteinander verglichen wird?
Saphareas
User
Beiträge: 6
Registriert: Freitag 11. November 2011, 20:16

/me hat geschrieben:
Saphareas hat geschrieben:PS: Nach dem man bei bye = input("...") nur Enter oder Return gedrückt hat, sollte sich das programm eigendlich beenden. Stattdessen wird

Code: Alles auswählen

while name != ["name1", "name2"]:
    print ("Ich kenne sie nicht. Der Zugang wird gesperrt.")
    name = input("Wie heißen Sie? (Bitte Vor- und Nachnamen angeben): ")
angezeigt.
Angezeigt? Nicht ausgeführt?
Was glaubst du denn, was bei dem name != ["name1", "name2"] miteinander verglichen wird?
Ersteinaml habe keine Ahnung, was verglichen wird. Ich bin noch nicht so lange mit Python dabei.
Und dann wird der text halt angezeigt und wenn man dann enter drückt, wird der "ich kenne sie nicht. ..." text angezeigt. Aber eigentlich sollte sich das Teil nach der Enter-Eingabe beendet werden.
Rechtschreibfehler unterliegen meinem Copyright.
lunar

@Saphareas: Wenn Du nicht verstehst, was dort verglichen wird, dann lies bitte das Tutorial in der Python-Dokumentation, so dass Du verstehst, wie Vergleiche funktionieren und was Datentypen sind.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Saphareas hat geschrieben:Ersteinaml habe keine Ahnung, was verglichen wird. Ich bin noch nicht so lange mit Python dabei.
Du musst doch irgendwie auf diese Syntax gekommen sein.

Computer sind penibel bei der Ausführung von Programmen. Sie tun das was man ihnen sagt, nicht das, was man vielleicht gemeint hat. Geh einfach das Tutorial weiter durch. Du wirst schon noch an die Stelle kommen an der erklärt wird wie man mit Listen umgeht.
Saphareas
User
Beiträge: 6
Registriert: Freitag 11. November 2011, 20:16

Danke /me,
ich hab einfach (!=) durch (in) ersetzt. Irgendwie auch logisch :oops:
Naja eine Frage bleibt: wie definiere ich

Code: Alles auswählen

if name == "Name1":
                  print ("Hallo Name1.")
                  feeling = input("Wie geht's dir denn heute?")
                  if feeling in("gut", "schön", "toll", "super"):
                           print ("Schon das zu hören.")
                           bye = input("Schüssikofski! ;~D")
                           if feeling in("schlecht", "nicht gut", "nicht so gut", "scheiße", "übel"):
                                    print ("Schade. Naja, da kann man nichts machen.")
                                    bye = input("Schüssikofski! Und Kopf hoch. ;~D")
als Funktion?? :K
Rechtschreibfehler unterliegen meinem Copyright.
Antworten