2017-02-26 122 views
4

如果我这样做,确实split()被调用每次迭代?:Python中的'in'运算符是“懒”吗?

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

我应该这样做,而不是有更好的表现?

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

这不是“懒”的意思。 – vartec

+0

@vartec你想介绍一下更多,还是完全不同的话题? – sooqua

+3

这实际上不是'in'运算符。尽管使用了相同的关键字,但它在列表理解中是一个“... ... ... ...”子句,尽管它并不完全相同。 – Blckknght

回答

1

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

这是因为迭代通过你的对象的值for循环在Python支持迭代 - 它不保留检查,对你可能在另一种语言看到一些条件语句,如通过下一个循环数组

因此,在这种情况下,post.split()产生您的对象,for循环然后迭代,不需要再次调用。


” -ness也是不正确的术语,被询问这里,因为它是指延迟表达式求值,直到它被严格需要的做法。这里我们当然需要需要来拨打post.split(),问题更多的是“效率”。请参阅Wiki上的Lazy evaluation以获得对策略的详细描述。

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 

你并不需要表达分成两个语句的性能。