高阶函数
1. map⚓
map()
传入的第一个参数是f
,即函数对象本身。由于结果r
是一个Iterator
,Iterator
是惰性序列,因此通过list()
函数让它把整个序列都计算出来并返回一个list。
from concurrent.futures import ThreadPoolExecutor
import urllib.request
urls = ['https://www.baidu.com/', 'https://github.com/', 'http://www.ht.com/']
def load_url(url):
with urllib.request.urlopen(url, timeout=60) as conn:
print('%r page is %d bytes' % (url, len(conn.read())))
executor = ThreadPoolExecutor(max_workers=3)
#for url in urls:
# future = executor.submit(load_url, url)
# print(future.done())
list(map(load_url, urls))
#executor.map(load_url, urls)
print('main thread')
2. reduce⚓
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算。
from functools import reduce
nums = [1, 2, 3]
def my_add(x, y):
return x + y
print(reduce(my_add, nums))
3. filter⚓
filter()
的作用是从一个序列中筛出符合条件的元素。由于filter()
使用了惰性计算,所以只有在取filter()
结果的时候,才会真正筛选并每次返回下一个筛出的元素。
利用filter求素数:
# 奇数序列
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
# 不能被n整除的x
def _not_divisible(n):
return lambda x: x % n > 0
# 素数序列
def primes():
yield 2
it = _odd_iter()
while True:
n = next(it)
yield n
it = filter(_not_divisible(n), it)
for n in primes():
if n < 1000:
print(n)
continue
break
4. sorted⚓
sorted()
函数可以接受一个函数实现自定义排序:
sorted([36, 5, -12, 9, -21], key=abs)
# [5, 9, -12, -21, 36]
反向排序reverse=True
:
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
# ['Zoo', 'Credit', 'bob', 'about']