Python rätselhaftes Verhalten ganz einfaches Beispiel

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
python71
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 11:15

ich habe eine xxx.py

Code: Alles auswählen

zins = '6,5A'
print(zins)
print(zins.replace(',','',1).isdigit())
while True:
    if zins.replace(',','',1).isdigit() == True:
        print('ok',zins)
        break
    else:
        zins = str(input('Nochmal Zins: '))

print('ende')
Starte ich diesen In Idle klappt es:

6,5A
False
Nochmal Zins: a
Nochmal Zins: b
Nochmal Zins: c
Nochmal Zins: 6,5
ok 6,5
ende

Starte ich die xxx.py mit doppelklick oder python xxx.py in der command bringt er

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Python32>python xxx.py
6,5A
False
Nochmal Zins: a
Nochmal Zins: b
Nochmal Zins: c
Nochmal Zins: 6,5
Nochmal Zins: ?
Nochmal Zins: ?
Nochmal Zins: uswusw
Nochmal Zins:

Hier behauptet Python, das zins.replace(',','',1).isdigit() False ist. Das ganze ist mir ein Rätsel.
Weiss jemand Rat?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> print(zins)
6,5A
>>> print(zins.replace(',', '', 1))
65A
>>> '65A'.isdigit()
False
>>> print(''.isdigit.__doc__)
S.isdigit() -> bool

Return True if all characters in S are digits
and there is at least one character in S, False otherwise.
Das sollte dich eigentlich nicht überraschen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ohne genau hingeschaut zu haben würde ich vermuten, dass dort noch ein newline am Ende des Strings hängt.

Außerdem musst du noch testen, ob

Code: Alles auswählen

zins.replace(',','',1).isdigit() == True
auch wirklich `True` ist:

Code: Alles auswählen

(((zins.replace(',','',1).isdigit() == True) == True) == True) == True
:twisted:

Vielleicht denkst du aber noch einmal darüber nach, ob ein "== True"-Vergleich überhaupt jemals Sinn macht ;-)

Sebastian
Das Leben ist wie ein Tennisball.
python71
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 11:15

@derdon und @EyDu

danke für euren Versuch , aber eure Antworten haben Null mit meiner Frage/Problemstellung zu tun.
BlackJack

@python71: Dann lass Dir `zins` doch mal als `repr()` beziehungsweise `ascii()`-Form ausgeben. Und auch das Ergebnis von dem `replace()`-Aufruf. Irgendwo muss da ja etwas enthalten sein, was Du so nicht siehst, oder erwartet hast.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

derdons Antwort und der erste Teil meiner Antwort haben sehr viel mit deinem Problem zu tun. Füge nach

Code: Alles auswählen

zins = str(input('Nochmal Zins: '))
mal die Zeilen

Code: Alles auswählen

print(repr(zins))
print(repr(zins.replace(',','',1)))
ein und poste mal das Ergebnis. Dort sollte irgendwo das Problem liegen.
Das Leben ist wie ein Tennisball.
Yaso
User
Beiträge: 30
Registriert: Freitag 1. April 2011, 08:00

Außerdem musst du noch testen, ob

Code:
zins.replace(',','',1).isdigit() == True


auch wirklich `True` ist:

Code:
(((zins.replace(',','',1).isdigit() == True) == True) == True) == True


:twisted:

Vielleicht denkst du aber noch einmal darüber nach, ob ein "== True"-Vergleich überhaupt jemals Sinn macht ;-)
Damit meint er, dass du hier zu oft auf den Wahrheitswert prüfst. Es reicht einfach:

Code: Alles auswählen

if zins.replace(',','',1).isdigit():
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Was vermutest du denn, was '42X'.isdigit() macht? Welcher Wert wird zurückgegeben und warum?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

derdon hat geschrieben:Was vermutest du denn, was '42X'.isdigit() macht? Welcher Wert wird zurückgegeben und warum?
Das Problem ist nicht die "6,5A", sondern das in den Zeilen darauf folgende "6,5". Letzteres funktioniert bei IDLE, jedoch nicht über die Konsole.
Das Leben ist wie ein Tennisball.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Oh, stimmt. Habe den Ausgangspost nicht genau genug gelesen.
python71
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 11:15

danke euch.

die Funktion repr(zins) hat mir nun aufgezeigt was zurück gegeben wurde bei input('zins')
nämlich '6,5\r'
und somit war der vergleich '6,5' = 6,5r' bullshit.

bye bye
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nur der Vollständigkeit halber ;-)
EyDu hat geschrieben:Ohne genau hingeschaut zu haben würde ich vermuten, dass dort noch ein newline am Ende des Strings hängt.
python71 hat geschrieben:danke für euren Versuch , aber eure Antworten haben Null mit meiner Frage/Problemstellung zu tun.
python71 hat geschrieben:die Funktion repr(zins) hat mir nun aufgezeigt was zurück gegeben wurde bei input('zins')
nämlich '6,5\r'
Das Leben ist wie ein Tennisball.
Antworten