Почему функция 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 был и есть ключевое слово.