Hilfe beim Verstehen von Code

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
Fenrir
User
Beiträge: 13
Registriert: Sonntag 2. April 2017, 10:33

Hallo,
ich habe Probleme folgenen kleinen codeabschnitt zu verstehen:

Code: Alles auswählen

if not len(sys.argv[1:]):
		doSomething()
	else:
		somethingElse()	
		
ein if-statement benötigt ja irgendwie true oder false, aber wo ist das hier?
Es funktioniert zwar, aber ich verstehs einfach nicht.
len(sys.argv[1:]) liefert doch einen integer wert zurück und keinen boolean?
Wäre echt dankbar für Aufklärung :)

edit: btw: doSomething() wird ausgeführt, wenn nur der scriptname ausgeführt wird, somethingElse() wenn noch argumente dahinter stehen.
Zuletzt geändert von Anonymous am Donnerstag 10. August 2017, 14:36, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Astorek
User
Beiträge: 72
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Probiers doch einfach in der interaktiven Shell aus ;)

Code: Alles auswählen

>>> print(bool(0))
False
>>> print(bool(1))
True
Wahrscheinlich ist das historisch bedingt aus den Frühzeiten der Programmierung und übernimmt bis heute wohl jede Programmiersprache: Ein Rückgabewert von "Null" wird immer als "False" angegeben. Alles, was "Nicht Null" ist, wird stattdessen als "True" zurückgegeben...

Der Vollständigkeit halber: Einzige Ausnahme von der Regelung sind Strings; dort liefert nur ein leerer String False zurück:

Code: Alles auswählen

>>> print(bool(""))
False
>>> print(bool("0"))
True
>>> print(bool("xyz"))
True
Zuletzt geändert von Astorek am Donnerstag 10. August 2017, 14:38, insgesamt 1-mal geändert.
Fenrir
User
Beiträge: 13
Registriert: Sonntag 2. April 2017, 10:33

danke für die Antwort! Nach ein bisschen rumspielen kam raus, man benötigt nichtmal nen cast 0.o

Code: Alles auswählen

if 0:
	.....	
reicht schon in python :D
nochmal danke, jetzt check ichs!
BlackJack

@Astorek: Das ist historisch bedingt, also in der Geschichte von Python. Ich würde aber nicht sagen dass das generell so ist, denn es gibt durchaus Programmiersprachen die an solchen Stellen nur Wahrheitswerte akzeptieren und der Benutzer explizit dafür sorgen muss. Python hatte Anfangs keinen dedizierten Datentyp für Wahrheitswerte und hat von der Programmiersprache in der es implementiert wurde die Werte 0 und 1 beziehungsweise 0 und alle anderen Zahlen übernommen.

Mittlerweile gibt es den Datentyp `bool`, der aber von `int` abgeleitet ist und die Werte `True` und `False` entsprechen auch immer noch den Zahlenwerten 1 und 0:

Code: Alles auswählen

In [1]: issubclass(bool, int)
Out[1]: True

In [2]: isinstance(True, int)
Out[2]: True

In [3]: True + 0
Out[3]: 1

In [4]: False + 0
Out[4]: 0

In [5]: int(True), int(False)
Out[5]: (1, 0)
Zeichenketten sind übrigens keine Ausnahme: Jeder Datentyp kann selber festlegen welche seiner Werte im boole'schen Kontext wahr oder unwahr sind. Bei Sequenzen und Containertypen in der Standardbibliothek ist die leere Sequenz/der leere Container unwahr und alle anderen wahr. Das heisst man hätte im Beispiel nicht einmal das `len()` gebraucht:

Code: Alles auswählen

In [6]: import sys

In [7]: sys.argv[1:]
Out[7]: []

In [8]: not sys.argv[1:]
Out[8]: True

In [9]: not [42]
Out[9]: False

In [10]: [bool(x) for x in [[], {}, set()]]
Out[10]: [False, False, False]

In [11]: [bool(x) for x in [[23], {'answer': 42}, {4711}]]
Out[11]: [True, True, True]
Edit: Bei Shell-Programmierung ist es übrigens anders herum: Ein Rückgabecode 0 ist wahr während alle anderen Werte unwahr sind.
Fenrir
User
Beiträge: 13
Registriert: Sonntag 2. April 2017, 10:33

super Erklärung, danke dafür :)
Antworten