Warum ist die Liste leer ?
ich will mich nicht streiten ...
in dem Artikel steht, wie Funktionen aufgebaut sind (Kopf, Körper), wie man sie benutzt. Des Weiteren wird erklärt, wofür Parameter/Argumente da sind und warum, und dass man diese (aber auch durch die jeweilige Funktion/Methode ermittelte Objekte/Werte/blablub) mittels return an andere Funktionen/Methoden weitergeben kann, damit sie im lokalen Namensraum dieser (zweiten/anderen) Funktion(en)/Methode(n) benutzt und wieder verwendet/verarbeitet werden können. Kein return bedeutet die Rückgabe von None, was bedeutet, dass es sich im Endeffekt um eine Prozedur und nicht um eine Funktion/Methode handelt.
ich rufe aber innerhalb einer Funktion/Methode andere Funktionen/Methoden (daher 'Sprungmarke') auf. Wie man das händelt steht in diesem Artikel nicht. Und natürlich fehlt mir als Anfänger z.T. das Verständnis bzw. habe ich als Anfänger nicht den Experten-Durchblick, WESHALB ich auf *konkrete* Beispiele angewiesen bin.
in dem Artikel steht, wie Funktionen aufgebaut sind (Kopf, Körper), wie man sie benutzt. Des Weiteren wird erklärt, wofür Parameter/Argumente da sind und warum, und dass man diese (aber auch durch die jeweilige Funktion/Methode ermittelte Objekte/Werte/blablub) mittels return an andere Funktionen/Methoden weitergeben kann, damit sie im lokalen Namensraum dieser (zweiten/anderen) Funktion(en)/Methode(n) benutzt und wieder verwendet/verarbeitet werden können. Kein return bedeutet die Rückgabe von None, was bedeutet, dass es sich im Endeffekt um eine Prozedur und nicht um eine Funktion/Methode handelt.
ich rufe aber innerhalb einer Funktion/Methode andere Funktionen/Methoden (daher 'Sprungmarke') auf. Wie man das händelt steht in diesem Artikel nicht. Und natürlich fehlt mir als Anfänger z.T. das Verständnis bzw. habe ich als Anfänger nicht den Experten-Durchblick, WESHALB ich auf *konkrete* Beispiele angewiesen bin.
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Nein, du bist nicht auf konkrete Beispiele angewiesen, sondern darauf, Dokumentation zu lesen und zu verstehen. Programmieren funktioniert nicht durch raten. Mal ganz angesehen davon, dass es ja Beispiele in dem Tutorial gibt.
Grundsätzliches Basiswissen, das jedes Tutorial vermittelt, sind Funktionen, Datenstrukturen, Exception-Handling. Das ist das Minimum, das man braucht um in Python effektiv etwas tun zu können.
Und return (das ist englisch für "zurückkehren") gibt nichts weiter, sondern zurück. Was auch in dem Link beschrieben ist.
Eine Funktion ist eben keine Sprungmarke, wie dir hier bereits gesagt wurde. Deshalb wird das da auch nicht behandelt. Man ruft eine Methode (ggf. mit Paramtern) und bekommt von dort ein Ergebnis zurück. Das sind Funktionen. Deshalb macht dein Aufruf von main() am Ende der Funktion keinen Sinn, weil der Programmfluss eh an die Stelle zurückkehrt. Im Gegenteil. Dort main() aufzurufen ist schlicht falsch, weil es eine unnötige Rekursion herbeiführt.
Grundsätzliches Basiswissen, das jedes Tutorial vermittelt, sind Funktionen, Datenstrukturen, Exception-Handling. Das ist das Minimum, das man braucht um in Python effektiv etwas tun zu können.
Und return (das ist englisch für "zurückkehren") gibt nichts weiter, sondern zurück. Was auch in dem Link beschrieben ist.
Eine Funktion ist eben keine Sprungmarke, wie dir hier bereits gesagt wurde. Deshalb wird das da auch nicht behandelt. Man ruft eine Methode (ggf. mit Paramtern) und bekommt von dort ein Ergebnis zurück. Das sind Funktionen. Deshalb macht dein Aufruf von main() am Ende der Funktion keinen Sinn, weil der Programmfluss eh an die Stelle zurückkehrt. Im Gegenteil. Dort main() aufzurufen ist schlicht falsch, weil es eine unnötige Rekursion herbeiführt.
@Perlchamp: Das Wort Sprungmarke habe ich zuletzt Anfang der 80er Jahre beim Erlernen von BASIC gelesen/benutzt.
Vergiss dieses MARKE: goto MARKE in Verbindung mit Python.
Wenn du dich davon nicht trennen kannst, kommst du gedanklich nicht aus der Sackgasse raus, in der du gerade bist.
Vergiss dieses MARKE: goto MARKE in Verbindung mit Python.
Wenn du dich davon nicht trennen kannst, kommst du gedanklich nicht aus der Sackgasse raus, in der du gerade bist.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@ThomasL: Zur Ergänzung: das ganze *nur* mit GOTOs zu Sprungmarken zu lösen wäre ja noch okay, aber Python hat quasi nur GOSUBs und das wäre auch in BASIC ein Problem/Fehler immer mit GOSUBs Sprungmarken anzuspringen aber nie ein RETURN zu verwenden.
@Perlchamp: Bei Deinem letzten (Pseudo-)Beispielcode musst Du nicht irgendwo ``return`` davor setzen sondern ganz einfach die `main()`-Aufrufe *sein lassen*. Du musst nicht etwas machen, was deswegen auch nicht im Tutorial gezeigt wird, sondern Du musst etwas *nicht machen*.
Mit dem `main()`-Aufruf springt man nicht einfach an den Anfang des Code in der `main()`-Funktion, sondern ruft die noch einmal von neuem auf, während sie bereits mindestens einmal läuft und dieser frühere Aufruf/diese früheren Aufrufe noch gar nicht zu ende abgearbeitet wurde(n). Was auch bedeutet, dass die Funktionen, welche von dort aufgerufen wurden auch noch gar nicht komplett abgearbeitet wurden. Du sammelst damit immer mehr aktive Funktionsaufrufe an. Die belegen Speicher für die lokalen Variablen und die Verwaltung des Programmablaufs. Speziell letzterer Speicher ist nicht nur/unbedingt in der Grösse beschränkt, sondern insbesondere auch durch das Rekursionslimit, also die Anzahl wie oft solcher Speicher angefordert aber nicht wieder freigegeben werden kann. Wenn das Limit erreicht wird, bricht Python einfach mit einer `RecursionError`-Ausnahme ab. Rekursion ist kein Ersatz für einfache Schleifen!
@Perlchamp: Bei Deinem letzten (Pseudo-)Beispielcode musst Du nicht irgendwo ``return`` davor setzen sondern ganz einfach die `main()`-Aufrufe *sein lassen*. Du musst nicht etwas machen, was deswegen auch nicht im Tutorial gezeigt wird, sondern Du musst etwas *nicht machen*.
Mit dem `main()`-Aufruf springt man nicht einfach an den Anfang des Code in der `main()`-Funktion, sondern ruft die noch einmal von neuem auf, während sie bereits mindestens einmal läuft und dieser frühere Aufruf/diese früheren Aufrufe noch gar nicht zu ende abgearbeitet wurde(n). Was auch bedeutet, dass die Funktionen, welche von dort aufgerufen wurden auch noch gar nicht komplett abgearbeitet wurden. Du sammelst damit immer mehr aktive Funktionsaufrufe an. Die belegen Speicher für die lokalen Variablen und die Verwaltung des Programmablaufs. Speziell letzterer Speicher ist nicht nur/unbedingt in der Grösse beschränkt, sondern insbesondere auch durch das Rekursionslimit, also die Anzahl wie oft solcher Speicher angefordert aber nicht wieder freigegeben werden kann. Wenn das Limit erreicht wird, bricht Python einfach mit einer `RecursionError`-Ausnahme ab. Rekursion ist kein Ersatz für einfache Schleifen!
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@ _blackjack_ :
ok, das verstehe ich ja. Wie bekomme ich denn aber dann eine Benutzerführung hin, also ein Menu für Benutzereingaben, das immer dann eingeblendet wird, wenn eine vorherige Aufgabe abgeschlossen ist ? Wenn ich nun folgenden Code habe :
, dann ist das Programm nach der Anzeige der Chartliste beendet, will ich aber nicht, hätte gerne wieder ein Auswahlmenu angezeigt !
hier der Inhalt von CHARTS_FILLENAME :
ok, das verstehe ich ja. Wie bekomme ich denn aber dann eine Benutzerführung hin, also ein Menu für Benutzereingaben, das immer dann eingeblendet wird, wenn eine vorherige Aufgabe abgeschlossen ist ? Wenn ich nun folgenden Code habe :
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Verwalten einer Chartliste
=> Unterverzeichnis 'data' anlegen
=> Unterverzeichnis 'tmp' anlegen """
__author__ = 'Perlchamp'
__date__ = '21.02.2019'
import pickle
CHARTS_FILENAME = 'data/charts.dmp'
BACKUP_FILENAME = 'tmp/charts.dmp'
MENUE_WIDTH = 30
SPALTE_TITEL = 35
SPALTE_INTERPRET = 36
SPALTE_STIMMEN = 11
CHART_ANZEIGE = 103
MENUE_ANZEIGE = 60
CHART_VORSCHUB_01 = ' ' *3
CHART_VORSCHUB_10 = ' ' *2
CHART_VORSCHUB_100 = ' ' *1
MENUE_VORSCHUB = ' ' *6
def chartliste_laden() :
try:
with open(CHARTS_FILENAME, 'rb') as file:
charts = pickle.load(file)
except (FileNotFoundError, EOFError):
print('leere Liste !')
charts = list()
return charts
def chartliste_anzeigen(charts, auswahl):
print('-' * (CHART_ANZEIGE))
print('chartliste'.upper().center(CHART_ANZEIGE))
print('-' * (CHART_ANZEIGE))
charts.sort(reverse=True)
for platz, (voting, titel, interpret) in enumerate(charts):
zeile_tabelle = f'{platz+1}: {titel:<{SPALTE_TITEL}} von: {interpret:<{SPALTE_INTERPRET}}{voting:>{SPALTE_STIMMEN}} Stimmen'
if platz < 9:
print(f'{CHART_VORSCHUB_01}' + zeile_tabelle)
elif platz < 99:
print(f'{CHART_VORSCHUB_10}' + zeile_tabelle)
else:
print(f'{CHART_VORSCHUB_100}' + zeile_tabelle)
print('-' * (CHART_ANZEIGE) + '\n\n')
def main():
print('-' * (MENUE_ANZEIGE))
print('MENUE'.center(MENUE_ANZEIGE))
print('-' * (MENUE_ANZEIGE))
print(f'{MENUE_VORSCHUB}(A)nzeige der kompletten Chartliste')
print(f'{MENUE_VORSCHUB}(E)nde des Chart-Managers')
print('-' * (MENUE_ANZEIGE) + '\n')
while True:
charts = chartliste_laden()
auswahl = input('Treffen Sie eine Auswahl : ').lower()
if auswahl == 'e':
print('Danke, dass Sie den Chart-Manager benutzt haben.')
break
elif auswahl == 'a':
chartliste_anzeigen(charts, auswahl)
else :
print('falsche Auswahl !')
return auswahl
if __name__ == '__main__' :
main()
hier der Inhalt von CHARTS_FILLENAME :
Code: Alles auswählen
€]q (K X you're crazyqX Guns 'n' Rosesq‡qK X you know i'll always love youqX Budgieq‡qK X you could be mineqX Guns 'n' Rosesq‡q K X where did you sleep last nightq
X Nirvanaq‡qK X what should be doneq
X
Uriah Heepq‡qK X welcome to the jungleqX Guns 'n' Rosesq‡qK X the real thingqX
Faith No Moreq‡qK X suicide is painlessqX Manic Street Preachersq‡qK X straight up and downqX The Brian Jonestown Massacreq‡qK X stairway to heavenqX Led Zeppelinq‡qK X schoolqX
Supertrampq ‡q!K X
paradise cityq"X Guns 'n' Rosesq#‡q$K X paradiseq%X Jeff Bealq&‡q'K X
november rainq(X Guns 'n' Rosesq)‡q*K X nobody's fault but mineq+X# Jimmy Page (feat. The Black Crowes)q,‡q-K X
no excusesq.X Alice In Chainsq/‡q0K X
nach Hauseq1X Seligq2‡q3K X
lucy bluesq4X
Uriah Heepq5‡q6K X lass mich reinq7X Seligq8‡q9K X kashmirq:X Led Zeppelinq;‡q<K X i need loveq=X Deep Purpleq>‡q?K X home sweet homeq@X
Mötley CrüeqA‡qBK X hocus pocusqCX FocusqD‡qEK X hells bellsqFX AC/DCqG‡qHK X ghostqIX Slash (feat. Ian Astbury)qJ‡qKK X fly awayqLX
Lenny KravitzqM‡qNK X fight the good fightqOX TriumphqP‡qQK X
enter sandmanqRX MetallicaqS‡qTK X civil warqUX Guns 'n' RosesqV‡qWK X
can't you seeqXX The Marshall Tucker BandqY‡qZK X breadfanq[X Budgieq\‡q]K X beautiful dangerousq^X Slash (feat. Fergie)q_‡q`K X
back in blackqaX AC/DCqb‡qcK X back from caliqdX Slash (feat. Myles Kennedy)qe‡qfK X back and forth againqgX Slashqh‡qiK X at lastqjX
Etta Jamesqk‡qlK X assassingqmX Marillionqn‡qoK X amazingqpX Aerosmithqq‡qrK X
after darkqsX Tito & Tarantulaqt‡quK X Tage wie dieseqvX Die Toten Hosenqw‡qxK X SuperboyqyX Nina Hagen Bandqz‡q{K X Schrei nach Liebeq|X
Die Ärzteq}‡q~K X Arsch einer GöttinqX Seligq€‡qe.
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Ich habe das mal in QBasic von MS-DOS ausprobiert wie weit man da mit GOSUBs ohne RETURNs kommt:
Das bricht mit einer „Out of stack space“-Meldung ab und kommt mit der Ausgabe bis 506. Ohne die erste Zeile mit der man explizit angibt wie viele Bytes für den Stack reserviert werden, kommt es nur bis 317. Die Voreinstellung liegt irgendwo bei 1200 Bytes.
Wenn man es richtig macht, läuft es bis `i%` das Ende des Wertebereichs von INTEGER erreicht hat, also 32767:
Code: Alles auswählen
CLEAR , , 2000
i% = 0
Main:
GOSUB Test
Test:
i% = i% + 1
PRINT i%
GOTO Main
Wenn man es richtig macht, läuft es bis `i%` das Ende des Wertebereichs von INTEGER erreicht hat, also 32767:
Code: Alles auswählen
CLEAR , , 2000
i% = 0
Main:
DO
GOSUB Test
LOOP
Test:
i% = i% + 1
PRINT i%
RETURN
Zuletzt geändert von __blackjack__ am Freitag 22. Februar 2019, 19:36, insgesamt 1-mal geändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@Perlchamp: Was sollen wir denn mit dem rauskopierten Inhalt einer Binärdatei?! Dass die das überlebt ist fraglich - und es speichert sich doch keiner weg um das auszuprobieren.
"Kleinstes lauffähiges Beispiel". Damit geht man Fragestellungen an.
Was denkst du denn, was die letzte Zeile in main() macht? Und wie die sich auf den Programmfluss auswirkt?
"Kleinstes lauffähiges Beispiel". Damit geht man Fragestellungen an.
Was denkst du denn, was die letzte Zeile in main() macht? Und wie die sich auf den Programmfluss auswirkt?
@ Sparrow:
Und ich denke einmal - ich habe als Anfänger nicht diesen Weitblick - dass main() am Ende nie (!) etwas returnen sollte.
Und da "while True" in "def main()" direkt vor der input()-Anweisung steht, geht's dort auch wieder weiter.
Und wenn ich jetzt noch das *while True:* in "def main() " an den Anfang setze, dann kommt natürlich auch wieder das Benutzermenue nach der "Abarbeitung" - bitte hängt euch nicht an meinen (falschen) Begrifflichkeiten auf, einfach korrigieren, dann weiß ich Bescheid - zum Vorschein.
Hier wieder der aktuelle Code:
Und dazu meine nächste Frage:
chartliste_anzeigen(charts, auswahl): ist ja eine Prozedur (kein return), die demzufolge None zurückgibt, da kein *return* vorhanden ist. Warum "blendet" sich das Benutzermenu ein, obwohl die erste Zeile von main() jetzt eine "while True:"-Schleife hat?
Bei None sollte doch *while True* nicht reagieren, oder sehe ich das falsch (reagiert while True nur z.b. auf einen leeren String [beispielsweise auf ENTER-Taste ohne Eingabe], auf die Auswertung eines Ausdrucks, der FALSE ergibt oder Vergleichbares? Gehört None demnach nicht darunter ?
Die Lieder irgendwo runterladen und anhören. Sind alle must-have's. NEIN SCHERZ, sorry.Was sollen wir denn mit dem rauskopierten Inhalt einer Binärdatei?
Sehr gute Frage, danke. nun, so wie ich das sehe, ist diese Zeile (return auswahl) völlig sinnfrei und nutzlos, danke nochmals. Das bringt mich einen Schritt weiter !Was denkst du denn, was die letzte Zeile in main() macht? Und wie die sich auf den Programmfluss auswirkt?
Und ich denke einmal - ich habe als Anfänger nicht diesen Weitblick - dass main() am Ende nie (!) etwas returnen sollte.
Und da "while True" in "def main()" direkt vor der input()-Anweisung steht, geht's dort auch wieder weiter.
Und wenn ich jetzt noch das *while True:* in "def main() " an den Anfang setze, dann kommt natürlich auch wieder das Benutzermenue nach der "Abarbeitung" - bitte hängt euch nicht an meinen (falschen) Begrifflichkeiten auf, einfach korrigieren, dann weiß ich Bescheid - zum Vorschein.
Hier wieder der aktuelle Code:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Verwalten einer Chartliste
=> Unterverzeichnis 'data' anlegen
=> Unterverzeichnis 'tmp' anlegen """
__author__ = 'Perlchamp'
__date__ = '21.02.2019'
import pickle
CHARTS_FILENAME = 'data/charts.dmp'
BACKUP_FILENAME = 'tmp/charts.dmp'
MENUE_WIDTH = 30
SPALTE_TITEL = 35
SPALTE_INTERPRET = 36
SPALTE_STIMMEN = 11
CHART_ANZEIGE = 103
MENUE_ANZEIGE = 60
CHART_VORSCHUB_01 = ' ' *3
CHART_VORSCHUB_10 = ' ' *2
CHART_VORSCHUB_100 = ' ' *1
MENUE_VORSCHUB = ' ' *6
def chartliste_laden() :
try:
with open(CHARTS_FILENAME, 'rb') as file:
charts = pickle.load(file)
except (FileNotFoundError, EOFError):
print('leere Liste !')
charts = list()
return charts
def chartliste_anzeigen(charts, auswahl):
print('-' * (CHART_ANZEIGE))
print('chartliste'.upper().center(CHART_ANZEIGE))
print('-' * (CHART_ANZEIGE))
charts.sort(reverse=True)
for platz, (voting, titel, interpret) in enumerate(charts):
zeile_tabelle = f'{platz+1}: {titel:<{SPALTE_TITEL}} von: {interpret:<{SPALTE_INTERPRET}}{voting:>{SPALTE_STIMMEN}} Stimmen'
if platz < 9:
print(f'{CHART_VORSCHUB_01}' + zeile_tabelle)
elif platz < 99:
print(f'{CHART_VORSCHUB_10}' + zeile_tabelle)
else:
print(f'{CHART_VORSCHUB_100}' + zeile_tabelle)
print('-' * (CHART_ANZEIGE) + '\n\n')
def main():
while True:
print('-' * (MENUE_ANZEIGE))
print('MENUE'.center(MENUE_ANZEIGE))
print('-' * (MENUE_ANZEIGE))
print(f'{MENUE_VORSCHUB}(A)nzeige der kompletten Chartliste')
print(f'{MENUE_VORSCHUB}(E)nde des Chart-Managers')
print('-' * (MENUE_ANZEIGE) + '\n')
charts = chartliste_laden()
auswahl = input('Treffen Sie eine Auswahl : ').lower()
if auswahl == 'e':
print('Danke, dass Sie den Chart-Manager benutzt haben.')
break
elif auswahl == 'a':
chartliste_anzeigen(charts, auswahl)
else :
print('falsche Auswahl !')
if __name__ == '__main__' :
main()
chartliste_anzeigen(charts, auswahl): ist ja eine Prozedur (kein return), die demzufolge None zurückgibt, da kein *return* vorhanden ist. Warum "blendet" sich das Benutzermenu ein, obwohl die erste Zeile von main() jetzt eine "while True:"-Schleife hat?
Bei None sollte doch *while True* nicht reagieren, oder sehe ich das falsch (reagiert while True nur z.b. auf einen leeren String [beispielsweise auf ENTER-Taste ohne Eingabe], auf die Auswertung eines Ausdrucks, der FALSE ergibt oder Vergleichbares? Gehört None demnach nicht darunter ?
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
@ sparrow:
ich weiß jetzt nicht, ob ich das richtig formuliere:
ist
(prinzipiell) das Gleiche wie
in Bezug auf den Rückgabewert. Eine Funktion/Methode ohne *return* ist ja eine Prozedur, die python-intern ein *None* zurückgibt.
ich weiß jetzt nicht, ob ich das richtig formuliere:
ist
Code: Alles auswählen
def fkt_1(string):
print(string)
Code: Alles auswählen
def fkt_1(string):
print(string)
return None
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Ja. Eine Methode ohne return gibt None zurück.
Wenn man eine Prozedur daran festmacht, dass sie nichts zurückgibt, gibt es in Python keine Prozeduren, denn es wird _immer_ etwas zurückgegeben. Auch "None" ist eine Rückgabe, die man an einen Namen binden kann.
Man spricht immer von Methoden.
Wenn man eine Prozedur daran festmacht, dass sie nichts zurückgibt, gibt es in Python keine Prozeduren, denn es wird _immer_ etwas zurückgegeben. Auch "None" ist eine Rückgabe, die man an einen Namen binden kann.
Man spricht immer von Methoden.
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@sparrow: Also ich spreche bei Funktionen schon von Funktionen und nicht von Methoden. Eher umgekehrt: Manchmal spreche ich von Funktionen, zum Beispiel im Zusammenhang mit Rückruffunktionen die man irgendwo als Argument übergeben kann, und dabei meine ich natürlich nicht nur Funktionen, sondern auch Methoden, oder ganz allgemein jegliche aufrufbare Objekte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Oh, und auch Funktionen die explizit etwas zurückgeben können trotzdem keine ”echten/reinen Funktionen” sein, wenn sie zusätzlich noch Seiteneffekte haben. Um die Sache in diese Richtung auch noch mal zu verwirren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ok, danke, habe ich ja verstanden...
wenn ich nun
schreibe, dann bekomme ich eine Endlosschleife. WARUM ?
Python sagt doch:
meine Frage:
__main__ ist ja sozusagen "abgearbeitet" (letzte Zeile ist ausgeführt). Durch *while True* 'sitzt' es aber in einer Schleife fest, und sollte(?), da beispielsweise kein *break* oder kein anderer nachfolgender Code vorhanden ist, wieder von Vorne (Code, erste Zeile) anfangen, oder ?.
Aber es (__main__) bekommt doch von *fkt_1* ein *None* zurück. warum dann die Endlosschleife ?
Ich rufe doch über __main__ die Funktion *fkt_1* auf, die den (internen) Rückgabewert *None* liefert !
wenn ich stattdessen
bekomme ich einen Error, der mir auch bewußt ist:
ich hoffe, ich konnte mich gut genug ausdücken.
warum bekomme ich eine Endlosschleife mit folgendem Code ?
wenn ich nun
Code: Alles auswählen
#!/usr/bin/env python3
def fkt_1(string):
print(string)
if __name__ == '__main__':
while True:
fkt_1('hallo')
Python sagt doch:
Code: Alles auswählen
>>> True is None
False
>>> True == None
False
>>>
__main__ ist ja sozusagen "abgearbeitet" (letzte Zeile ist ausgeführt). Durch *while True* 'sitzt' es aber in einer Schleife fest, und sollte(?), da beispielsweise kein *break* oder kein anderer nachfolgender Code vorhanden ist, wieder von Vorne (Code, erste Zeile) anfangen, oder ?.
Aber es (__main__) bekommt doch von *fkt_1* ein *None* zurück. warum dann die Endlosschleife ?
Ich rufe doch über __main__ die Funktion *fkt_1* auf, die den (internen) Rückgabewert *None* liefert !
wenn ich stattdessen
Code: Alles auswählen
#!/usr/bin/env python3
def fkt_1(string):
print(string)
string = None
if __name__ == '__main__':
while string:
fkt_1('hallo')
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Program Files\Python37\scripts\vorlage_neu.py", line 8, in <module>
while string:
NameError: name 'string' is not defined
warum bekomme ich eine Endlosschleife mit folgendem Code ?
Code: Alles auswählen
#!/usr/bin/env python3
def fkt_1(string):
print(string)
return None
if __name__ == '__main__':
while True:
fkt_1('hallo')
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
@ _blackjack_ :
damit verwirrst du mich nicht im geringesten. DAS verstehe ich sogar sehr gut !
damit verwirrst du mich nicht im geringesten. DAS verstehe ich sogar sehr gut !
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Perlchamp: Warum solltest Du bei ``while True:`` *keine* Endlosschleife bekommen? Genau so schreibt man doch eine Endlosschleife. Und solange *im* Schleifenkörper nichts steht was selbigen verlassen könnte, rennt die endlos. Der Schleifenkörper wird immer wieder ausgeführt solange der Ausdruck zwischen ``while`` und dem ``:`` ”wahr” ist. Und da steht `True`. Also ”wahr”. `True` ist immer ”wahr”, per Definition, das ändert sich *nie*, also wird der Schleifenkörper *immer* ausgeführt.
Was irgendwelche Funktionen im Schleifenkörper als Rückgabewert haben, hat keinen Einfluss auf den Wahrheitsgehalt von `True`. Aus der Schleife kommt man nur mit ``break``, oder innerhalb von Funktionen/Methoden mit ``return``, und natürlich mit Ausnahmen heraus.
Was irgendwelche Funktionen im Schleifenkörper als Rückgabewert haben, hat keinen Einfluss auf den Wahrheitsgehalt von `True`. Aus der Schleife kommt man nur mit ``break``, oder innerhalb von Funktionen/Methoden mit ``return``, und natürlich mit Ausnahmen heraus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@ _blackjack_ :
ich habe dadurch wieder einen Schritt nach vorne gemacht, danke !
EDIT:
und ich dacht die ganze Zeit, dass der Rückgabewert dies beeinflussen würde ...
EDIT 2
bezugnehmend auf mein Chart-Script würde dies dann doch auch bedeuten, dass ich, um ein Benutzermenue nach jeder Funktion/Methode wieder "erscheinen" lassen zu können, dies *nur* durch den Aufruf der Funktion "Zeige Benutzermenu an" bewerkstelligen kann, da man Code ja nicht wiederholen und somit in einer Funktion/Methode *auslagern*(?) sollte ...
ich habe dadurch wieder einen Schritt nach vorne gemacht, danke !
EDIT:
und ich dacht die ganze Zeit, dass der Rückgabewert dies beeinflussen würde ...
EDIT 2
bezugnehmend auf mein Chart-Script würde dies dann doch auch bedeuten, dass ich, um ein Benutzermenue nach jeder Funktion/Methode wieder "erscheinen" lassen zu können, dies *nur* durch den Aufruf der Funktion "Zeige Benutzermenu an" bewerkstelligen kann, da man Code ja nicht wiederholen und somit in einer Funktion/Methode *auslagern*(?) sollte ...
wer lesen kann ist klar im Vorteil
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Perlchamp: EDIT 2 verstehe ich nicht so ganz. Das sollte doch jetzt so funktionieren, und ich sehe auch keine Codewiederholung im Quelltext die man beseitigen müsste‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman