3 回答
TA贡献1806条经验 获得超8个赞
一些著名的API不再返回列表:
[...]
移除
reduce()
..使用 如果您真的需要它,但是99%的时间是显式的
for
循环更易读。 [...]
TA贡献1796条经验 获得超4个赞
的功能map和filter被有意更改为返回迭代器,并从内置并放置在functools.reduce.
所以,为了filter和map,你可以用list()像你以前一样看到结果。
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> list(filter(f, range(2, 25)))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> list(map(cube, range(1, 11)))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> import functools
>>> def add(x,y): return x+y
...
>>> functools.reduce(add, range(1, 11))
55
>>>
现在的建议是用生成器、表达式或列表理解替换对map和Filter的使用。例子:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> [i for i in range(2, 25) if f(i)]
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> [cube(i) for i in range(1, 11)]
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>>
他们说循环是99%的时间容易读比减少,但我只坚持functools.reduce.
TA贡献1804条经验 获得超2个赞
reduce
from contextlib import contextmanager @contextmanagerdef noiters(*funcs): if not funcs: funcs = [map, filter, zip] # etc from functools import reduce globals()[reduce.__name__] = reduce for func in funcs: globals()[func.__name__] = lambda *ar, func = func, **kwar: list(func(*ar, **kwar)) try: yield finally: del globals()[reduce.__name__] for func in funcs: globals()[func.__name__] = func
with noiters(map): from operator import add print(reduce(add, range(1, 20))) print(map(int, ['1', '2']))
190[1, 2]
添加回答
举报