Предполагается ли выход python?
У меня есть цикл for, который проверяет ряд условий. На каждой итерации он должен давать выход только для одного из условий. Конечная доходность является значением по умолчанию, если ни одно из условий не является истинным. Должен ли я поместить продолжение после каждого блока урожаев?
def function():
for ii in aa:
if condition1(ii):
yield something1
yield something2
yield something3
continue
if condition2(ii):
yield something4
continue
#default
yield something5
continue
Ответы
Ответ 1
Вместо использования оператора continue
я бы предложил использовать записи elif
и else
:
def function():
for ii in aa:
if condition1(ii):
yield something1
yield something2
yield something3
elif condition2(ii):
yield something4
else: #default
yield something5
Это кажется мне более читаемым.
Ответ 2
НЕТ, выход не подразумевает продолжение, он только начинается в следующей строке, в следующий раз. Простой пример демонстрирует, что
def f():
for i in range(3):
yield i
print i,
list(f())
Это печатает 0,1,2, но если выход будет продолжаться, он не будет
Ответ 3
yield
в Python прекращает выполнение и возвращает значение. Когда итератор вызывается снова, он продолжает выполнение сразу после инструкции yield
. Например, генератор, определенный как:
def function():
yield 1
yield 2
будет возвращать 1
, затем 2
последовательно. Другими словами, требуется continue
. Однако в этом случае elif
и else
, как описано в flashk, безусловно, являются правильными инструментами.
Ответ 4
continue
пропускает оставшийся блок кода, но код кода после yield
выполняется, когда next()
снова вызывается на генераторе. yield
действует как приостановка выполнения в определенной точке.
Ответ 5
Если что-то есть простое значение, а условия - проверки для равенства, я бы предпочел сделать этот поиск в словаре "case structure":
ii_dict={'a':('somethinga1','somethinga2','somethinga3'),'b':('somethingb1',)}
ii_default = ('somethingdefault',)
aa='abeabbacd'
def function():
return (value
for ii in aa
for value in (ii_dict[ii] if ii in ii_dict else ii_default))
for something in function(): print something
Ответ 6
Этот путь более понятен, надеюсь, это поможет, также спасибо Anurag Uniyal.
def f():
for i in range(3):
yield i
print(i+10)
list(f())
----------- после запуска ------------
10
11
12
[0, 1, 2]