Python 3中map
function的返回值是 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'))
答案 0 :(得分:0)
reduce
函数可以使用map
返回的迭代器,因为迭代器是一个可迭代的对象。所有迭代器都有一个__iter__
方法,该方法返回迭代器本身。这就是您需要迭代的全部内容(一个返回迭代器的__iter__
方法,尽管在某些情况下,您可以使用__getitem__
方法进行迭代)。
也就是说,当 iterator 不会使用时,少数人会不小心使用术语,而使用术语 iterable (也许是因为他们需要迭代几次相同的输入)。不幸的是,该可迭代子集没有一个确切的名称(尽管通常使用 sequence 序列)。
Python文档对此通常非常好。如果说函数期望可迭代,则迭代器应始终可接受。如果某个函数或方法需要对输入进行多次迭代(例如str.join
),则如果输入的类型不是可接受的,它将在内部建立自己的临时序列。