是' in'操作员"懒惰"在Python?

时间:2017-02-26 01:19:03

标签: python python-3.x

如果我这样做,每次迭代都会调用split()吗?:

a = [word for word in post.split() if len(word) > 10]

为了获得更好的表现,我应该这样做吗?

s = post.split()
a = [word for word in s if len(word) > 10]

2 个答案:

答案 0 :(得分:3)

post.split()只被调用一次。您可以通过将post.split()替换为每次调用时打印的函数来验证它:

>>> post = 'a b c d'
>>> def split_post():
...     print('split_post is called')
...     return post.split()
... 
>>> a = [word for word in split_post() if len(word) > 10]
split_post is called

您不需要将表达式划分为两个声明来表现。

答案 1 :(得分:1)

单个表达式很好 - post.split()只会被调用一次。

这是因为Python 中的for循环通过支持迭代的对象的值迭代 - 它不会继续检查您可能在另一种语言中看到的某些条件语句,比如在C中循环一个数组。

所以在这种情况下,post.split()产生你的对象,然后for循环遍历,不需要再次调用。

lazy ” - 这也不是在这里询问的正确术语,因为它指的是在严格需要之前推迟表达评估的做法。在这里,我们当然需要来致电post.split(),问题更多的是“效率”。有关策略的详细说明,请参阅Wiki上的Lazy evaluation