Liste und Funktionen

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
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich habe hier mal ein einfaches Script, was eine "globale" liste und listen in Funktionen enthält.
Die globale Liste soll in den verschiedenen Funktionen mit Werten gefüllt werden.
In Python ist vieles möglich bzw gibt es viele Wege.
Jetzt eine Frage an die Experten, ob mein nachfolgender Code fachlich richtig wäre.
Er funktioniert genau so wie ich es wollte, nur ist das auch inhaltlich richtig?

Code: Alles auswählen

liste_gesamt = []

def beispiel_1():
    function_liste = []
    string1 = "hello"
    string2 = "world"
    function_liste.append(string1)
    function_liste.append(string2)
    liste_gesamt.append("das ist die 1. Funktion")
    return function_liste

def beispiel_2():
    function_liste = []
    string1 = "hallo"
    string2 = "welt"
    function_liste.append(string1)
    function_liste.append(string2)
    liste_gesamt.append("das ist die 2. Funktion")
    return function_liste

def auswertung():
    part1 = beispiel_1() + beispiel_2()
    part2 = liste_gesamt + part1
    for i in part2:
        print(i)


if __name__ == "__main__":
    auswertung()

Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Nein!
Er verwendet globale Variablen.
Funktionen bekommen alles, was sie benötigen als Parameter und geben eine Ergebnis zurück.

Weiter setzt man Zeichenketten nicht per + zusammen. In der Regel verwendet man String-Formatierung.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Warum setzt man Zeichen ketten nicht mit + zusammen? Was wäre die alternative?
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

sparrow hat geschrieben: Samstag 24. Oktober 2020, 12:11
Funktionen bekommen alles, was sie benötigen als Parameter und geben eine Ergebnis zurück.
Kann man keine "globale" Liste erstellen und in jeweiligen Funktionen verändern?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Men Fehler: Du baust ja gar keine Zeichenketten zusammen.

Man kann vieles. Nur tut man es nicht. Und man verwendet keine globalen Variablen. Das macht das Programm fürchterlich unübersichtlich und so gut wie nicht mehr zu debuggen.
Und es ist überflüssig. Um dein Programm zu verstehen, muss man ständig im Hinterkopf behalten, dass da eine globale Liste irgendwo in Funktionen verändert wird. Um zu verstehen, welche Elemente liste_gesamt hat, als es das erste Mal in auswertung() aufgerufen wird, muss mein dein gesamtes Programm lesen. Ohne Merhwert.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK danke.
Aber warum setzt man strings nicht mit den Operator "+" zusammen?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Weil es entweder unübersichtlich oder ineffizient ist.

Möchte man einen Variabe in eine Zeichnekette einfügen, nimmt man seit >= Python 3.6:

Code: Alles auswählen

name = "egon11"
print(f"Hallo mein Name ist {name}.")
Und wenn man Zeichen oder Zeichenketten sammelt und hinterher zusammenführen möchte, dann sammelt man sie in einer Liste und führt sie dann mit join zusammen:

Code: Alles auswählen

words = ["Ist", "das", "ein", "Satz?"]
print(" ".join(words))
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ok. Das habe ich nicht gewusst, dass sich schon wieder was ab python3.6 geändert hat.
Gibt es übrigens eine Änderungsliste gegenüber der älteren Version (wie z.b. Neuerungen 3.5 zu 3.6 ...)?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eine Möglichkeit das ohne die globale Liste zu schreiben:

Code: Alles auswählen

#!/usr/bin/env python3


def beispiel_1():
    return ["hello", "world"], "das ist die 1. Funktion"


def beispiel_2():
    return ["hallo", "welt"], "das ist die 2. Funktion"


def auswertung():
    ergebnisse = []
    liste_gesamt = []
    for beispiel in [beispiel_1, beispiel_2]:
        ergebnis, gesamt_element = beispiel()
        ergebnisse.extend(ergebnis)
        liste_gesamt.append(gesamt_element)
    
    part2 = liste_gesamt + ergebnisse
    for element in part2:
        print(element)


if __name__ == "__main__":
    auswertung()
Eine Änderungs-/Neuerungsliste gibt es bei jeder Version in der Python-Dokumentation.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6870
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

egon11 hat geschrieben: Samstag 24. Oktober 2020, 14:08 Gibt es übrigens eine Änderungsliste gegenüber der älteren Version (wie z.b. Neuerungen 3.5 zu 3.6 ...)?
https://docs.python.org/3/whatsnew/3.6.html
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK Danke.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Was ich mich noch gefragt habe, warum führt man die Funktionen nicht schon in der Schleife aus?

Code: Alles auswählen

def auswertung():
    ergebnisse = []
    liste_gesamt = []
    for beispiel in [beispiel_1(), beispiel_2()]:
        ergebnis, gesamt_element = beispiel
        ergebnisse.extend(ergebnis)
        liste_gesamt.append(gesamt_element)

    part2 = liste_gesamt + ergebnisse
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@egon11: Du meinst *vor* der Schleife und das wäre dann auch die Antwort: Wenn man beide Funktionen vor der Schleife ausführt hat man ja erst einmal alle Ergebnisse in der Liste als Tupel. Wenn man sie *in* der Schleife ausführt, hat man immer nur das Ergebnis der aktuell aufgerufenen Funktion als Tupel vorliegen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Aber wenn ich so wie ich es geschrieben habe ausführe komme ich aber komischerweise zum gleichen Ergebnis.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@egon11: Ja natürlich, warum solltest Du nicht zum gleichen Ergebnis kommen‽ Es unterscheidet sich ja nur zu welchem Zeitpunkt im Programmablauf die gleichen Ergebnisse produziert werden und ob die Zwischenergebnisse alle gleichzeitig existieren, oder nur dann und so lange wie sie tatsächlich benötigt werden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ach so ok.
Antworten