Seite 1 von 1

Frage zu einem einfachen Programm / input-Funktion

Verfasst: Sonntag 23. November 2014, 12:16
von cYtec777
Hallo Gemeinde,
dies ist mein erster Post in diesem Forum. Ich arbeite gerade ein Beispiel aus einem Python Buch durch, welches ich mir neulich gekauft habe.
Leider scheitere ich gerade an dem folgenden Programm. Beim kompilieren erscheint der folgende Fehler:
Traceback (most recent call last):
File "/Users/Andi/Documents/Programmieren/ZahlenRaten.py", line 12, in <module>
if tipp < geheimnis:
TypeError: unorderable types: str() < int()
Warum ist dies der Fall? Erkennt input denn nicht, das hier eine Zahl eingelesen wird?

Vielen Dank für eure Hilfe.

Code: Alles auswählen

geheimnis = random.randint(1, 99)
tipp = 0
versuche = 0

while tipp != geheimnis and versuche < 6:
      tipp = input("Was rätst du? ")
      if tipp < geheimnis:
            print("Zu niedrig, du Landratte")
      elif tipp > geheimnis:
            print("Zu hoch, du Leichtmatrose")

      versuche = versuche + 1

if tipp == geheimnis:
      print("Ha! Du hast es! Hast mein Geheimnis erraten!")
else:
      print ("Alle Versuche verbraucht! Mehr Gück beim nächsten Mal!")
      print ("Die Geheimzahl war ", geheimnis)

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Sonntag 23. November 2014, 12:54
von snafu
Für ``input()`` (unter Python 3.x) ist jede Eingabe ein String. Da wird nichts von selbst interpretiert. Das muss man schon explizit in seinem Programmcode machen.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 08:38
von /me
cYtec777 hat geschrieben:Ich arbeite gerade ein Beispiel aus einem Python Buch durch, welches ich mir neulich gekauft habe.
Ein Buch das auf Python 2 aufbaut und trotzdem input() statt raw_input() für die Eingabe verwendet ist einfach kaputt.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 09:48
von CasualCoding.org
/me hat geschrieben:Ein Buch das auf Python 2 aufbaut und trotzdem input() statt raw_input() für die Eingabe verwendet ist einfach kaputt.
Ich sehe hier nichts, was auf Python 2 hinweist...?

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 10:44
von garreth
Hallo cYtec777,

dein Problem ist, dass input() eine Variable vom Typ Zeichenkette(String) ausgibt. Diesen vergleichst du dann mit einer Ganzzahl(Integer). Ist zwar in der Ausgabe für das menschliche Auge die gleiche Zahl, allerdings für den Computer zwei verschiedene Werte die er nicht vergleichen kann.

Du musst also deine Variable tipp in eine Ganzzahl(Integer) umwandeln. Dann sollte dein Beispiel funktionieren.

Code: Alles auswählen

tipp = int(input("Was rätst du? "))
Das Buch sollte "Hello World!: Programmieren für Kids und andere Anfänger" heißen und basiert auf Python 2.7.3.
Link zur Vorschau
Der Fehler passiert dem Author bevor er überhaupt die Datentypen erklärt, dass ist natürlich "etwas" unschön.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 11:09
von /me
CasualCoding.org hat geschrieben:Ich sehe hier nichts, was auf Python 2 hinweist...?
Wenn der gepostete Code derjenige ist, der angeblich laufen soll, dann kann er mit dieser Verwendung von input() nur unter Python 2 überhaupt jemals gelaufen sein.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 11:22
von /me
Der Unterschied bei Python 2 und Python 3 bezüglich input() ist die Art und Weise, wie die Eingabe interpretiert wird. Bei Python 3 erhältst du immer einen String. Bei Python 2 heißt die Funktion mit der identischen Funktionalität noch raw_input. input bei Python 2 hat ein implizites eval eingebaut und wertet somit den eingegebenen Ausdruck aus. Dort wird 3 dann direkt ein Integer-Wert. Strings bekommst du dort nur, wenn du explizit Anführungszeichen mit angibst ("Monty").

Das Problem bei Python 2 ist, dass du via input fast beliebigen Code in die Anwendung schleusen kannst. Das ist eine riesige Sicherheitslücke und die möchte man nicht haben (siehe auch Eval really is dangerous). Diese Gefährlichkeit war auch der Grund dafür, dass man input in der bisherigen Form in Python 3 entfernt hat.

