Python: определение функций на лету - PullRequest
4 голосов
/ 08 февраля 2010

У меня есть следующий код:

 funcs = []
 for i in range(10):
   def func():
      print i
   funcs.append(func)

 for f in funcs:
   f()

Проблема в том, что func переопределяется. Т.е. вывод кода:

9
9
9
...

Как бы вы решили это без определения новых функций?

Оптимальным решением было бы изменить имя функции. То есть:

for i in range(10):
   def func+i():
...

(или какой-то другой странный синтаксис)

Ответы [ 3 ]

13 голосов
/ 08 февраля 2010

Проблема не в том, что func перезаписывается, а в том, что значение i вычисляется при вызове функции, а не при ее определении. Если вы хотите оценить i во время определения, поместите его в объявление функции в качестве аргумента по умолчанию func.

funcs = []
for i in range(10):
    def func(value=i):
        print value
    funcs.append(func)

for f in funcs:
    f()

Аргументы по умолчанию оцениваются один раз, когда функция определена, поэтому инкрементный цикл не повлияет на них. Это сработало бы так же хорошо, если бы вы использовали

def func(i=i):
    print i

но я использовал имя value, чтобы было понятно, какое имя используется в функции.

0 голосов
/ 09 февраля 2010

Вы можете попробовать

for i in range(10):
    def func(j=i):
        print j
    funcs.append(func)
for f in funcs:
    f()
0 голосов
/ 08 февраля 2010

Возвращение func из другой функции наиболее безопасно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...