Variablennamen aus einer Loop aufrufen

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.
RaPi_Fan
User
Beiträge: 26
Registriert: Mittwoch 10. November 2021, 17:37

@__blackjack__User
Von `My*` hat keiner was.
In diesem Fall wollte ich sehen, ob die verwendeten Bezeichnungen verändert werden dürfen.
Habe doch geschrieben, wie es dazu kam. Natürlich hätte ich die Namen wieder zurück ändern können (müssen).
Du hast da keine „definierte Grösse des Arrays“ wenn Du in eine *Liste* als erstes Element eine Wunsch- oder Hoffnungsgrösse einträgst. Selbst wenn Wunsch/Hoffnung mit der Realität übereinstimmt, wofür Du ja immer selbst sorgen musst, womit das eine Fehlerquelle ist, hast Du dann in einer Liste Elemente mit unterschiedlichen Bedeutungen und kannst die nicht mehr normal, also so wie vorgesehen verwenden, weil Dein Code immer diesen einen komischen, besonderen, aus der Reihe tanzenden Wert, besonders behandeln muss. Das macht überhaupt gar keinen Sinn
Sehe ich nicht ganz so. Die richtige Anzahl einzuschreiben sollte fehlerfrei möglich sein. In diesem Fall ist es sogar so, dass hierdurch der SensorName auch mit der Position in der Reihe übereinstimmt, da es Sensor "0" nicht gibt. Andernfall muss immer ein Offset beachtet werden.

@kbr
interessanter Ansatz. Da sich die Seriennummern nicht (oder nur sehr selten) ändern, werde ich es wahrscheinlich nicht umsetzen. Die Möglichkeit, dass die entsprechende Textdatei nicht gefunden wird, ist eine Fehlerquelle, die ich gerne vermeiden möchte.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@RaPi_Fan

Code: Alles auswählen

falsche_liste = [20, "hallo"]
ist moeglich, aber nicht fehlerfrei. Denn es suggeriert, die Liste haette 20 Eintraege. Hat sie aber nicht. Und Computer zaehlen halt von 0. Wenn das zur Darstellung anders sein soll, muss man das an der Stelle aendern. Und nicht sinnlos in allen moeglichen Datenstrukturen Dummy-Werte mit Fehlerpotential mitfuehren.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Ergänzend zu __deets__: Elemente einer Liste sollten von der selben Art sein. Sonst schlägst du dir selber einen Nagel in den Fuß. Denn nur wenn alle Elemente das enthalten, kannst du sauber über sie hinweg iterieren und man muss nicht einen Kofpstand und zwei Seitensprünge machen, um die Daten zu bekommen.

Das Beispiel lieferst du selbst:

Code: Alles auswählen

# Nicht so schön
    for loop in range(1,Tempsensor[0]+1):                                     #Werte in Temp[] einlesen
        Temp[loop] = (readTempLines(Tempsensor [loop])[0])
        tempalle = tempalle+ Temp[loop]

# besser:
    for sensor_path in sensor_pathes:
        ...
Ich sehe gar keinen Sinn darin, dort die Anzahl der Elemente einzutragen - außer die Komplexität und Fehleranfälligkeit unnötig zu erhöhen.

Bei der Gelgenheit ist mir noch aufgefallen, dass das sehr unglücklich ist, was du da tust.
Denn du rufst jedes Mal readTempLines auf. Und dan loopt über etwas - und wartet dann auch noch absichtlich. Das heißt, der Aufruf hier blockiert. Das soltest du anders lösen. Kommt aber wahrscheinlich von alleine, wenn du ein Gefühl für Datenstrukturen bekommen hast.
RaPi_Fan
User
Beiträge: 26
Registriert: Mittwoch 10. November 2021, 17:37

Ich versuche gerade eure Vorschläge umzusetzen.

Code: Alles auswählen

RELAY_PINS = (17, 18, 27, 22, 5, 6, 13 ,19)
relays = [gpiozero.LED(pin) for pin in RELAY_PINS]

# default Werte setzen
relays(0).on()
sleep(0.1)
relays(1).on()
sleep(0.1)
relays(2).on()
sleep(0.1)
... endet leider mit dieser Fehlermeldung:
relays(0).on()
TypeError: 'list' object is not callable
Ein entprechendes Ergebnis hatte ich auch mit den potis(8).
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RaPi_Fan: Was irgendwie erwartbar ist wenn man versucht eine Liste wie eine Funktion aufzurufen. Wie kommst Du denn auf die Idee das zu machen? Syntax raten funktioniert nicht.

Zudem ist das aber auch gar nicht notwendig hier mit magischen oder wahlweise sehr langweiligen/monotonen Indexwerten zu arbeiten und achtmal mal den gleichen Code hin zu schreiben der sich nur durch den laufenden Index unterscheidet. Dafür gibt es Schleifen:

Code: Alles auswählen

for relay in relays:
    relay.on()
    sleep(0.1)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
RaPi_Fan
User
Beiträge: 26
Registriert: Mittwoch 10. November 2021, 17:37

@__blackjack__User
Bitte habe Nachsicht mit mir. Ich habe mehrfach erwähnt, das ich Anfänger in der Python-Programmierung bin.
Ich hätte schon die Zuweisungen in eine Loop gebracht, wenn der Fehler mit dem Aufruf nicht dazwischengekommen wäre.
Eines nach dem Anderen. Ich kann nur Step by Step lernen.
Antworten