Warum ist die Liste leer ?

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.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

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.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

@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.
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
Benutzeravatar
__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!
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _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 :

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()

, 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 :

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€‡qe.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__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:

Code: Alles auswählen

CLEAR , , 2000
i% = 0

Main:
  GOSUB Test

Test:
  i% = i% + 1
  PRINT i%
  GOTO Main
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:
  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
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _blackjack_ :
ja, das verstehe ich auch ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@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?
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ Sparrow:
Was sollen wir denn mit dem rauskopierten Inhalt einer Binärdatei?
Die Lieder irgendwo runterladen und anhören. Sind alle must-have's. NEIN SCHERZ, sorry.
Was denkst du denn, was die letzte Zeile in main() macht? Und wie die sich auf den Programmfluss auswirkt?
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 !
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()

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 ?
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Du solltest wirklich ein Tutorial durcharbeiten.

Was steht denn hinter "while"? Warum schreibt man da etwas und was bewirkt das?
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

soll mit Sicherheit nicht despektierlich klingen/sein:
ich bin so blöd, das ist Fakt !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ sparrow:
ich weiß jetzt nicht, ob ich das richtig formuliere:
ist

Code: Alles auswählen

def fkt_1(string):
    print(string)
(prinzipiell) das Gleiche wie

Code: Alles auswählen

def fkt_1(string):
    print(string)
    return None
in Bezug auf den Rückgabewert. Eine Funktion/Methode ohne *return* ist ja eine Prozedur, die python-intern ein *None* zurückgibt.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
__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
Benutzeravatar
__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. :-D
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

ok, danke, habe ich ja verstanden...
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')
schreibe, dann bekomme ich eine Endlosschleife. WARUM ?
Python sagt doch:

Code: Alles auswählen

>>> True is None
False
>>> True == None
False
>>> 
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

Code: Alles auswählen

#!/usr/bin/env python3

def fkt_1(string):
    print(string)
    string = None


if __name__ == '__main__':
    while string:
        fkt_1('hallo')
bekomme ich einen Error, der mir auch bewußt ist:

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
ich hoffe, ich konnte mich gut genug ausdücken.
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 !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _blackjack_ :
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 !
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _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 ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__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
Antworten