| Python | PHP |
函数式编程 | 允许把函数本身作为参数传入另一个函数,还允许返回一个函数 |
|
高阶函数 | abs(),函数的调用不是函数本身 作为函数本身,函数名其实也是一个变量,可以改变指向,不过一般不这么做。函数名可以对变量进行赋值使变量也指向函数 variable = abs 高阶函数:能够将函数作为参数的函数 x = -5 y = 6 f = abs print(add(x,y,f)) | $a = "abs"; function test($a){ echo $a(-2); } test($a); |
map() | 将函数作用到一个可迭代对象上 map(function,Iterable) def f(x): return x*x l = [1, 2, 3, 4, 5, 6, 7, 8, 9] res = map(f,l) print(list(res)) |
|
reduce() | 从前两个开始,传入函数中,执行的返回值与第三个数继续传入,直到执行完毕 reduce(function,Iterable) from functools import reduce def p(x,y): return x*y l = [1,2,3] print(reduce(p,l)) 最终结果是个数字 如果Iterable只有一个数,那直接返回该值 |
|
| Python | PHP |
filter() | 筛选满足条件的Iterable元素 filter(function,Iterable) def judge(x): return x % 2 == 0 l = [1,2,3,4] res = filter(judge,l) print(list(res)) |
|
sorted() | 对list进行排序 sorted(list) l = sorted([36, 5, -12, 9, -21]) print(l) 可以传入第二个参数(函数),作为自定义排序的依据 sorted(list,key=function) 函数运算结果为排序标准 可以传入第三个参数进行反序排列 sorted(list,key=function,reverse=True)
|
|
| Python | PHP |
返回函数 | 将函数作为返回值的函数 def calc_sum(*args): def lazy_sum(): sum = 0 for i in args: sum = sum + i return sum return lazy_sum res = calc_sum(*[1,2,3,4]) print(res()) 使用闭包方式将函数名作为返回对象进行返回,执行函数后才能得到结果 |
|
闭包 | 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量 def createCounter(): l = [0] def counter(): l.append(l[-1]+1) return l[-1] return counter 内部函数在引用外部参数,外部参数就不会被释放 |
|
global和nonlocal | 在局部引用全局变量global 在局部引用非全局变量nonlocal |
|
匿名函数
| lambda variables:表达式 l = [1,2,3,4,5] res = map(lambda x:x*x,l) print(list(res)) 匿名函数可以被使用在别的函数中作为参数或者返回值,但是不能在外部直接定义,需要定义的同时进行赋值 func = lambda x:x*x |
|
| Python | PHP |
获取当前时间 | import datetime def now(): print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) now() |
|
装饰器 定义wrapper()的前面加上@functools.wraps(func) | 在函数运行阶段给函数添加附加功能 本质是一个以函数作为参数并返回附加功能函数的高阶函数 装饰器定义完成之后,使用方式为 在函数定义上方加入@装饰器名 import datetime import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper @log def now(): print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) now()如果装饰器本身需要传入参数,那么就再写一层函数定义 def log(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 使用时:@log(参数) |
|
一个检测函数运行时间的装饰器 | import functools import time def metric(func): @functools.wraps(func) def wrapper(*args, **kw): start = time.time() result = func(*args, **kw) end = time.time() print('%s executed in %s ms' % (func.__name__, (end - start) * 1000)) return result return wrapper |
|
| Python | PHP |
进制转换 | int(100,base=10) int(100,base=2) … |
|
偏函数 import functools | 把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数 import functools int2 = functools.partial(int, base=2) print(int2('111')) 也可以看成是为一个函数默认绑定一个参数 |
|