python: `for i в obj.func ()` перезапускает `func` каждую итерацию? - PullRequest
2 голосов
/ 13 сентября 2010

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

for a in object.a_really_huge_function():
    print a

Чтобы не запускать a_really_huge_function несколько раз, я привык делать это на других языках:

a_list = object.a_really_huge_function()
for a in a_list:
    print a

Это необходимо в Python? Будет ли деталь после in выполняться на каждом цикле?

Ответы [ 3 ]

7 голосов
/ 13 сентября 2010

Переводчик Python - ваш друг.

>>> def some_func():
...     print 'in some_func'
...     return [1, 2, 3, 10]
... 
>>> for a in some_func():
...     print a
... 
in some_func
1
2
3
10

Короче говоря, нет, его вызывают один раз.

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

Вы также можете использовать генераторы, чтобы избежать выдачи огромных результатов, отказавшись от управления после каждого шага алгоритма, следующим образом:

def a_really_huge_fuction(huge_number):
    i = 0
    while i < huge_number:
        yield i   # Relinquishes control to caller, resume execution at next line
        i = i + 1

В этом случае функция вызывается один раз, но ее выполнение распространяется на всеhuge_number разное время.Подробнее см. Документацию yield .

1 голос
/ 13 сентября 2010

Это не обязательно.

for a in object.a_really_huge_function():

звонит a_really_huge_function только один раз.

Единственное преимущество сохранения результата в переменной - это если вы вызываете ту же функцию в другом месте вашего кода.

Если функция возвращает список, вы могли бы добиться большего успеха с точки зрения использования памяти, если бы object.a_really_huge_function() вернул итератор , но в остальном у вас все в порядке.

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