Как использовать python итераторов в чисто функциональном рабочем процессе - PullRequest
1 голос
/ 09 июля 2020

Меня беспокоит то, что итераторы python не подпадают под определение чистого неизменяемого объекта, поскольку повторный доступ к ним изменяет их поведение. Я понимаю, как это работает, но чтение кода с итераторами может сбивать с толку и не очень похоже на pythoni c.

Мой вопрос ... есть ли хороший способ pythoni c подойти к этому?

Т.е. использование итератора здесь приводит к побочному эффекту (входной аргумент изменяется) делает функцию нечистой.

def foo(i):
    return list(i)
b = iter([1,2,3])
print(foo(b)) # outputs [1,2,3]
print(foo(b)) # outputs [] 
print(list(b)) # outputs []

1 Ответ

0 голосов
/ 09 июля 2020

Проблема в вашем примере заключается в том, что состояние вашего итератора a находится в глобальной области видимости, которая уже конфликтует с правилом «без побочных эффектов». Как только он исчерпывается (например, возникает исключение throw StopIteration), он готов и должен быть повторно инициализирован.

from copy import copy
def foo(i):
    return list(i)

a = [1,2,3]
b = iter(a)
print(foo(copy(b))) # outputs [1,2,3]
print(foo(copy(b))) # outputs [1,2,3]
print(list(copy(b))) # outputs [1,2,3]
...