廖雪峰python3学习笔记:
# 高阶函数
- 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针)
def add(x, y): return x+y def mins(x, y): return x-y # 高阶函数 def computex, y, f): return f(x) + f(y) >>> computex(1,2,add) 3 >>> compute(4, 1, mins) 3 f = add >>>f(1,2) 3
# map() 是一种高阶函数。第二个list参数内的元素都执行 f 操作
def f(x): return x*x >>>map(f, [1,2,3,4,5]) [1,4,9,16,25]
# reduce 也是一种高阶函数。不好描述,看代码说明
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
# filter 高阶函数。过滤。第一个参数是true,保留。
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# sort 排序
>>>sorted([1,5,2,6,0]) [0,1,2,5,6] >>>sorted([1,5,2,6,0], reverse = True) [6, 5, 2, 1, 0] >>>sorted(['bob', 'about', 'Zoo', 'Credit']) ['Credit', 'Zoo', 'about', 'bob'] >>>sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) ['about', 'bob', 'Credit', 'Zoo']
# 函数作为函数的返回值
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum >>>f = lazy_sum(1, 3, 5, 7, 9) # 不会被执行,lazy_sum 的函数实现和局部变量都保存在f中。 >>>f() # 才会执行 25
- 闭包 相关的参数和变量(外部的)都包含在返回的函数(内部的)中的情况称为“闭包”。注意局部变量的值
# 廖雪峰的例子 def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() # 调用 >>> f1() 9 >>> f2() 9 >>> f3() 9 # 因为f1f2f3中的局部变量都是i,但是当f3生成后,i的值是3
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。(廖雪峰)
# 匿名函数 lambda表达式
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 4, 9, 16, 25, 36, 49, 64, 81] # lambda 输入参数x : 函数体x*x
>>> f = lambda x: x * x # 没有函数冲突问题 >>> f <function <lambda> at 0x101c6ef28> >>> f(5) 25
# 装饰器 (还不大理解其存在的意义)
在不修改函数的前提上,增加函数的功能。
# 来自廖雪峰的代码 def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) # 函数的名字属性 return func(*args, **kw) return wrapper @log # @ 语法 相当于 now = log(now) def now(): print('2015-3-25') # 调用 >>> now() call now(): 2015-3-25
# 偏函数(把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数)
# 数值转化 >>> int('12345', base=8) # 将字符串当做8进制数 5349 >>> int('12345', 16) # 16 进制 74565 # 偏函数 import functools int2 = functools.partial(int, base=2) # 偏函数,固定参数为二进制转化。 # 调用 >>> int2('12345') 5349