为什么yield函数在Python中不需要括号?

时间:2015-07-17 03:41:40

标签: python python-2.7 python-3.x yield-keyword

在Python中,我多次看到用于创建生成器的yield函数。这个和print函数在技术上都执行方法的操作,因为它们返回一个值。但是,在从Python 2更改为Python 3期间,print函数获得了括号,就像普通的方法调用一样,但是yield保持不变。此外,yield获得保留关键字的淡黄色,而print是保留方法的紫色。为什么yield不被视为一种方法,并且不使用括号语法而以这种方式着色?

(同样,为什么return也没有括号?)

让我添加一些东西,yield和continue也没有在许多其他语言中给出括号。我只是想知道是什么让它与保留不同。还有许多其他保留方法可以获得括号。

4 个答案:

答案 0 :(得分:15)

所以我去寻找答案。 And it turns out, there is one。从PEP 255开始,为我们提供了yield关键字

  

Q值。为什么新的关键字为"产生"?为什么不是内置函数呢?

     

一个。通过Python中的关键字更好地表达控制流          产量是一种控制结构。它还认为效率很高          Jython中的实现要求编译器能够          在编译时确定潜在的暂停点,以及新的          关键字使这很容易。 CPython参考实现也          大量利用它来检测哪些函数 生成器 -          函数(虽然用一个新关键字代替" def"会解决这个问题          对于CPython - 但人们会问"为什么要使用新关键字?"题          不想要任何新关键字。)

     问:那么为什么不使用新关键字的其他特殊语法呢?对于          例如,其中一个而不是"产生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
  答:我错过了吗?在数百条消息中,我计算了三条消息          建议这样的替代方案,并从中提取上述内容。          不需要新的关键字,但更好的收益率会很好          非常清楚 - 我不想推断收益率          通过理解先前无意义的序列而发生的          关键字或运算符。不过,如果这引起足够的兴趣,          支持者应该基于单一的共识建议和Guido          将在上面发表。

答案 1 :(得分:8)

public static char getKeyCharacter(){ Scanner inputStream = new Scanner(System.in); boolean stop = false; String firstPrompt, strKeyCharacter; char keyCharacter = ' '; while(!stop){ firstPrompt = "Please enter a SINGLE character to act as key: "; System.out.println(firstPrompt); strKeyCharacter = inputStream.nextLine(); //check if the input contains only 1 character boolean isSingleChar = (strKeyCharacter.length() == 1); //check if the input character is within the ASCII code of 97 (a) to 122 (z) boolean isValidChar = strKeyCharacter.charAt(0) >= 97 && strKeyCharacter.charAt(0) <= 122; if(isSingleChar && isValidChar){ keyCharacter = strKeyCharacter.charAt(0); stop = true; } } return keyCharacter; } 并不是一个获得括号的函数:它从一个语句变为一个函数。 print仍然是一个声明,如yield。语法突出显示特定于您的开发环境。

您可以找到有关the difference between expressions and statements here的更多信息,以及有关the difference between functions and statements here的更多信息。另请参阅有关simple statementscompound statements的文档。

答案 2 :(得分:2)

yield不是函数,它是一个关键字,根据its grammar不需要括号 -

  

yield_atom :: =&#34;(&#34; yield_expression&#34;)&#34;

     

yield_expression :: =&#34;产量&#34; [expression_list]

print曾经是Python 2中的一个语句,但它使用PEP 3105

更改为Python 3中的内置函数

答案 3 :(得分:1)

print是由Python 2中的语言规范定义的关键字,并成为内置函数(由标准库规范)Python 3. yield曾经是,现在仍然是关键字