Skip to content

高阶函数

1. map

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个IteratorIterator是惰性序列,因此通过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']