Seite 1 von 1
Variablennamen zusammensetzen
Verfasst: Sonntag 25. März 2007, 13:37
von Markus12
Hi,
ich hab da ein kleines Problem:
Ich möchte variablennamen zusammensetzen, ungefähr so hatte ich mir das vorgestellt:
Klappt leider nicht
Weiß jemand eine andere variante (möglichst einfach)?

Verfasst: Sonntag 25. März 2007, 13:44
von EnTeQuAk
meinst du zufällt so etwas?
Code: Alles auswählen
In [1]: from random import randint
In [2]: zufall = randint(1, 9)
In [3]: variable = 'hallo %d' % zufall
In [4]: print variable
hallo 5
Oder habe ich dich falsch verstanden?
MfG EnTeQuAk
Verfasst: Sonntag 25. März 2007, 13:45
von apollo13
Er hätte gerne eine Variable names:
variable(ergebnis von rand). Beispiel:
variable3
variable4 etc....
MfG apollo13
Verfasst: Sonntag 25. März 2007, 13:49
von Markus12
Ne,
ich meinte es so:
1. Die Zufallszahl wird bestimmt.
2. Eine Variable, die von der Zufallszahl abhängt, wird definiert.
In etwa so:
Die zufallszahl ist jetzt mal 4, dann wird eine variable die "varible4" heißt auf "hallo" gesetzt.
Wenn beim nächsten Mal die zufallszahl 8 ist, dann heißt die variable "variable8" und ihr Wert ist "hallo"
Frag mich nicht für was ich das brauche *haha*

Verfasst: Sonntag 25. März 2007, 13:50
von Markus12
Ja genau apollo13!

Verfasst: Sonntag 25. März 2007, 14:05
von EnTeQuAk
geht direkt nicht. (nicht, das ich wüsste

)
Aber du kanst Dictionarys benutzen:
Code: Alles auswählen
In [1]: from random import randint
In [2]: dictionary = {}
In [3]: zufall = randint(1, 9)
In [4]: dictionary['variable%d' %zufall] = 'hallo'
In [5]: dictionary
Out[5]: {'variable6': 'hallo'}
Das währe das gleiche, was du hättest

oder anders:
Code: Alles auswählen
In [1]: from random import randint
In [2]: dictionary = {}
In [4]: dictionary['variable%d' % randint(1, 9)] = 'hallo'
In [5]: dictionary['variable%d' % randint(1, 9)] = 'hallo nummer 2'
In [6]: print dictionary
{'variable2': 'hallo nummer 2', 'variable6': 'hallo'}
In [7]: print dictionary['variable2']
hallo nummer 2
Je nachdem, was du machen möchtest...
Was möchtest du denn machen?
MfG EnTeQuAk
Verfasst: Sonntag 25. März 2007, 14:16
von BlackJack
Wobei man sich das mit den Zeichenketten sparen kann, der Namensteil vor der Zahl steht ja schon im Quelltext. Also:
Code: Alles auswählen
In [5]: variable = dict()
In [6]: variable[random.randint(0, 9)] = 'hallo'
In [7]: variable
Out[7]: {3: 'hallo'}
In [8]: variable[3]
Out[8]: 'hallo'
Verfasst: Sonntag 25. März 2007, 14:28
von Markus12
Ja danke!
Ich mache gerade etwas einfaches: Tic Tac Toe
Ich brauchte das variablen zusammensetzen für die Berechnung, wo der gegner sich platziert.
Ich habe variablen definiert, die zeigen sollten, ob das Feld, in das er sich setzen will, schon besetzt ist.
Ich wollte das nicht so machen, da es zu unprofessionell ist:
Code: Alles auswählen
if zufall==1:
variable1='belegt'
elif zufall==2:
variable2='belegt'
...
so wollte ich das nicht machen

Verfasst: Sonntag 25. März 2007, 14:42
von EyDu
Wenn du schon ein TicTacToe machst, bieten sich für dich vielleicht Tupel als Schlüssel des Dictionarys an, da du ja eh' ein n*m-Fed hast. Dann kannst du dir auch gleich das durchnummerieren der Felder sparen:
Code: Alles auswählen
def set(var, x, y, value):
var[(x,y)] = value
def is_set(var, x, y, value):
return (x,y) in var.keys() and var[(x,y)] == value
variable = {}
set(variable, 1, 1, "spam")
is_set(variable, 1, 1, "spam") # => True
is_set(variable, 2, 3, "eggs") # => False
Verfasst: Sonntag 25. März 2007, 15:18
von Sr4l
ich würde mit True und False arbeiten und einem Dict wie oben beschreiben.
PS aber man kann 'Variable'-Variablen bauen ^^ aber etwas doof:
Code: Alles auswählen
>>> from random import randint
>>> string = "variable%d = 'hallo'"%randint(1,9)
>>> exec(string)
#
# So jetzt müssen wir aber die Vairable suchen und deshalb ist ein dict besser:
#
>>> variable1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'variable1' is not defined
>>> variable2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'variable2' is not defined
>>> variable2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'variable2' is not defined
>>> variable3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'variable3' is not defined
>>> variable4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'variable4' is not defined
>>> variable5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'variable5' is not defined
>>> variable6
'hallo'
>>>
Verfasst: Sonntag 25. März 2007, 19:28
von Markus12
@Sr4l:
WAs bedeutet oder macht das "exec" genau?
Macht es das Variablenbauen möglich?
Verfasst: Sonntag 25. März 2007, 19:35
von apollo13
Das macht exec:
http://docs.python.org/ref/exec.html
Erlaubt sozusagen "Variablenbau"
Verfasst: Sonntag 25. März 2007, 19:41
von Markus12
Ok danke

Verfasst: Sonntag 25. März 2007, 23:47
von nkoehring
Wobei in dem Fall auch eval reicht... Das tolle an Eval und Exec ist ja, dass man sie in einem eigenen Namespace ausfuehren kann... zB so:
Code: Alles auswählen
from random import randint
myNamespace = dict()
eval("var%d=False" %randint(1,9)) in myNamespace
Aber wie schon erwaehnt... fuer deine Idee ist es nicht sinnvoll

Verfasst: Montag 26. März 2007, 19:19
von birkenfeld
Reingefallen: `in` gibts nur bei `exec`. Für `eval` sind die Namespaces ganz normale Argumente

Verfasst: Montag 26. März 2007, 19:40
von Leonidas
Wie hier alle schon gemeint haben sind dynamische Variablennamen eine schlechte Idee und man sollte lieber eine passende Datenstruktur nutzen - welche das ist hängt natürlich ganz vom Einsatzzweck ab.
Verfasst: Montag 26. März 2007, 19:49
von nkoehring
birkenfeld hat geschrieben:Reingefallen: `in` gibts nur bei `exec`. Für `eval` sind die Namespaces ganz normale Argumente

Och menno
