Python中any(not (i%6) for i in range(1,10))的参数是生成器还是列表?
问题解答:any()参数里的表达式是生成器还是列表?
嘿,这个问题问到点子上了——不少刚摸Python生成器的朋友都会在这个语法细节上犯迷糊!
先给你明确答案:any(not (i % 6) for i in range(1, 10))里的参数是生成器表达式,本质和你写any( (not (i % 6) for i in range(1, 10)) )完全等价。
核心语法细节
Python里有个语法糖:当生成器表达式是函数的唯一位置参数时,包裹它的外层圆括号可以省略。这就是为什么你看不到(),但它依然是生成器,而不是列表推导式——列表推导式必须用[]包裹,这一点是硬规则,没有省略的说法。
你可以自己验证一下:
# 直接查看表达式类型 print(type(not (i % 6) for i in range(1, 10))) # 输出 <class 'generator'> print(type([not (i % 6) for i in range(1, 10)])) # 输出 <class 'list'>
补充:什么时候不能省略括号?
如果生成器表达式不是函数的唯一参数,就必须把它用()包起来,比如:
# 错误写法:生成器不是唯一参数,没加括号会报错 any(not (i % 6) for i in range(1, 10), default=False) # 正确写法 any( (not (i % 6) for i in range(1, 10)), default=False )
简单总结一下:你看到的这个省略括号的写法,就是Python为了简化代码提供的语法糖,本质还是生成器表达式,和你手动加()的生成器完全一样,绝对不是列表推导式~
内容的提问来源于stack exchange,提问作者martin-h
相关产品推荐
相关产品推荐

