【问题标题】:list comprehension functions in pythonpython中的列表理解函数
【发布时间】:2012-11-12 07:40:20
【问题描述】:

有 map、reduce、filter 函数来进行列表推导。

xrange 参数或range 参数传递给这些函数有什么区别?
例如:

map(someFunc, range(1,11))

map(someFunc,xrange(1,11))

【问题讨论】:

  • 提出单独的问题,而不是模糊相关的问题。你会得到更好的答案。
  • @WaleedKhan 好的,我将从这里删除第二个问题 :)
  • 这些问题的答案取决于您使用的 python 版本,仅供参考。
  • @JoelCornett 哦,我不知道。好吧,我使用的是 python 2.7。
  • List comprehensions 是一种(通常更好)生成列表的方法,其功能与map()filter() 相似,但语法通常更易读。

标签: python map filter reduce


【解决方案1】:

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

模运算符返回0,对于偶数来说是一个假值:2 mod 2 is 0。因此,偶数被过滤掉了。

【讨论】:

  • 那我用xrange调用这些函数还是用range调用这些函数没有区别?
  • 最终的结果是一样的,但是xrange会用更少的资源来做。​​
  • 正如你所说,在 python 3 中,range 函数变成了 xrange?那么其实python 3中没有python 2.7的范围? (创建列表的函数)。
  • @Lior 否,但您可以按照说明使用列表理解。你也可以使用list(range(10)) 来达到同样的效果。
  • 好的,谢谢你的帮助:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果 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
    

    【讨论】:

    • 感谢您的评论,很有帮助。
    • @Lior:没问题。我意识到它来的有点晚(Waleed 的回答很棒),但那时我已经几乎完成了我的回答:p
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多