Почему функция yield не требует круглых скобок в Python?
в Python я много раз видел yield
функция, используемая для создания генератора. И это и print
функция технически оба выполняют действие методов, потому что они возвращают значение. Однако во время перехода с Python 2 на Python 3 print
функция получила круглые скобки, как обычный вызов метода, но yield осталась прежней. Кроме того,yield
получает желтоватый цвет зарезервированного ключевого слова в то время как print
- фиолетовый цвет зарезервированного метода. Почему это yield
не рассматривали метод и окрашивали таким образом, не используя синтаксис скобок?
(в аналогичном ключе, почему return
также отсутствуют скобки?)
позвольте мне добавить еще несколько вещей, yield и continue не указаны скобки на многих других языках. Я просто хотел знать, что отличает его от того, что он зарезервирован. Есть много других зарезервированных методов, которые получают круглые скобки.
4 ответов
поэтому я пошел копать для ответа. и оказывается, есть один. Из PEP 255, pep, который дал нам yield
ключевое слово
Q. почему новое ключевое слово для "yield"? Почему не встроенная функция вместо этого?
A. поток управления намного лучше выражается через ключевое слово в Python, и выход-это управляющая конструкция. Также считается, что эффективно реализация в Jython требует, чтобы компилятор мог определить потенциальные точки приостановки во время компиляции и ключевое слово делает это легко. Реализация ссылки CPython также использует его сильно, чтобы определить, какие функции are генератор- функции (хотя новое ключевое слово вместо "def" решило бы это для CPython -- но люди спрашивают "почему новое ключевое слово?" вопрос не хочу никакого нового ключевого слова).
Q: тогда почему бы не какой-то другой специальный синтаксис без новое ключевое слово? Для например, один из них вместо "yield 3":
return 3 and continue
return and continue 3
return generating 3
continue return 3
return >> , 3
from generator return 3
return >> 3
return << 3
>> 3
<< 3
* 3
A: я пропустил один ? Из сотен сообщений я насчитал три. предложив такую альтернативу, и извлек из них вышеперечисленное. Было бы неплохо не нуждаться в новом ключевом слове, но лучше сделать yield очень ясно - я не хочу этого!--10-->вывести что выход происходящее из осмысления ранее бессмысленной последовательности из ключевые слова или операторы. Тем не менее, если это привлекает достаточный интерес, сторонники должны согласиться на единое консенсусное предложение, и Guido будет произносить на нем.
print
не была функцией, которая получила круглые скобки: она превратилась из оператора в функцию. yield
по-прежнему является утверждением, как return
. Подсветка синтаксиса специфична для среды разработки.
вы можете найти более подробную информацию о разница между выражениями и утверждениями здесь и разница между функциями и операторами здесь. Также смотрите документацию по простой заявления и составные операторы.
yield
не является функцией, это ключевое слово, и оно не требует скобок в соответствии с грамматика -
yield_atom ::= "(" yield_expression ")"
yield_expression :: = "yield" [expression_list]
print
раньше был оператором в Python 2, но он был изменен на встроенную функцию в Python 3 с помощью PEP 3105
print
был ключевое слово определено спецификация языка в Python 2, и стал builtin функция (определяется стандартной спецификацией библиотеки) Python 3. yield
был и есть ключевое слово.