2013-03-27 67 views
0
表达式的执行

我正在学习Python和这里的一个代码,我不能完全得到:订单在Python

text = 'zip is very zipped' 
print text.find('zip', text.find('zip') + 1) 

现在,我知道这是实现的一个捷径:

text = 'zip is very zipped' 
occur_once = text.find('zip') 
print text.find('zip', occur_once + 1) 

我在想,

print text.find('zip', text.find('zip') + 1) 

工作和以什么顺序的Python评估这些表达式?这种'执行'的命令是否有名字?

回答

2

Python将在函数调用中评估从左到右的参数,然后执行函数本身。

General evaluation order is left to right

+0

我敢肯定,函数值(不是它的返回值,但函数本身)在参数之前进行计算。如果其中一个参数是带有副作用(改变函数定义)的函数调用,那么这很重要,这在代码不是专门为测试而设计的代码中是不太可能发生的。 – Blckknght 2013-03-27 22:33:36

+0

@Blckknght啊,我会澄清我的意思,那就是函数被执行。确实可以在参数列表之前对可调用对象进行评估。 – 2013-03-27 22:34:06

+0

你可以举一个例子来说明如何应用这个: print text.find('zip',text.find('zip')+ 1) – daremkd 2013-03-28 20:21:20

3

Python使用strict (eager) evaluation strategy:函数的参数总是在函数应用之前完全评估。评估为了left to right(评估转让时除外):

不降入属性查询:

  1. 评估text.find(我们将其命名结果F1)
  2. 评估'zip' → A1
  3. 评价text.find → F2
  4. 评价'zip' → A2
  5. 呼叫F2.__call__(A2)(我们将调用的返回值R1)(text.find('zip')
  6. 评估1 → A3
  7. 呼叫R1.__add__(A3)(返回R2)(R1 + 1
  8. 电话F1.__call__(A1, R2)(返回最终结果) (text.find('zip', R2)
+0

我觉得5实际上发生在6之后,'dis.dis'似乎与我同意。 – 2013-03-27 22:45:24

+0

有道理,参数'__add__'应从左向右充分评估,谢谢。 – 2013-03-27 22:48:27

+0

这些___变量是什么?我从Python开始,并不能真正理解这些意思。 – daremkd 2013-03-28 20:21:59

1

它被称为operator precedenceevaluation order。在表达式中,应用运算符优先级,并使用每个表达式使用评估顺序。

text.find()呼叫出现在+加法运算符之前,因为它具有更高的优先级。

对于同等优先级的运营商,评估从左到右。在函数调用中,每个参数都是一个单独的表达式,因此这些从左到右进行评估。