Objekte aus Liste ausgeben

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
Ekua
User
Beiträge: 10
Registriert: Freitag 26. Juni 2020, 09:53

Hallo!
Ich habe eine Liste mit Objekten, die ich zum weiterverwenden ausgeben möchte. Wenn ich weiß, wie viele Objekte in der Liste sind, kann ich das auch so lösen, wie es unten steht, auch wenn das sicherlich nicht hübsch ist.
Wie iteriere ich über die Liste, um alle Objekte auszugeben und danach weiterverwenden zu können?

Vielen Dank für eure Hilfe!

MainCyclePoints = [SP1, SP2, SP3, SP4, SP5, SP6, SP7, SP8, SP9, SP10]

SP1 = MainCyclePoints[0]
SP2 = MainCyclePoints[1]
SP3 = MainCyclePoints[2]
SP4 = MainCyclePoints[3]
SP5 = MainCyclePoints[4]
SP6 = MainCyclePoints[5]
SP7 = MainCyclePoints[6]
SP8 = MainCyclePoints[7]
SP9 = MainCyclePoints[8]
SP10 = MainCyclePoints[9]
Freumel
User
Beiträge: 69
Registriert: Donnerstag 25. Januar 2018, 13:47

Einfacher For Each Loop :-)

Code: Alles auswählen

for point in MainCyclePoints:
    print(point)
    # Do sth. different
Falls du gleichzeitig den Index benötigst:

Code: Alles auswählen

for index,point in enumerate(MainCyclePoints):
    print(index, point)
    # Do sth. different
Ekua
User
Beiträge: 10
Registriert: Freitag 26. Juni 2020, 09:53

aber so werden sie dann doch nur in der Konsole ausgegeben oder? Wie greife ich dann auf die ausgegebenen Objekte zu?
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit "Zugreifen". Hol doch mal etwas weiter aus, was möchtest Du machen, wo ist kommst Du nicht weiter? Lauffähigen Code? Fehlermeldung?
Freumel
User
Beiträge: 69
Registriert: Donnerstag 25. Januar 2018, 13:47

Ekua hat geschrieben: Donnerstag 9. Juli 2020, 13:39 aber so werden sie dann doch nur in der Konsole ausgegeben oder? Wie greife ich dann auf die ausgegebenen Objekte zu?
Ich habe jetzt nur einen Print erstellt. Du kannst alternativ alles tun was du möchtest.

Falls SP1, ... SP10 in deinem Fall Klassen sind, kannst du diese innerhalb der Schleife manipulieren und verändern.
Alle Änderungen im For Loop würden in dem Fall jedes einzelne Element im Array nachhaltig verändern.
Ekua
User
Beiträge: 10
Registriert: Freitag 26. Juni 2020, 09:53

class StatePoint:

def __init__(self, name, mass_flow, fluid):
self.name = name
self.mdot = mass_flow
self.fluid = fluid

def PS(self, p, s):
"""
Parameters
----------
p : float, double
pressure (in Pa)
s : float, double
entropy (in J/kgK)

"""
self.p = p
self.s = s
self.T = PropsSI('T','P',self.p, 'S', self.s, self.fluid)
self.h = PropsSI('H','P',self.p, 'S', self.s, self.fluid)
self.v = 1/PropsSI('D','P',self.p, 'S', self.s, self.fluid)
self.Q = PropsSI('Q','P',self.p, 'S', self.s, self.fluid)
self.eta = PropsSI('V', 'P',self.p, 'S', self.s, self.fluid)
return

exact_SP = []

SP1 = MainCyclePoints[0]
SP2 = MainCyclePoints[1]
SP3 = MainCyclePoints[2]
SP4 = MainCyclePoints[3]
SP5 = MainCyclePoints[4]
SP6 = MainCyclePoints[5]
SP7 = MainCyclePoints[6]
SP8 = MainCyclePoints[7]
SP9 = MainCyclePoints[8]
SP10 = MainCyclePoints[9]

s0 = SP2.s
delta_s0 = (SP3.s - SP2.s)/number_points
for i in range(number_points):
sp_i = SP.StatePoint('i', 'mdot', fluid)
sp_i.PS(SP2.p,s0+i*delta_s0)
exact_SP.append(sp_i)


