我最近对python生成器进行了一些实验,我遇到了以下奇怪的行为,我很想知道为什么会发生这种情况,以及发生了什么情况:
def generating_test(n):
for a in range(n):
yield "a squared is %s" % a*a # Notice instead of a**2 we have written a*a
for asquare in generating_test(3):
print asquare
输出:
^{pr2}$与生成预期输出的以下脚本相比:
def generating_test(n):
for a in range(n):
yield "a squared is %s" % a**2 # we use the correct a**2 here
for asquare in generating_test(3):
print asquare
输出:
a squared is 0
a squared is 1
a squared is 4
这和发电机没有关系:
在乘法之前执行}作为参数,在
%
操作,使用字符串和第一个a
作为参数。您的a**2
起作用是因为**
操作以a
和{%
之前计算。在Python's order of operations是从左到右,除非PEMDAS适用。字符串插值运算符显然与模和乘法具有相同的优先级,因为如果您颠倒顺序,使乘法位于插值的左侧,则它优先:
然而,正如您所演示的,求幂运算胜过从左到右的顺序。在
更新:在这个same document under Binary Arithmetic Operations中,它陈述了一些表面上明显,但隐含相关的东西:
虽然这似乎只是告诉你
%
运算符做了什么,但我认为它的位置和上下文也告诉你,无论它是用作模还是插值都具有相同的优先级。在当你观察到意想不到的行为时,开始你的分析,把它提炼成最简单的情况。一个简单的案例更容易研究和理解。在
意外行为:
(您期望
'hello 6'
)我们认为Python必须将命令解释为}。我们试着用括号强迫第二种解释
^{pr2}$'hello 3' * 2
,而不是{尤里卡!在
我们已经证明了字符串格式化运算符
%
的优先级高于或等于乘法。我们检查Python文档-是的,它确认了http://docs.python.org/reference/expressions.html#summary为了确认优先级相等,我们可以用另一种方法:
由于逗号(,)是重复的,我们推断乘法
"%d," * 2
是在字符串格式化%
之前执行的。如果乘法可以先于字符串格式,而字符串格式先于乘法,则它们的优先级必须相等。在相关问题 更多 >
编程相关推荐