map 的用法
- def fn(x):
- return x*2
- L1 = [1,2,3,4,5,6]
- L2 = list(map(fn,L1))
- L2
- [2, 4, 6, 8, 10, 12]
通过上面的运行, 可以知道 map 就是把一个数组内所有的元素都执行 map 加入的方法.
用法如下 map(方法, 数组)
reduce 的用法
先看例子
- from functools import reduce
- def add(x,y):
- return x + y
- L1 = [1,2,3,4,5,6]
- L2 = reduce(add,L1)
- L2
- 21
通过上面的例子, 直观的来看, 我们可以发现 reduce 和 map 方法有一些不一样.
map 是 python 自带的函数, 而 reduce 需要引入 functools
map 返回的是一个 map 对象, 而 reduce 是返回的一个数字
map 函数需要一个参数, 而 reduce 的参数需要两个.
map 是对一个集合中的每个元素执行指定的方法. 而 reduce 则是依次对集合的元素调用指定的方法. 先把前两个参数执行 reduce 以后形成的返回之作为第一个参数, 再和第三个参数形成返回值, 依次执行.
filter 函数
filter 则是对集合的每个元素执行一次判断, 能让 filter 指定的函数返回真值则返回, 否则则不出现在返回集合中.
- def fn(x):
- return x%2 ==0
- L1 = [1,2,3,4,5,6,7,8]
- F1 = filter(fn,L1)
- print(F1)
- print(list(F1))
- <filter object at 0x7f1d38369358>
- [2, 4, 6, 8]
- sorted
顾名思义排序. 用法如下
sorted(集合, key = 排序的算法, reverse=True) #reverse=True 如果添加反向排序
返回函数 (闭包)
- def fn(x):
- def add(y):
- return x + y
- return add
- a = fn(5)
- a(6)
- 11
需要注意的是闭包的代码是到最后执行 a(6) 的时候, 才调用了函数里面的执行. 举个例子
- def fn():
- rs = []
- for i in range(4):
- def sub():
- return i
- rs.append(sub)
- return rs
- a,b,c,d = fn()
- print(a())
- print(b())
- print(c())
- print(d())
- 3 3 3 3
从上面的例子中, 我们如果没有理解到返回的函数是在最后加上括号的时候才调用, 可能以为返回之是 0,1,2,3
但是实际上 def sub() 里面的内容一直都没执行, 但是外面的 i 一直到了 3. 当调用 a() 的时候. 开始执行. 所以如上面的返回结果.
- def efn():
- i = 1
- def sub():
- i = i + 1
- return i
- return sub
- t = efn()
- t()
- ---------------------------------------------------------------------------
- UnboundLocalError Traceback (most recent call last)
- <ipython-input-15-7574f0a729df> in <module>()
- 7
- 8 t = efn()
- ----> 9 t()
- <ipython-input-15-7574f0a729df> in sub()
- 2 i = 1
- 3 def sub():
- ----> 4 i = i + 1
- 5 return i
- 6 return sub
- UnboundLocalError: local variable 'i' referenced before assignment
上面的报错, 需要引入关键词 nonlocal 如下:
- def efn():
- i = 1
- def sub():
- #关键字
- nonlocal i
- i = i + 1
- return i
- return sub
- t = efn()
- print(t())
- print(t())
- 2 3
匿名函数
- 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 函数或者匿名函数的意义
- f = lambda x,y:x + y
- f(5,6)
- 11
我们大概可以看到 lambda 函数的: 前面相当于参数, 后面的是返回数值
装饰器
我的理解类似 java 中的 AOP 或者. net 中的面向切片编程
- '''比如调用一个方法的时候, 我们期望另外一个方法也被调用. 比如我们执行一个操作, 期望不改变任何代码, 就可以打印出来这个方法的日志'''
- def log(func):
- def wraper(*args,**kw):
- print(func.__name__+'is call to log')
- return func(*args,**kw)
- return wraper
- @log
- def fn():
- print('this is fn')
- fn()
- fn is call to log
- this is fn
- '''如果我们希望往 log 里面传递参数'''
- def log(text):
- def decorator(func):
- def wraper(*args,**kw):
- print(func.__name__+'is call to log' + text)
- return func(*args,**kw)
- return wraper
- return decorator
- @log('hello')
- def fn():
- print('fn')
- fn()
- fn.__name__
- fn is call to log hello
- fn
- 'wraper'
fn 的名称发生了改变, 要保持不变, 需要 @functools.wraps(func)
- '''如果我们希望往 log 里面传递参数'''
- import functools
- def log(text):
- def decorator(func):
- @functools.wraps(func)
- def wraper(*args,**kw):
- print(func.__name__+'is call to log' + text)
- return func(*args,**kw)
- return wraper
- return decorator
- @log('hello')
- def fn():
- print('fn')
- fn()
- fn.__name__
- fn is call to log hello
- fn
- 'fn'
以上的内容参考学习 廖学峰的学习网站
来源: https://www.cnblogs.com/bbird/p/12150771.html