Python生成器表达式括号的奇怪之处

23

我想确定一个列表中是否包含某个字符串,因此我使用了生成器表达式,代码如下:

g = (s for s in myList if s == myString)
any(g)
当然我想要内联这个东西,于是我这样做:
any((s for s in myList if s == myString))

我认为如果使用单括号会更好看,所以我尝试:

any(s for s in myList if s == myString)

我并不指望它能正常工作。惊奇吧,它居然工作了!

那么这是合法的Python代码还是只是我的实现可以允许的? 如果是合法的,这里的一般规则是什么?

2个回答

23

合法的。一般规则是,在生成器表达式周围需要加上括号。有一个特殊例外,即对于只有一个参数的函数调用,括号也会计算在内。(文档)

请注意,测试my_string是否出现在my_list中就像这样简单:

my_string in my_list

不需要生成器表达式或调用any()函数!


谢谢回答。我尝试了 my_string in my_list,但是它无法找到一个存在的字符串。我得出结论它执行的是对象比较而不是值比较,而我需要的是值比较。我会再检查一遍。 - Ari
1
@Ari:不,它进行值比较。我不知道你的情况出了什么问题。 - Sven Marnach

3

这是“合法”的,并且得到明确支持。通常的规则是,“((x))”总是与“(x)”相同(当然,(x)并不总是与x相同),而且出于方便起见,也适用于生成器表达式。


3
为了澄清,这里的 x 并不是代表任何东西的占位符。当然,f((a, b))f(a, b) 是不同的。 - Sven Marnach
1
是的,确实,它是一个单个表达式的占位符。 - Thomas Wouters
你能提供这个规则的参考资料吗(即((x))始终等同于(x))? - Ari
2
@Ari:请看这里:"括号表达式列表返回与该表达式列表相同的内容。"虽然通常不适用于函数调用中的括号,但对于生成器表达式来说,这是一个特殊的例外情况。 - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接