Использовать any () или all () с логами оператора break c in Python? - PullRequest
0 голосов
/ 04 марта 2020

Это работает:

def gen():
    yield False
    yield True
    yield oups

if any(gen()):
    print('At least one is True')

# At least one is True

Но это не удается:

if any(iter([False, True, oups])):
    print('At least one is True')

# NameError: name 'oups' is not defined

Есть ли способ преобразовать второй код в первый без особых усилий?

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

С gen, oups - это просто свободная переменная, поиск которой никогда не происходит; any прекращает использование генератора, возвращенного gen, прежде чем это станет необходимым.

При iter([False, True, oups]), однако, сначала необходимо полностью создать список [False, True, oups], чтобы его можно было передать в iter чтобы вернуть список итератор. Чтобы сделать то, что , должен произойти поиск oups, и поскольку он не определен, мы получаем NameError до iter, не говоря уже о any, даже работающем. Второй код оценивается так же, как

t1 = [False, True, oups]  # NameError here
t2 = iter(t1)
if any(t2):
    print('At least one is True')
1 голос
/ 04 марта 2020

Обе части кода технически некорректны, так как вы не определили «upps».
Это можно показать, исчерпав итератор следующим образом:

def gen():
    yield False
    yield True
    yield oups

g = gen()
print(next(g))
print(next(g))
#this next line will break, as it reaches the undefined variable
print(next(g))  

функция any () будет остановите работу, как только он достигнет первого оператора True и вернет True. Это можно показать, переставив в ваших операторах yield первый True после неопределенной переменной, который также сломается:

def gen():
    yield False
    yield oups
    yield True

if any(gen()):
    print('At least one is True')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...