加入列表:
>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'
join
必须接受一个可迭代的。
显然,join
的论据是[ str(_) for _ in xrange(10) ]
,它是一个list comprehension。
看看这个:
>>>''.join( str(_) for _ in xrange(10) )
'0123456789'
现在,join
的论点是str(_) for _ in xrange(10)
,没有[]
,但结果是相同的。
为什么?str(_) for _ in xrange(10)
是否也产生一个列表或一个迭代器?
发布于 2012-01-30 15:35:51
您的第二个示例使用生成器表达式而不是列表理解。不同之处在于,通过列表理解,可以完全构建列表并将其传递给.join()
。使用生成器表达式,项将一个接一个地生成并由.join()
使用。后者使用的内存更少,而且通常更快。
碰巧的是,列表构造函数将愉快地使用任何可迭代对象,包括生成器表达式。所以:
[str(n) for n in xrange(10)]
只是“语法糖”的意思:
list(str(n) for n in xrange(10))
换句话说,列表理解只是一个生成器表达式,它被转换为列表。
发布于 2012-01-30 15:33:22
这是一个生成器,而不是一个列表理解。生成器也是可迭代的,但它不是先创建整个列表,然后将其传递给join,而是逐个传递xrange中的每个值,这样效率会高得多。
发布于 2012-01-30 15:33:35
第二个join
调用的参数是一个生成器表达式。它确实产生了一个可迭代的。
https://stackoverflow.com/questions/9060653
复制相似问题