Seite 1 von 1

Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 13:28
von Ekua
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]

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 13:35
von Freumel
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

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 13:39
von Ekua
aber so werden sie dann doch nur in der Konsole ausgegeben oder? Wie greife ich dann auf die ausgegebenen Objekte zu?

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 13:42
von Sirius3
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?

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 13:48
von Freumel
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.

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 13:53
von Ekua
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.

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 14:36
von Sirius3
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.

Re: Objekte aus Liste ausgeben

Verfasst: Donnerstag 9. Juli 2020, 15:02
von __blackjack__
@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.