Как динамически обновить значения аргументов в цикле Python? - PullRequest
2 голосов
/ 05 сентября 2010

Python newbie здесь:

Я пишу имитацию рынка в Python с использованием Pysage и хочу сгенерировать произвольное количество агентов (либо покупателей, либо продавцов), используя функцию mgr.register_actor(), следующим образом:

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

Что такое краткий, питонский способ запуска вызова этой функции, так что при каждом запуске цикла значения name, maxValuation, endowment и id изменяются, например, на name="buyer002", name="buyer003"...; maxValuation=95, maxValuation=90...; endowment=450, endowment=400...; "buyer002", "buyer003"...и т. д.

Я пробовал разные циклы for и списки, но пока не нашел способа динамически обновлять аргументы функции, не сталкиваясь с проблемами типа.

Заранее спасибо!

1 Ответ

4 голосов
/ 05 сентября 2010

Вы можете подготовить names, maxValuations и endowments как списки (или итераторы), а затем использовать zip для группировки соответствующих элементов:

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)

Что касается строки формата, '{i:0>3d}':

Я ссылаюсь на этот «шпаргалку», когда мне нужно создать строку формата:

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" | "%"

Итак, он ломается так:

   field_name 
  /
{i:0>3d}
    \\\\
     \\\`-type ("d" means integer)
      \\`-width 
       \`-alignment (">" means right adjust)
        `-fill character
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...