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]
Objekte aus Liste ausgeben
Einfacher For Each Loop
Falls du gleichzeitig den Index benötigst:
Code: Alles auswählen
for point in MainCyclePoints:
print(point)
# Do sth. different
Code: Alles auswählen
for index,point in enumerate(MainCyclePoints):
print(index, point)
# Do sth. different
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.
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.
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.
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.
__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.
- __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:
Wobei die Klasse IMHO komisch ist und wahrscheinlich zu viel oder falsch zusammenfasst.
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)
“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