Neue Variablen mit angepassten Namen in Schleifen erstellen

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
python_beginner123
User
Beiträge: 1
Registriert: Freitag 28. Mai 2021, 18:10

Liebe Community,

ich habe folgendes Problem:
Ich habe einen recht umfangreichen Algorithmus geschrieben, der für jeden Tag der Woche bestimmte Schichten plant. Bisher handhabe ich es so, dass die Funktion als Input-Parameter einen einzelnen Tag nimmt, diesen plant und dann eine csv-Datei schreibt. Am Ende möchte ich alle diese einzelnen csv-Dateien zu einer zusammenfassen, um die gesamte Woche zu haben. Da innerhalb der Funktion aber nur lokale Variablen erzeugt werden, kann ich außerhalb der Funktion auf diese nicht mehr zugreifen. Ich habe aktuell folgende Idee:

In der Funktion die neuen Variablen global zu definieren, damit ich danach auf diese zugreifen kann. Gut wäre hierfür, wenn ich für jeden Tag der Woche eine eigene global definierte Variable hätte, die auch dementsprechend heißt.

Code: Alles auswählen

def Tagesplanung(input_df, Tag):
	
	#codeblock
	
	csv_file = open("Schichtplanung_"+str(Tag)+".csv", "a")
        for index, row in Schicht_df.iterrows():
            csv_file.write(str(SchichtNr) + ";" + str(row.globaleID) + "\n")
            
	global ???
	??? = ???
Danach führe ich die Funktion auf jeden Wochentag mit verschiedenen input_df aus. Bspw:

Code: Alles auswählen

Tagesplanung(df_Mo, "Mo")
Tagesplanung(df_Di, "Di")
...
Tag ist dabei ein String ("Mo", "Di", "Mi",...) und input_df ein Dataframe mit dem der Algorithmus arbeitet.

Im Optimalfall hätte ich durch Ersetzung der ??? danach 7 Listen von Montag bis Freitag, die alle auch so benannt sind.
tagesplanung_Mo / tagesplanung_Di / ...

Ich habe aber noch keine Idee, wie ich das im Code konkret umsetzen kann. Es gibt sicherlich noch deutlich bessere Ansätze, um dieses Problem zu lösen und ich freue mich auch sehr über weitere Denkanstöße!
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@python_beginner123,

Willkommen! Ein paar Tips kann ich dir geben:

Verwende besser keine globalen Variablen. Die Versuchung ist groß, da man zunächst denkt, auf diese Weise die Daten im Programm möglich unkompliziert zu handhaben. Das mag bei kleinen Programmen noch funktionieren. Doch das Problem bei globalen Variablen ist, dass sie eben an jeder Stelle deines Programms verändert werden können. Das macht es bei eventuellen Fehlern, sehr schwierig die Ursache zu finden. Daher sollte man sich so etwas gar nicht erst angewöhnen.
Die Daten sollten auf klar definierten, möglichen Wegen durch dein Programm wandern.

Das Programm sollte auch in einzelne Teilfunktionen zerlegt werden, um die Gesamtfunktion des Programms zu realisieren. Jede Funktion hat optional Eingangsdaten, eine innere Logik nach der die Daten verarbeitet werden und optional auch Ausgangsdaten.

Dadurch kann man klar nachvollziehen auf welchem Wege die Daten durch dein Programm wandern.

Vielleicht war es dir noch nicht klar, aber Funktionen können auch einen oder sogar mehrere Rückgabewerte haben. Also statt die erzeugten Daten deiner Funktion global anzulegen, kannst du sie einfach dorthin zurückgeben, von wo die Funktion aufgerufen wurde. Von dort können die Daten dann weiter verarbeitet werden, usw.

Außerdem scheint mir die Idee mit den 7 Dateien unnötig. Oder gibt es einen besonderen Grund eine Datei für jeden Tag zu erzeugen? Schließlich kannst du ja in deiner csv-Datei direkt eine Spalte für den jeweiligen Tag anlegen.
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@python_beginner123: Ergänzende Anmerkungen: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Dateien die man öffnet, sollte man auch wieder schliessen. Dazu bietet es sich an die Datei mit ``with`` zusammen zu öffnen.

Zum schreiben von CSV-Dateien gibt es das `csv`-Modul. Aber wenn man sowieso schon Pandas verwendet: `DataFrame` hat eine `to_csv()`-Methode.

Wenn man in einer ``for``-Schleife über alle Zeilen eines `DataFrame` iterriert, macht man sowieso meistens etwas falsch.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktionen sollten nach Tätigkeiten benannt werden und genau eine Aufgabe haben. Eine Funktion, die eine Tagsplanung macht, sollte sie nicht auch gleich in eine Datei schreiben.
Statt Code zu kopieren, sollte man passende Datenstrukturen verwenden, also z.B. eine Liste oder ein Wörterbuch für die Inputdaten einer Woche.

Code: Alles auswählen

def plan_single_day(input_df, day):
    ...
    return schicht_df

def main():
    input_data_for_week = {
        "Mo": ...,
        "Di": ...,
        ...
    }
    schicht_df_for_week = {}
    for day, input_df in input_data_for_week.items():
        schicht_df = plan_single_day(input_df, day)
        schicht_df.to_csv(f"Schichtplanung_{day}.csv")
        schicht_df_for_week[day] = schicht_df

    schicht_df_week = merge_schicht_dfs(schicht_df_for_week)
    schicht_df_week.to_csv(f"Schichtplaung_Woche.csv")

if __name__ == "__main__":
    main()
Antworten