2010-09-05 5 views
2

débutant Python ici:Comment faire pour mettre à jour dynamiquement des valeurs aux arguments dans la boucle Python?

J'écris une simulation de marché en Python en utilisant Pysage, et que vous voulez générer un nombre arbitraire d'agents (acheteurs ou vendeurs) en utilisant la fonction mgr.register_actor(), comme suit:

for name, maxValuation, endowment, id in xrange(5): 
    mgr.register_actor(Buyer(name="buyer001", maxValuation=100, endowment=500),"buyer001") 
    update name, maxValuation, endowment, id 

Quelle est la manière succincte et pythonique d'exécuter cet appel de fonction de sorte que, chaque fois que la boucle est exécutée, les valeurs de name, maxValuation, endowment et id sont modifiées, par exemple à name="buyer002", name="buyer003"...; maxValuation=95, maxValuation=90...; endowment=450, endowment=400...; "buyer002", "buyer003"... et ainsi de suite.

J'ai essayé différentes configurations de boucles et de listes, mais je n'ai pas encore trouvé le moyen de mettre à jour dynamiquement les arguments de la fonction sans rencontrer de problèmes de type.

Merci d'avance!

Répondre

4

Vous pouvez préparer le names, maxValuations et endowments sous forme de listes (ou itérateurs), puis utilisez zip pour regrouper les éléments correspondants ensemble:

names=['buyer{i:0>3d}'.format(i=i) for i in range(1,6)] 
maxValuations=range(100,75,-5) 
endowments=range(500,250,-50) 
for name, maxValuation, endowment in zip(names,maxValuations,endowments): 
    mgr.register_actor(
     Buyer(name=name, maxValuation=maxValuation, endowment=endowment),name) 

En ce qui concerne la chaîne de format, '{i:0>3d}':

Je me réfère à cette "feuille de triche" quand j'ai besoin de construire une chaîne de format:

http://docs.python.org/library/string.html#format-string-syntax 
replacement_field ::= "{" field_name ["!" conversion] [":" format_spec] "}" 
field_name  ::= (identifier|integer)("."attribute_name|"["element_index"]")* 
attribute_name ::= identifier 
element_index  ::= integer 
conversion  ::= "r" | "s" 
format_spec  ::= [[fill]align][sign][#][0][width][.precision][type] 
fill    ::= <a character other than '}'> 
align    ::= "<" | ">" | "=" | "^" 
         "=" forces the padding to be placed after the sign (if any) 
          but before the digits. (for numeric types) 
sign    ::= "+" | "-" | " " 
         " " places a leading space for positive numbers 
width    ::= integer 
precision   ::= integer 
type    ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | 
         "o" | "x" | "X" | "%" 

Ainsi, il se décompose comme ceci:

field_name 
/
{i:0>3d} 
    \\\\ 
    \\\`-type ("d" means integer) 
     \\`-width 
     \`-alignment (">" means right adjust) 
     `-fill character 
+0

+1: méthode que je aime vraiment le (relativement) nouveau format de chaîne(). J'ai été principalement coincé dans 2.5.x pour des raisons héritées et n'ai pas relu les docs pour de nouvelles choses dans 2.6/3.x. Merci! –

+0

Merci, cela a fait l'affaire. Je suis toujours en train d'essayer de comprendre comment fonctionne le bit '{i: 0> 3d}' et je vais lire les docs de mini-langage de format. – Tiresias

Questions connexes