5. 内置高阶函数

函数
说明
map(function, iterable, *iterables)
返回一个将 function 应用于 iterable 的每一项,并产生其结果的迭代器。 如果传入了额外的 iterables 参数,则 function 必须接受相同个数的参数并被用于到从所有可迭代对象中并行获取的项。 当有多个可迭代对象时,当最短的可迭代对象耗尽则整个迭代将会停止。(映射)
filter(function, iterable)
使用 iterable 中 function 返回真值的元素构造一个迭代器。 iterable 可以是一个序列,一个支持迭代的容器或者一个迭代器。 如果 function 为 None,则会使用标识号函数,也就是说,iterable 中所有具有假值的元素都将被移除。
sorted(iterable, key=None, reverse=False)
根据 iterable 中的项返回一个新的已排序列表。

map 示例

# map函数示例

def power2(x):
    return x ** 2

# 1, 4, 9, 16, ... 81
# for x in map(power2, range(1,10)):
#     print(x)

def join_str(a, b):
    return str(a) + str(b)

for x in map(join_str, "ABCDEFG", [1, 2, 3, 4]):
    print(x)

filter 示例

# filter函数示例

def is_prime(x):
    if x <= 1:
        return False
    for i in range(2, x):
        if x % i == 0:
            return False
    return True

for x in filter(is_prime, range(10)):
    print(x)

map函数的实现原理

# map函数的实现原理

def mymap(function, iterable, *args):
    iterlist = [iter(iterable)]
    iterlist.extend((iter(it) for it in args))
    while True:
        arg_list = []
        for it in iterlist:
            try:
                value = next(it)
                arg_list.append(value)
            except StopIteration:
                return
        yield function(*arg_list)


for x in mymap(lambda x:x**2, [1, 2, 3, 4]):
    print(x)

for x in mymap(lambda x, y:x**y, [1, 2, 3, 4],[4, 3, 2, 1, 0]):
    print(x)

filter函数的实现原理

# filter函数的实现原理

def myfilter(function, iterable=None):
    for value in iterable:
        if function(value) if function else value:
            yield value

result = list(myfilter(None, [1, 0, 2.0, 0.0, True, False, None]))
print(result)
result = list(myfilter(lambda x: x%2, range(1, 10)))
print(result)

练习

求100以内所有素数的和,即求:2 + 3 + 5 + 7 + ... + 97 = ?

参考答案

def is_prime(x):
    if x <= 1:
        return False
    for i in range(2, x):
        if x % i == 0:
            return False
    return True

print(sum(filter(is_prime, range(100))))