Ich habe eine Klasse StatePoint, die mir Punkte eines Dampfkraftprozesses berechnet. Jedes Objekt StatePoint hat dann u.a. die Attribute p,T,s,h. Mit dem Druck p und die Entropie s muss ich dann weiterarbeiten. Der obenstehende Code funktioniert. Ich hätte nur gerne eine allgemeinere Lösung für die Ausgabe der Objekte aus der Liste.
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Auf gute Variablennamen wurdest schon öfter hingewiesen, auf Code-Tags zum Formtieren des Codes hier im Forum auch.

__init__ ist dazu da, eine Instanz zu initialisieren, also dass sie danach fertig ist und keine neuen Attribute mehr hinzu kommen. Die Methode PS sollte also in __init__ wandern.
Gute Variablennamen sind für das Verständnis wichtig. Ich versteh bei Deinem Code fast nichts. Was ist SP2 oder SP3, warum sind die besonders? Was ist mit den anderen SPx?
SP ist nicht definiert. `fluid` auch nicht.
numpy.linspace könnte nützlich sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13142
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ekua: Die Namen und Attributnamen sind zum Teil sehr schlecht, weil absolut nichtssagend gewählt. Namen in Grossbuchstaben sind für Konstanten. Ausser Klassennamen werden Namen klein_mit_unterstrichen geschrieben.

Nach Abarbeitung der `__init__()` sollte ein Objekt komplett sein, das heisst dann sollten alle Attribute existieren. Neue Attribute in anderen Methoden später erzeugen ist unübersichtlich und fehleranfällig.

Man nummeriert keine Namen. Hier willst Du eine Liste verwenden. Verwendest Du anscheinend ja auch schon, warum also der Unsinn mit den `SP1` bis `SP10`? Wobei `SP1` und `SP4` bis `SP10` nicht mal verwendet werden. Das die Nummerierung bei 1 statt bei 0 anfängt ist dann auch noch mal zusätzlich verwirrend.

Was ist denn `number_points`? Hoffentlich nicht 10, denn dann wäre das ja einfach nur die `len()`-Funktion auf die Liste angewendet.

Das sähe dann eher so aus:

Code: Alles auswählen

class StatePoint:
    def __init__(self, name, mass_flow, fluid):
        self.name = name
        self.mdot = mass_flow
        self.fluid = fluid
        self.pressure = None
        self.entropy = None
        self.T = None
        self.h = None
        self.v = None
        self.Q = None
        self.eta = None

    def set_pressure_and_entropy(self, pressure, entropy):
        """
        Parameters
        ----------
        pressure : float, double
            pressure (in Pa)
        entropy : float, double
            entropy (in J/kgK)
        """
        self.pressure = pressure
        self.entropy = entropy
        self.T = PropsSI(
            "T", "P", self.pressure, "S", self.entropy, self.fluid
        )
        self.h = PropsSI(
            "H", "P", self.pressure, "S", self.entropy, self.fluid
        )
        self.v = 1 / PropsSI(
            "D", "P", self.pressure, "S", self.entropy, self.fluid
        )
        self.Q = PropsSI(
            "Q", "P", self.pressure, "S", self.entropy, self.fluid
        )
        self.eta = PropsSI(
            "V", "P", self.pressure, "S", self.entropy, self.fluid
        )


def main():
    fluid = None
    main_cycle_points = []
    point_count = len(main_cycle_points)

    start_s = main_cycle_points[1].entropy
    delta_s = (
        main_cycle_points[3].entropy - main_cycle_points[1].entropy
    ) / point_count
    exact_statepoints = []
    for entropy in (start_s + i * delta_s for i in range(point_count)):
        state_point = StatePoint("i", "mdot", fluid)
        state_point.set_pressure_and_entropy(
            main_cycle_points[1].pressure, entropy
        )
        exact_statepoints.append(state_point)
Wobei die Klasse IMHO komisch ist und wahrscheinlich zu viel oder falsch zusammenfasst.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten