Если я выполню этот фрагмент кода, я получаю пустой список:
#quick.py
def test(key):
print('the input key is:',key)
if key==1:
return range(1,13)
else:
month = ['15','30']
for i in range(1,53):
if i==4:
yield '2904'
else:
str_i = str(i)
if i<10:
str_i= '0'+str_i
yield month[0] + str_i if i % 2 else month[1] + str_i
my_list = list(test(1))
print('the list is :' ,my_list)
pc@pc-host:~/Git/PasivicSerious$ python3 quick.py
the input key is: 1
the list is : []
но без "else" я получаю свой желаемый список:
def test(key):
print('the input key is:',key)
if key==1:
return range(1,13)
# else:
# month = ['15','30']
# for i in range(1,53):
# if i==4:
# yield '2904'
# else:
# str_i = str(i)
# if i<10:
# str_i= '0'+str_i
# yield month[0] + str_i if i % 2 else month[1] + str_i
my_list = list(test(1))
print('the list is :' ,my_list)
pc@pc-host:~/Git/PasivicSerious$ python3 quick.py
the input key is: 1
the list is : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Почему это происходит, что я не понимаю о генераторах?
Используя ключевое слово yield
, вы фактически создаете "генератор", а не функцию. Как вы можете видеть в этой ссылке (PEP-380 https://www.python.org/dev/peps/pep-0380/) в генераторе, return value
оператора семантически эквивалентно raise StopIteration(value)
. Дело в том, что если вы хотите создать функцию или генератор, не смешивайте ключевое слово yield
и return
.
Возможная модификация: измените результат выражения first if
чтобы он не использовал ключевое слово return
, т.е. Использовал yield
и вручную реализовал вызов диапазона.