有 map、reduce、filter 函数来进行列表理解。
xrange
将参数或range
参数传递给每个函数有什么区别?
例如:
map(someFunc, range(1,11))
或者
map(someFunc,xrange(1,11))
在 Python 2 中,range
返回一个实际列表,同时xrange
返回一个可以迭代的生成函数。由于map
只关心它迭代一个序列,因此两者都适用,尽管xrange
使用较少的内存。Python 3 的xrange
replaces range
,所以你唯一的选择是用来range
返回一个生成函数。(如果需要,您可以使用它[i for i in range(10)]
来生成实际范围。)
模运算符返回0
偶数的假值: 2 mod 2 为 0。因此,偶数被过滤掉。
实际上,map
、reduce
和filter
函数是列表推导式的替代方案。术语“列表理解”是指特定的句法结构;任何看起来不像列表推导的东西不一定是列表推导。
它们实际上早于列表推导,并且是从其他语言中借来的。但是这些语言中的大多数都有构建匿名函数的方法,这些方法比 Python 更强大lambda
,因此这些函数更自然。列表推导被认为更适合 Python。
range
and之间的区别在于xrange
它range
实际上构造了一个包含构成范围的数字的列表,而 anxrange
是一个知道其端点并且可以迭代自身的对象,而无需实际在内存中构造完整的值列表。 xrange(1,1000)
占用的空间不超过xrange(1,5)
,而range(1,1000)
生成一个包含 999 个元素的列表。
如果range()
和xrange()
是用 Python 语言实现的,它们看起来像这样:
def xrange(start, stop=None, step=1):
if stop is None: stop, start = start, 0
i = start
while i < stop:
yield i
i += step
def range(start, stop=None, step=1):
if stop is None: stop, start = start, 0
acc, i = [], start
while i < stop:
acc.append(i)
i += step
return acc
如您所见,range()
创建一个列表并返回它,同时xrange()
根据需要延迟生成一个范围内的值。这样做的好处是避免了创建列表的开销xrange()
,因为它不存储值或创建列表对象。在大多数情况下,最终结果没有区别。
一个明显的区别是xrange()
不支持切片:
>>> range(10)[2:5]
[2, 3, 4]
>>> xrange(10)[2:5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
>>>
但它确实支持索引:
>>> xrange(11)[10]
10