Folgende Vorgehensweise ist daher bei der Umstellung von Python 2 auf Python 3 in diesem Kontext angeraten:
  1. Python 2 verwendet raw_input -> bei Python 3 auf input ändern
  2. Python 2 verwendet input -> Entsetzt die Hände über dem Kopf zusammenschlagen und bei Python 3 eine explizite Typkonvertierung vornehmen.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 12:29
von CasualCoding.org
/me hat geschrieben:Wenn der gepostete Code derjenige ist, der angeblich laufen soll, dann kann er mit dieser Verwendung von input() nur unter Python 2 überhaupt jemals gelaufen sein.
Das tut er aber doch gerade eben nicht. Python beschwert sich, dass der Inhalt der Variablen ein String ist. Ganz normales Python-3-Verhalten.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 13:14
von garreth
Na dann sollte man ihm vielleicht sagen, dass er versucht ein für Python 2 geschriebenes Programm auf einem Python 3 Interpreter laufen zu lassen und dass dieser nicht abwärtskompatibel ist.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 14:08
von Sirius3
Wenn das Python 2 sein soll, was sollen dann die Klammern um "print"?

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 14:33
von darktrym
Selbst das Deppenleerzeichen ist vorhanden.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 14:46
von /me
CasualCoding.org hat geschrieben:Das tut er aber doch gerade eben nicht. Python beschwert sich, dass der Inhalt der Variablen ein String ist. Ganz normales Python-3-Verhalten.
Exakt. Unter Python 2 läuft es (auch wenn die Klammern beim print zu viel sind) und unter Python 3 eben nicht.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 17:44
von Ene Uran
Oder Du kannst auch sowas tun:

Code: Alles auswählen

import random

# damit klappt string input() mit Python2 und Python3
try:  input = raw_input
except NameError:  pass

geheimnis = random.randint(1, 99)
tipp = 0
versuche = 0
 
while tipp != geheimnis and versuche < 6:
      tipp = int(input("Was rätst du? "))  # gebrauche int()
      if tipp < geheimnis:
            print("Zu niedrig, du Landratte")
      elif tipp > geheimnis:
            print("Zu hoch, du Leichtmatrose")
 
      versuche = versuche + 1
 
if tipp == geheimnis:
      print("Ha! Du hast es! Hast mein Geheimnis erraten!")
else:
      print ("Alle Versuche verbraucht! Mehr Glück beim nächsten Mal!")
      print ("Die Geheimzahl war ", geheimnis)
 
Python2 hatte ein paar Warzen und Python3 hat die weg gemacht.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 17:47
von BlackJack
Bleibt noch das Problem mit dem ``print`` — insbesondere das Letzte im Skript gibt unter Python 2 nicht das aus was man sich hier gewünscht oder erwartet hätte. Da fehlt also vielleicht noch ein ``from __future__ import print_function`` am Anfang des Moduls.

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Montag 24. November 2014, 19:33
von jens
Explizites int() verwenden benötigt dann aber noch ein try...except für den Fall das keine Zahl eingegeben wurde...

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Dienstag 25. November 2014, 08:28
von CasualCoding.org
jens hat geschrieben:Explizites int() verwenden benötigt dann aber noch ein try...except für den Fall das keine Zahl eingegeben wurde...
Das finde ich aber gerade schön, dass Python eine so einfache Mögllichkeit bietet. Versuch' mal, unter C++ (ohne Drittanbieter-Bibliotheken) eine robuste Eingabeüberprüfung für die Konsole zu basteln... :K

Re: Frage zu einem einfachen Programm / input-Funktion

Verfasst: Dienstag 25. November 2014, 10:12
von jerch
CasualCoding.org hat geschrieben:...
Das finde ich aber gerade schön, dass Python eine so einfache Mögllichkeit bietet. Versuch' mal, unter C++ (ohne Drittanbieter-Bibliotheken) eine robuste Eingabeüberprüfung für die Konsole zu basteln... :K
Für Integers geht das aber noch mit recht überschaubarem Aufwand, solange die Zahlen in die Typen passen. Für größere brauchts dann eine BigNum-Lib, bei Floats würde ich auf Regex + Bereichsprüfung gehen. Das batteries included-Konzept bei Python bringt halt die Konvertierfunktionen und den BigNum-Support gleich mit.