Variablen mit for Schleife erzeugen

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
wurschtbrot
User
Beiträge: 5
Registriert: Dienstag 15. Dezember 2015, 17:10

Hallo,

ich habe folgendes Problem.

Im Vorfeld habe ich 4 Variablen 'namex' definiert.
in einer while Schleife werden immer wieder Werte von 1-4 erzeugt und an eine Funktion übergeben
dort durchläuft die Funktion den Code jeweils mit den Werten 1-4 (die Parts mit der While Schleife und Funktion habe ich der Übersichtlichkeit weggelassen und auf das wesentliche reduziert. denke das kann mit 'for in range' nachgestellt werden)
in der Funktion sollen die Variablen name + x zusammengebaut und dann weiter verwendet werden.

im Code habe ich schon mal 3 Versuche aufgeführt, die nicht zum gewünschten Ziel führen.
Als Ergebnis soll
Otto
Paul
Kurt
Franz
angezeigt werden
und nicht wie jetzt
name1
name2
name3
name4

Wie muss die Variable zusammengebaut werden, dass das klappt??

Vereinfacht, und auf das wesentliche reduziert glaub ich zumindest ;-)

Code: Alles auswählen

name1 = 'Otto'
name2 = 'Paul'
name3 = 'Kurt'
name4 = 'Franz'

for i in range (1,5):
        print i
        a = 'name'+str(i)
        b = ['name%s' % i]
        c = 'name%s' % i
        print a
        print b
        print c


vielen Dank schon mal

wurschtbrot
BlackJack

@wurschtbrot: Du willst keine durchnummerierten Variablennamen erzeuen sondern eine Liste verwenden. Auf die einzelnen Werte kannst Du dann über den Index zugreifen (Nummerierung beginnt bei 0) oder einfach über die Elemente der Liste iterieren.

Code: Alles auswählen

names = ['Otto', 'Paul', 'Kurt', 'Franz']
for name in names:
    print name
wurschtbrot
User
Beiträge: 5
Registriert: Dienstag 15. Dezember 2015, 17:10

@BlackJack
Danke für Deine schnelle Antwort, Du hast recht, das sieht schon besser aus aber jetzt bekomme ich die Namen so:
O
t
t
o

etc.

Da ist doch noch ein kleiner Haken oder hab ich was übersehen?


Code: Alles auswählen

import time
import sys


names = ['Otto', 'Paul', 'Kurt', 'Franz', 'Hans', 'Uller'];


def GetName(i):
        for name in names:
                print name[i]
   

while True:
        try:
                for i in range (0,4):
                        a = GetName(i)
                print ' ich warte'
                time.sleep(10)
        except (KeyboardInterrupt, SystemExit):
                print ' ENDE'
                sys.exit(0)

BlackJack

@wurschtbrot: Du hast da eine Schleife zu viel. Einen *einzelnen* Namen solltest Du natürlich nicht mehr in einer Schleife ausgeben weil dann die Buchstaben einzeln in jedem Schleifendurchlauf ausgegeben werden.

Und lass diesen unsinnigen Index weg und iterieren *direkt* über die Elemente in der Liste. Das ist Python und kein C oder BASIC. ;-)

Die äussere Schleife kann man sich hier noch durch `itertools.cycle()` ersparen.
wurschtbrot
User
Beiträge: 5
Registriert: Dienstag 15. Dezember 2015, 17:10

@BlackJack
sorry, jetzt hab ich's auch verstanden wo der Fehler war.
so klappts:

Code: Alles auswählen

def GetName(i):
        print names[i]
ich glaub den Index brauche ich, da hängt ja noch mehr dran. Ich will 10 Sensoren auslesen und die Werte dann in Dateien schreiben deren Name ich mit dieser Liste dann vorgebe.
Was meinst Du mit der äusseren Schleife? While True?
das von Dir genannte Tool kenn ich noch nicht, werde ich mir mal anschauen und Google bemühen.
BlackJack

@wurschtbrot: Der Name der Funktion ist falsch. Von einer `GetIrgendwas()`-Funktion erwartet man das sie etwas zurück gibt und nicht das sie etwas ausgibt. Und der Inhalt ist jetzt schon etwas dürftig.

Wenn Du *zusätzlich* einen Indexwert brauchst, dann gibt es die `enumerate()`-Funktion und wenn der Wert als Index für eine andere Sequenz dient, dann ist er auch nicht nötig, denn dafür gibt es `zip()` beziehungsweise `itertools.zip()`. Wenn Du mit Indexwerten hantierst, dann ist das in den meisten Fällen kein idiomatisches Python!

