Iteration eines Variablenindex in Schleife

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.
Frederik
User
Beiträge: 11
Registriert: Dienstag 28. April 2009, 00:37

Iteration eines Variablenindex in Schleife

Beitragvon Frederik » Dienstag 28. April 2009, 00:47

Hallo,
kurze Frage: warum funktioniert folgender Code nicht und wie kann ich ihn schnell und einfach umgehen?

Code: Alles auswählen

def function():
     for i in range(5):
             var_i = ...
     return var_1, var_2, ..., var_4


Viele Gruesse und vielen Dank,

Frederik
BlackJack

Beitragvon BlackJack » Dienstag 28. April 2009, 05:26

@Frederik: Der funktioniert nicht, weil es die Namen `var_1`, `var_2`, `var_3`, und `var_4` nicht gibt, weil da nur der Name `var_i` an etwas gebunden wird.

"Umgehen" kannst Du das, in dem Du nicht versuchst durchnummerierte Namen dynamisch zu erzeugen sondern eine Liste verwendest.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 28. April 2009, 06:48

Würdest du etwa in dem Code auch erwarten, dass der Name expandiert wird?

Code: Alles auswählen

def function():
     for i in range(5):
             variable = ...
     return var1able, var2able, ..., var4able

Das wäre doch ziemlich komisch, oder?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 28. April 2009, 07:23

Leonidas hat geschrieben:

Code: Alles auswählen

def function():
     for i in range(5):
             variable = ...
     return var1able, var2able, ..., var4able


Aber eine geniale Idee für eine esotherische Programmiersprache - dynamische Namen statt Listen o.ä. :-D
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Beitragvon Dill » Dienstag 28. April 2009, 12:30

es wäre natürlich absoluter schwachsinn, aber das geht doch bestimmt irgendwie... (die variablen dyn zu erzeugen).


was du willst:

Code: Alles auswählen

var = []
for i in range(5):
    var.append(...was auch immer...)


und nicht etwa:

Code: Alles auswählen

var = []
for i in range(5):
    var[i] = ...was auch immer... #error: den index gibt es nicht!


da hab ich auch noch ne frage, wie würde man das denn am elegantestens machen? so ...?

Code: Alles auswählen

var = [None for i in range(0, 5)]
for i in range(5):
    var[i] = ...was auch immer...
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Dienstag 28. April 2009, 12:36

Natürlich geht so etwas:

Code: Alles auswählen

def function():

  for i in xrange(3):
    globals().update({'var_%s' % i: i})

 
  return var_0, var_1, var_2

print function()


Aber (normalerweise) macht man das nicht...

:wink:
yipyip
DasIch
User
Beiträge: 2404
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Dienstag 28. April 2009, 14:09

Wenn man das überhaupt macht dann doch wenigstens mit locals().

Man könnte aber auch einfach einen Generator zurückgeben.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Dienstag 28. April 2009, 14:38

An locals() hatte ich erst auch gedacht,
aber

Code: Alles auswählen

def function():

  print locals()
  for i in xrange(3):
    locals().update({'var_%s' % i: i})

  print locals()
  return var_0, var_1, var_2


print function()

ergibt
{}
{'i': 2, 'var_2': 2, 'var_1': 1, 'var_0': 0}
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
File "<stdin>", line 8, in function
NameError: global name 'var_0' is not defined

In der 2.6 Doku steht Entsprechendes:
locals()
Update and return a dictionary representing the current local symbol table.
Warning
The contents of this dictionary should not be modified; changes may not affect the values of local variables used by the interpreter.

:wink:
yipyip
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Beitragvon HerrHagen » Dienstag 28. April 2009, 18:11

Mag denn niemand mehr exec? :D

Code: Alles auswählen

>>> for i in range(10):
   exec "var_%s = %s" % (i, i)

>>> var_6
6
BlackJack

Beitragvon BlackJack » Dienstag 28. April 2009, 21:15

@Dill: Da `None` ein "immutable" ist:

Code: Alles auswählen

var = [None] * 5
# ...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Mittwoch 29. April 2009, 13:43

Code: Alles auswählen

var = [...was auch immer... for i in xrange(5)]
MfG
HWK

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder