在Python中,我多次看到用于创建生成器的yield
函数。这个和print
函数在技术上都执行方法的操作,因为它们返回一个值。但是,在从Python 2更改为Python 3期间,print
函数获得了括号,就像普通的方法调用一样,但是yield保持不变。此外,yield
获得保留关键字的淡黄色,而print
是保留方法的紫色。为什么yield
不被视为一种方法,并且不使用括号语法而以这种方式着色?
(同样,为什么return
也没有括号?)
让我添加一些东西,yield和continue也没有在许多其他语言中给出括号。我只是想知道是什么让它与保留不同。还有许多其他保留方法可以获得括号。
答案 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 statements和compound 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
答案 3 :(得分:1)
print
是由Python 2中的语言规范定义的关键字,并成为内置函数(由标准库规范)Python 3. yield
曾经是,现在仍然是关键字。