Python生成器表达式括号奇异性

23 投票
2 回答
3638 浏览
提问于 2025-04-17 13:05

我想检查一个列表里是否包含某个字符串,所以我用了一个生成器表达式,像这样:

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 个回答

3

这是“合法”的,并且是明确支持的。一般来说,规则是“((x))总是和(x)一样”(当然,(x)并不总是和一样),这个规则在生成器表达式中使用,主要是为了方便。

23

这是合法的,通常来说,你确实需要在生成器表达式周围加上括号。不过有个特别的例外,如果是调用一个只有一个参数的函数,那个函数的括号也算在内。 (文档)

注意,检查 my_string 是否在 my_list 中非常简单,只需要这样做:

my_string in my_list

根本不需要生成器表达式或者调用 any()

撰写回答