【问题标题】:the function map and reduce in python3python3中的函数map和reduce
【发布时间】:2019-01-27 04:57:54
【问题描述】:

map function 在 Python 3 中的返回值是一个 Iterator

为什么reduce function 在需要Iterable 时可以使用map 结果?

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from functools import reduce
def fn(x, y):
  return x * 10 + y
def char2num(s):
   digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
   return digits[s]
reduce(fn, map(char2num, '13579'))

【问题讨论】:

  • 您可以将map 的返回值传递给reduce,因为迭代器是可迭代的。 Iterable 只是意味着“你可以在上面调用iter”。如果您在迭代器上调用iter,您将再次获得相同的迭代器。请包含您的示例代码作为文本,而不是作为图像。查看文本并与之交互要容易得多(例如,我可以将其复制并粘贴到我自己的解释器中)。
  • 您可能对这个关于迭代器和可迭代对象之间区别的高度投票问题的答案感兴趣:stackoverflow.com/questions/9884132/… 我个人更喜欢我对这个更糟糕且现已关闭的问题的回答(但当然我' m 有偏差):stackoverflow.com/questions/40323783/…

标签: python python-3.x iterator


【解决方案1】:

reduce 函数可以使用 map 返回的迭代器,因为迭代器是一个可迭代对象。所有迭代器都有一个__iter__ 方法,该方法返回迭代器本身。这就是您需要可迭代的全部内容(返回迭代器的 __iter__ 方法,但在某些情况下您可以使用 __getitem__ 方法来代替)。

也就是说,有些人会在 iterator 不起作用时使用术语 iterable(也许是因为他们需要在多次相同的输入)。不幸的是,该可迭代对象子集没有一个精确的名称(尽管 sequence 通常是合适的)。

Python 文档通常对此非常好。如果它说一个函数需要一个可迭代的,那么迭代器应该总是可以接受的。如果一个函数或方法需要多次迭代输入(例如,str.join),如果输入不是可接受的类型,它将在内部构建自己的临时序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2017-04-26
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多