"Каковы преимущества использования ключевого слова def для генераторов и функций?"
Хотя они механически различны, на практике, когда я их использую, они часто концептуально для меня одинаковы (я не особо думаю о вызовах range()
против xrange()
).
С точки зрения понимания, что такое функция быстро, я согласен, что с использованием чего-то теряется def
, но вещи не должны быть слишком запутанными внутри функции для начала.
Даже неявное return None
может привести к путанице в предполагаемом поведении функции после долгих условных return None
выражений (например, было задумано как конечное поведение или недосмотр в логике). Но это всего лишь мое мнение об этом.
Я не чувствую, что мой аргумент особенно убедителен, поэтому я просто отложу рассмотрение до 255 :
Проблема: введите другое новое ключевое слово (скажем, «gen» или «generator») вместо «def» или иным образом измените синтаксис, чтобы отличать функции генератора от функций, не являющихся генераторами.
Против: На практике (как вы к ним относитесь) генераторы - это
функции, но с той неожиданностью, что они возобновимы. Механика их установки - сравнительно небольшая техническая проблема, и введение нового ключевого слова бесполезно переоценивает механику начала работы генераторов (жизненно важная, но крошечная часть жизни генератора).
Pro: На самом деле (как вы о них думаете), функции-генераторы на самом деле являются фабричными функциями, которые производят итераторы-генераторы, как по волшебству. В этом отношении они радикально отличаются от функций, не являющихся генераторами, и действуют скорее как конструктор, чем как функция, поэтому повторное использование «def» в лучшем случае сбивает с толку. Утверждение «yield», скрытое в теле, не является достаточным предупреждением о том, что семантика настолько различна.
BDFL: «def» остается. Никакие аргументы с обеих сторон не являются полностью убедительными, поэтому я обратился к интуиции моего дизайнера языков. Это говорит мне, что синтаксис, предложенный в PEP, абсолютно правильный - не слишком горячий и не слишком холодный. Но, как и Oracle в Delphi в греческой мифологии, он не говорит мне, почему, поэтому у меня нет опровержения аргументов против синтаксиса PEP. Лучшее, что я могу придумать (кроме того, что согласен с опровержениями ... уже сделано), это "FUD". Если бы это было частью языка с первого дня, я очень сомневаюсь, что это сделало бы страницу Эндрю Кучлинга "Python Warts".