Как мы можем отправить переменную l oop в качестве аргумента функции в python - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу отправить значение i в функцию fun () и получить его в качестве 3-го аргумента в функции диапазона.

for i in range(1,11,fun(i)):
       print(i)

Ошибка, которую я получаю:

Name Error: name 'i' is not defined

Я пытался определить себя как глобальный, но это не сработало, потому что оба «я» имеют разные идентификаторы. например:

global i 
print(id(i))
for i in range(1,11,fun(i)):
     print(id(i))

, поэтому, пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Вы не можете сделать это с range(). Аргументы range() просто оцениваются один раз, когда запускается l oop, а не каждый раз через l oop, и он эффективно вычисляет весь список значений в начале (фактически он использует объект итератора внутри, но это не меняет это). Последовательность не может быть изменена в течение l oop.

. Сделайте это с while l oop, который пересчитывает i.

i = 1
while i < 11:
    print(i)
    i = fun(i)

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

def multrange(init, end, step):
    i = init
    while i < end:
        yield i
        i = i * step

for i in multrange(1, 11, 2):
    print(i)

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

def generic_range(init, end, stepper):
    i = init
    while i < end:
        yield i
        i = stepper(i)

for i in generic_range(1, 11, fun):
    print(i)
0 голосов
/ 21 февраля 2020

Как и в случае Barmar , функция range() оценивается только один раз. Требуемое поведение лучше всего достигается через некоторое время. L oop.

Однако, если вы хотите настаивать на значении l oop, вы можете изучить следующие варианты:

  1. Определите функцию генератора, а затем используйте for l oop, который повторяет ее ( ответ Бармара )

  2. Использование a for l oop с enumerate:

step = 0 # Initialize variable `step`
for index, x in enumerate(range(1, 30)):
    if index == step:
        print(x)
        # set the next index for which to
        # output a value
        step = fun(x) + index
...