Nicht die Suchmaschine anwerfen bevor Du in der Dokumentation nachgelesen hast.
wurschtbrot
User
Beiträge: 5
Registriert: Dienstag 15. Dezember 2015, 17:10

@BlackJack
Danke erstmal für Deine Geduld und Hilfe!!
ich glaube, ich wurde da etwas missverstanden. Der Code war nur als abgespecktes Beispiel gedacht. Im echten Code wird über die Funktion etwas mehr abgefragt und zurückgegeben Daher auch das Get. Tut mir Leid, wenn das so nicht rüber kam. :oops:

Ich hätte aber zu der Liste Funktion noch eine Frage:
Über eine Datei, in der eine Liste mit Nummern (a123, x456, k789, ...) von Sensoren steht, lese ich diese aus und will den Nummern sprechende Namen (Hans, Kurt, Otto, ...) zuordnen. über die Liste funktioniert das jetzt auch. Was ist aber, wenn sich die Reihenfolge in der Liste ändert?
Kann ich das irgendwie fest zuordnen, und mit der Nummer den entsprechenden Namen verbinden??
also so:
a123 -> Kurt
k789 -> Hans
x456 -> Otto

dann komme ich mit a123 an und bekomme Kurt zurück, das wäre toll :D
BlackJack

@wurschtbrot: Das geht mit einem Wörterbuch (`dict`). Ich habe so langsam das Gefühl Du solltest erst einmal ein Python-Grundlagentutorial durcharbeiten. In der Python-Dokumentation ist zum Beispiel eins. Für absolute Programmieranfänger wird auch gerne Learn Python The Hard Way empfohlen.
wurschtbrot
User
Beiträge: 5
Registriert: Dienstag 15. Dezember 2015, 17:10

@BlackJack
Danke für den Tipp, mit dict hat das funktioniert wie ich es wollte.

Dein "Gefühl" und den Seitenhieb kann ich verstehen, aber als Neuling+ ist es nicht einfach, die Vielzahl an Befehlen und Funktionen und deren Wirkweise, Syntaxen und Formaten alle zu kennen. Von den Modulen, Klassen, und was es sonst noch so gibt ganz zu schweigen. Gerade als Anfänger (weit jenseits der Zwanzig) hat man das Problem nicht zu wissen, was man nicht weiß. Hier im Ursprung diese Beitrags dachte ich, es liegt am Format oder der Syntax und nicht an der falschen Funktion.
Das Tuturial werde ich mir mal näher anschauen. Bisher hatte ich andere Bücher und Quellen. Denke das finde ich bei Python direkt. Mit Python direkt arbeite ich auf einem Raspberry in der Shell, da gibt es diese Doku nicht.

Dennoch möchte ich es nicht versäumen mich bei den Moderatoren und sehr aktiven Mitgliedern zubedanken, die doch eine beträchtliche Zeit einsetzen, Ihr Wissen weiterzureichen.
BlackJack

@wurschtbrot: Klar kann man nicht alles wissen aber Schleifen und die Grunddatentypen, insbesondere `list` und `dict`, braucht man eigentlich in jedem Programm und die kommen in jedem Grundlagenbuch oder -tutorial vor. Deswegen meine Nachfrage. Während die Idee über Zahlen zu iterieren um die dann als Index in eine Liste zu benutzen, so eigentlich nicht in Python-Tutorials vorkommen sollte, oder höchstens um gleich danach zu erklären das man das in Python nicht so macht weil man direkt über die Elemente iterieren kann, ohne den unnötigen Umweg über einen Index.

Edit: In der Python-Shell gibt es die `help()`-Funktion über die man etwas über die Objekte erfahren kann (und in Python ist alles was man an einen Namen binden kann ein Objekt!). Und man kann die Funktion auch mit Zeichenketten aufrufen, Beispielsweise um etwas über Schlüsselworte zu erfahren. Beispiel ``help('for')`` zeigt einem die Syntax von und Erklärung zu ``for``-Schleifen.

Desweiteren kann man auf dem Rechner auf dem man arbeitet ja den Browser öffnen und die Python-Dokumentation lesen. (Geht auch Offline, da man sie auch herunterladen kann.) Oder arbeitest Du wirklich nur mit dem Raspi direkt? Auch da kann man eine grafische Oberfläche installieren und die Python-Dokumentation, und einen Webbrowser.
Antworten