1

有 map、reduce、filter 函数来进行列表理解。

xrange将参数或range参数传递给每个函数有什么区别?
例如:

map(someFunc, range(1,11))

或者

map(someFunc,xrange(1,11))
4

3 回答 3

4

在 Python 2 中,range返回一个实际列表,同时xrange返回一个可以迭代的生成函数。由于map只关心它迭代一个序列,因此两者都适用,尽管xrange使用较少的内存。Python 3 的xrangereplaces range,所以你唯一的选择是用来range返回一个生成函数。(如果需要,您可以使用它[i for i in range(10)]来生成实际范围。)

模运算符返回0偶数的假值: 2 mod 2 为 0。因此,偶数被过滤掉。

于 2012-11-24T01:52:44.197 回答
2

实际上,mapreducefilter函数是列表推导式的替代方案。术语“列表理解”是指特定的句法结构;任何看起来不像列表推导的东西不一定是列表推导。

它们实际上早于列表推导,并且是从其他语言中借来的。但是这些语言中的大多数都有构建匿名函数的方法,这些方法比 Python 更强大lambda,因此这些函数更自然。列表推导被认为更适合 Python。

rangeand之间的区别在于xrangerange实际上构造了一个包含构成范围的数字的列表,而 anxrange是一个知道其端点并且可以迭代自身的对象,而无需实际在内存中构造完整的值列表。 xrange(1,1000)占用的空间不超过xrange(1,5),而range(1,1000)生成一个包含 999 个元素的列表。

于 2012-11-24T01:56:01.673 回答
2

如果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
于 2012-11-24T02:07:26.277 回答