write, read Funktion und Klassen

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
Georgie24
User
Beiträge: 1
Registriert: Montag 30. August 2021, 10:44

Hallo,

ich habe vor kurzem angefangen zu programmieren und arbeite mich durch ein Kompendium. Ich habe nun zu folgenden Codebeispiel eine Frage.

class Bevoelkerung:
2 """Erstellt das Objekt Bevoelkerung für eine Stadt."""
3 def __init__(self, stadt, bezirk, jahr, einwohner):
4 """
5 Initialisiert ein neues Objekt Bevoelkerung
6
7 Argumente:
8 * stadt (string): die untersuchte Stadt
9 * bezirk (string): der jeweilige Stadtbezirk
10 * jahr (int): das Analysejahr
11 * einwohner (int): Einwohnerzahl des Bezirks
12 """
13
14 self.stadt = stadt
15 self.bezirk = bezirk
16 self.jahr = jahr
17 self.einwohner = einwohner
18
19 def geteinwohner(self):
20 """
21 Gibt die Einwohnerzahl eines Bezirks zurück.
22 """
23 return self.einwohner
24
25 def seteinwohner(self, einwohner_neu):
26 """
27 Ändert die Einwohnerzahl des Bezirks.
28 """
29 self.einwohner = einwohner_neu
30
31 f = open("berlin.txt", "r")
32 daten = f.readlines()
33 liste = []
34 for i in range(4):
35 Stadt = daten[i*4]
36 Bezirk = daten[i*4+1]
37 Jahr = daten[i*4+2]
38 Einwohner = daten[i*4+3][/color]
39 liste += [Bevoelkerung(Stadt, Bezirk, Jahr, Einwohner)]
40 for i in range(4):
41 print("Einwohner {0}: {1}".format(liste.bezirk.strip(), liste.
42 geteinwohner()))
43 f.close()

Ich verstehe Zeile 34 - 38 dahingehend nicht, wie die Positionsangaben in den Klammern zu verstehen sind.
Vielleicht könnt ihr mir helfen:)

Viele Grüße
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Georgie24,
Ich verstehe Zeile 34 - 38 dahingehend nicht, wie die Positionsangaben in den Klammern zu verstehen sind.
Vielleicht könnt ihr mir helfen:)
Da die Daten für Stadt, Bezirk, Jahr, Einwohner anscheinend immer in aufeinanderfolgenden Zeilen in der Textdatei stehen, werden die über die Indizes i, i+1, i+2, i+3 ausgelesen. Mit dem Multiplikator 4 kann man dann immer die nächsten 4 Zeilen referenzieren.

"color" ist in diesem Codeabschnitt nicht definiert, aber da scheinen die Einwohner nochmal in einer Unterliste zu stehen.

Der Schrägstrich in

Code: Alles auswählen

Einwohner = daten[i*4+3][/color]
ist ein Syntaxfehler.

Das ist eine sehr umständliche Art solche Daten zu speichern, da es, wie du siehst, das Auslesen unnötig kompliziert macht.
Solche Daten sollten besser in einer JSON Datei gespeichert werden.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@Georgie24: bitte nicht selbst Zeilen durchnummerieren. So ist der Code absolut unbrauchbar.
Die geteinwohner und seteinwohner sind unnötig und können weg.
Dateien öffnet man immer mit dem with-Statement. Text-Dateien brauchen immer das richtige encoding.
Statt über irgendwelche Indizes auf Daten zuzugreifen macht man das in einer for-Schleife direkt.
Man erzeugt keine ein-elementige Liste, nur um sie an eine andere Liste anzuhängen. Statt dessen benutzt man append.
Variablennamen werden generell komplett klein geschrieben.
Das Zeileende-Zeichen entfernt man gleich beim Einlesen, nicht erst beim Rausschreiben.
Wenn Jahr und Einwohner `int` sein sollen, dann muß man sie entsprechend umwandeln.

Code: Alles auswählen

class Bevoelkerung:
    """Erstellt das Objekt Bevoelkerung für eine Stadt."""
    def __init__(self, stadt, bezirk, jahr, einwohner):
        """
        Initialisiert ein neues Objekt Bevoelkerung
        
        Argumente:
        * stadt (string): die untersuchte Stadt
        * bezirk (string): der jeweilige Stadtbezirk
        * jahr (int): das Analysejahr
        * einwohner (int): Einwohnerzahl des Bezirks
        """
        self.stadt = stadt
        self.bezirk = bezirk
        self.jahr = jahr
        self.einwohner = einwohner


def main():
    with open("berlin.txt", endcoding="utf8") as lines:
        bevoelkerungsdaten = []
        for stadt in lines:
            # four lines belong together
            bezirk = next(lines)
            jahr = next(lines)
            einwohner = next(lines)
            bevoelkerungsdaten.append(Bevoelkerung(stadt.strip(), bezirk.strip(), int(jahr), int(einwohner)))

    for bevolkerung in bevoelkerungsdaten:
        print(f"Einwohner {bevolkerung.bezirk}: {bevolkerung.einwohner}")


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