Python高阶函数总结及练习

map()

内置函数map(),接收两个参数,参数一为函数,参数二为iterable, 将参数一的函数依次作用到参数二的每一个元素上,结果以新的Iterator返回。
解释:
1.Iterable (迭代对象):可直接用作for循环的对象,如:list tuple dict set str
2.Iterator(迭代器):可被next()调用,并不断返回下一个值的对象,如:generator(生成器)

#计算x^2
def fun(x):
    return x**2
for i in map(fun, [1, 2, 3, 4, 5]):
    print(i, end=' ')
#把所有的数字变成字符串并把iterator变成list
print(list(map(str, [1, 2, 3, 4, 5])))

reduce()

reduce()接收两个参数,参数一是函数,参数二是序列,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

from functools import reduce
#str2int方法
#输出 738912
DIGITS = {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9}
def str2int(s):
    def fn(x, y):
        return x*10+y
    def char2int(s):
        return DIGITS[s]
    return reduce(fn, map(char2int,s))
print(str2int("738912"))

#输出12345
def add2(x, y):
    return x*10+y
print(reduce(add2, [1, 2, 3, 4, 5]))

#使用lambda匿名函数
DIGITS = {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9}
def char2int(s):
    return DIGITS[s]
print(reduce(lambda x, y: x*10+y , map(char2int, "987654")))
#将字符串的开头字母变大写,其他变小写
def normalize(name):
    if isinstance(name, str):
        return name[0].upper()+name[1:].lower()
print(list(map(normalize, ["Jemma", "TOnnY", "JSHon"])))

filter()

练习:找素数(埃氏筛法)

#找排除掉偶数的序列(除2外,其他偶数都不是素数)
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n
# 找出不被整除的数
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)
#找30以内的素数
for i in primes():
    if i < 30:
        print(i)
    else:
        break

练习:找回数

def is_palindrome(n):
    s = str(n)
    return s[:] == s[-1::-1]
for i in filter(is_palindrome, range(100, 300)):
    print(i)

sorted()

练习:对列表中的元组排序

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
    return t[0]
def by_score(t):
    return t[1]
print(sorted(L, key=by_name))
print(sorted(L, key=by_score, reverse=True))

返回函数

函数作为返回值。内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

#计数器函数,返回递增整数
def createCounter():
    i = 0
    def counter():
        nonlocal i
        i = i + 1
        return i
    return counter

counter = createCounter()
print(counter(), counter())
print([counter(), counter()] == [3, 4])

匿名函数

print(list(map(lambda x: x**2, [1, 2, 3, 4, 5])))
print(list(map(lambda x: -x if x%2==1 else x, [1, 2, 3, 4, 5])))
print(list(filter(lambda x: x%2 == 0, [1, 2, 3, 4, 5])))

nums = [0, 7, 0, 1, 2, 1, 5, 1, 7, 8, 0, 67, 1, 3, 4]
#print(sorted(nums, reverse=True))
print(sorted(nums, key=lambda x: 1 if x == 0 else 0))

dict = {'k1':10,'k2':20,'k3':30}
print(dict[max(dict, key=lambda x: dict[x])])

装饰器Decorator

在代码运行期间动态增加功能的方式 放在运行函数的开头@

import time, functools
def log1(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print("call %s():" % func.__name__)
        return func(*args, **kw)
    return wrapper

def logtext(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print("%s %s():" % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator
def metric(fn):
    start = time.time()
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        print('%s executed in %s ms' % (fn.__name__, 1000*(time.time()-start)))
        return fn(*args, **kw)
    return wrapper

@metric
def fast(x, y):
    time.sleep(0.0012)
    return x + y

@metric
def slow(x, y, z):
    time.sleep(0.1234)
    return x * y * z

f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
    print('测试失败!1')
elif s != 7986:
    print('测试失败!2')

偏函数functools.partial

#偏函数
int2 = functools.partial(int, base=2)
print(int2('101'))
print(int2('101', base=10))
上一篇:MongoDB C#驱动中Query几个方法 (转)


下一篇:Log--检查各数据库日志的使用情况