在 Python 2 中,一个常见的(旧的、遗留的)习惯用法是map
使用如下形式连接长度不均匀的迭代器map(None,iter,iter,...)
:
>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]
在 Python 2 中,它被扩展,使得最长的迭代器是返回列表的长度,如果一个比另一个短,它用None
.
在 Python 3 中,这是不同的。首先,您不能None
用作位置 1 的可调用对象的参数:
>>> list(map(None, range(5),range(10,12)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
好的——我可以这样解决:
>>> def f(*x): return x
...
>>> list(map(f, *(range(5),range(10,12))))
[(0, 10), (1, 11)]
但是现在,我有一个不同的问题:map
返回最短迭代器的长度——不再用None
.
当我将 Python 2 代码移植到 Python 3 时,这并不是一个可怕的罕见习语,而且我还没有找到一个简单的解决方案。
不幸的是,2to3 工具没有选择这一点——无益地建议:
-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18))))
建议?
编辑
有一些关于这个成语有多普遍的讨论。请参阅此 SO 帖子。
我正在更新我还在上高中时编写的遗留代码。查看 Raymond Hettinger 正在编写和讨论的 2003 Python 教程,其中指出了 map 的这种特定行为......