Почему я получаю пустой список, если я добавляю «else» к своей функции?

1

Если я выполню этот фрагмент кода, я получаю пустой список:

#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]

Почему это происходит, что я не понимаю о генераторах?

Теги:
python-3.x
if-statement
generator
yield

1 ответ

3
Лучший ответ

Используя ключевое слово yield, вы фактически создаете "генератор", а не функцию. Как вы можете видеть в этой ссылке (PEP-380 https://www.python.org/dev/peps/pep-0380/) в генераторе, return value оператора семантически эквивалентно raise StopIteration(value). Дело в том, что если вы хотите создать функцию или генератор, не смешивайте ключевое слово yield и return.

Возможная модификация: измените результат выражения first if чтобы он не использовал ключевое слово return, т.е. Использовал yield и вручную реализовал вызов диапазона.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню