函数式编程
高阶函数:一个函数可以接收另一个函数作为参数
map() : map(function, Iterrable) :将传入的函数一次作用于序列的每个元素上,并将结果作为新的Iterator返回
# 实现,f(x) = x2, 作用于l = [1,2,3,4] def func(x): return x*x L = reduce(func, [1,2,3,4]) print(L)
reduce() :reduce把一个函数作用在一个序列上,该函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
# 实现[1,2,3,4,5]Z转换为12345 def func(x,y): return x×10 + y L = reduce(func, [1,2,3,4,5,6]) print(L)
filter() : filte把传入的函数作用于每个元素,根据返回值true/false 过滤元素
# 将序列中的空字符串删除 def not_empty(s): return s and s.strip() # print(list(filter(not_empty, [‘A‘, ‘‘, ‘B‘, None, ‘C‘, ‘ ‘])))
# 使用filter筛选出回数 def is_palindrome(n): return str(n) == str(n)[::-1] output = filter(is_palindrome, range(1, 1000)) print(‘1~1000:‘, list(output))
sorted():可接收一个key函数实现自定义的排序,将函数作用于每一个元素,按key函数返回的结果进行排序
print(sorted([36, -25, -68, 79], key=abs)) print(sorted([‘bob‘, ‘about‘,‘Zoo‘])) print(sorted([‘bob‘, ‘about‘,‘Zoo‘], key=str.lower)) >>> [-25, 36, -68, 79] [‘Zoo‘, ‘about‘, ‘bob‘] [‘about‘, ‘bob‘, ‘Zoo‘]
L = [(‘Bob‘, 75), (‘Adam‘, 92), (‘Bart‘, 66), (‘Lisa‘, 88)] def by_name(t): return t[0].lower() def by_score(t): return t[1] print(sorted(L, key=by_score, reverse=True)) print(sorted(L, key =by_name ))
返回函数:闭包,将函数作为结果值返回(返回函数名)
# 计数器,每次调用counterA()时,+1 def createCounter(): f = [0] def counter(): f[0] = f[0] + 1 return f[0] return counter counterA = createCounter() print(counterA(),counterA())
匿名函数:lambda x:(x为函数参数)不需要显示定义函数,使用表达式的结果作为返回值
L = list(filter(lambda x: x %2 ==1 , range(1,20))) print(L)
装饰器:调用函数时,不修改函数定义,但调用时动态增加功能的方式
# 装饰器函数 def log(func): @functools.wraps(func) def wrapper(*args, **kw): print(func.__name__) return func(*args, **kw) return wrapper @log #将装饰器装饰在now函数上 def now(): print(‘2015-3-25‘) now() print(now.__name__)
当装饰函数需要传入参数时
# 当装饰器函数需要传入参数时: def log(text): def derectorA(func): @functools.wraps(func) def wrapper(*args, **kw): print(func.__name__) return func(*args, **kw) return wrapper return derectorA @log(‘execute‘) def now(): print(‘2021-6-23‘) now() print(now.__name__)
例:设计一个装饰器,打开多装饰函数的执行时间
# 设计decoratoe,打印函数的执行时间 import time def metric(fn): @functools.wraps(fn) # 作用是让所装饰的函数名称等属性复制到wrapper上,(保证依赖函数签名的代码执行正常) def wrapper(*args, **kw): t1 = time.time() print(t1) fn(*args, **kw) t2 = time.time() print(t2) print(‘%s executed in %s ms‘ % (fn.__name__, t2-t1)) 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)
偏函数:将函数的某些参数固定,返回一个新的函数(与默认参数的作用一致,降低函数调用的难度)
# 实现转换二进制字符串,int(x, base =2)[应用于批量转换二进制字符串] int2 = functools.partial(int, base = 2) #偏函数 print(int2(‘100011‘)) print(map(int2, [‘110‘, ‘100‘, ‘001‘]))
原文:https://www.cnblogs.com/byy521/p/14919602.html