Python生成器用list转换与for循环遍历输出结果不一致原因求解
问题原因说明
你的问题和生成器能否搭配list()使用无关,核心错误是str()转换的对象错误、str.join()迭代的对象不符合预期。
Behaviour 1 错误原因
你写的代码执行顺序如下:
- 生成器表达式
random.randrange(100) for j in range(4)执行后,通过list()转换得到列表,比如[82,83,12,71] - 你直接对整个列表执行
str()转换,得到的是完整字符串"[82, 83, 12, 71]" ' '.join()接收的参数是可迭代对象,字符串本身可按单个字符迭代,因此会在每个字符之间插入空格,最终得到你看到的错位输出。
Behaviour 2 正确原因
你给' '.join()传入的参数是生成器str(random.randrange(100)) for i in range(4),生成器每次迭代返回的是单个数字转换后的字符串(比如"98"、"72"),join会直接把这4个字符串用空格拼接,自然符合预期。
Behaviour 1 修正方案
如果你确实需要先用list()触发生成器,要把str()转换作用在列表的每个元素上,而非整个列表:
# 写法1:保留list转换的版本 print(' '.join(str(x) for x in list(random.randrange(100) for j in range(4)))) # 写法2:无需手动转list,join本身会迭代生成器执行,更简洁 print(' '.join(str(random.randrange(100)) for j in range(4)))
认知误区澄清
list()确实可以触发生成器执行,这个认知没有问题,错误是你转换字符串的时机不对str.join()只要传入可迭代对象就会逐个遍历迭代,你之前给它传了字符串,它自然会按单个字符拆分处理,和生成器本身的功能无关
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

