闭包
三个条件
- 存在于两个嵌套关系的函数中,而且闭包是内部函数
- 内部函数引用了外部函数的变量
- 外部函数会把内部函数的函数名称返回。
例如:
def outer(i=1):
li=[i]
def inner():
li[0]+=1
return li
return inner
out=outer(11)
print(out())
输出结果:
[12]
因为outer()为一个函数不能直接打印,需要赋值给一个变量,由变量代替打印。
且此时接收变量也为函数,必须在变量名后加小括号才能打印出值。
注意
- 当内部函数调用外部变量为一个简单变量时,需要加nonlocal关键字
例如:
def outer1(i=1):
def inner1():
nonlocal i
i+=1
return i
return inner1;
out1=outer1(11)
print(out1())
输出结果:
12
- 当函数在参数列表实例化时只执行一次
第二次调用不再初始化参数,数据操作错误
例如:
def abc(i, li=[]):
li.append(i)
print(li)
abc(1)
abc(2)
abc(3)
输出结果:
[1]
[1, 2]
[1, 2, 3]
如果要在参数列表初始化参数需要加限定条件
例如:
def abc(i, li=None):
if(li == None):
li = list()
li.append(i)
print(li)
abc(1)
abc(2)
abc(3)
输出结果:
[1]
[2]
[3]
装饰器
装饰器的本质是一个Python函数,它可以在不改动其他函数的前提下,对函数的功能进行扩充。
从程序设计原则来讲:开闭原则
从设计模式来讲:代理模式实现
从架构来讲:过滤器(Filter) 或者 AOP(aspect oriented programming)
例如:增加权限、日志功能
def before(func):
print("权限管理......")
def inner():
func()
print("权限管理功能......")
return inner
def after(func):
print("日志管理......")
def inner():
func()
print("日志管理功能......")
return inner
@after
@before
def demo():
print("正常业务逻辑......")
demo()
输出结果:
权限管理......
日志管理......
正常业务逻辑......
权限管理功能......
日志管理功能......
当有多个装饰器应用在一个函数上时,它们的调用顺序是自下而上的。
装饰器对带有返回值的函数进行装饰
需要返回函数并不是调用
例如:
def one(func):
def inner():
print("after.......")
return func()
return inner
@one
def login():
return "返回成功"
print(login())
输出结果:
after.......
返回成功
装饰器对有参数函数进行装饰
如果被装饰函数有参数,给内部函数和装饰器中调用函数加上参数列表即可
例如:
def before(func):
def inner(i,j):
print("before........")
func(i,j)
return inner
@before
def add(i,j):
print(i+j)
add(1,2)
输出结果:
before........
3
高阶函数
函数式编程可并发,更能发挥多核处理器的优势。
map()函数
map函数会根据提供的函数对指定的序列做映射。
map(function, iterable,…)
- function 表示的是第一个函数名
- iterable 可以是序列、支持迭代的容器或迭代器。调用map函数时,iterable中的每个元素都会调用function函数,所有元素调用function函数返回的结果会保存到一个迭代器对象这中。
配合lambda函数更好用哦!
例如:
li=[1,2,3,4,5]
m=map(lambda x:x**3,li)
print(list(m))
输出结果:
[1, 8, 27, 64, 125]
f1=list(filter(lambda x:x%2==0,li))
print(f1)
输出结果:
[2, 4]
f2=list(filter(lambda x:x%2,li))
print(f2)
输出结果:
[1, 3, 5]
reduce()函数
reduce函数会对参数迭代器中的元素进行累积。
reduce(function, iterable[, initializer])
- function 是一个带有两个参数的函数
- iterable是一个迭代器对象
- initializer 表示固定的初始值。
reduce函数会依次从迭代器对象中取出每个元素,和上一次调用function的结果做为参数再次调用function函数.
在Python3中reduce函数被放置在functools模块中,使用时需要先引用
from functools import reduce
r=reduce(lambda x,y:x+y,li)
print(r)
输出结果:
15
如果在调用reduce函数时传入initializer参数,那么function函数会以迭代器中的第一个参数与initializer的和作为参数进行调用。
例如:
from functools import reduce
r=reduce(lambda x,y:x+y,li,5)
print(r)
输出结果:
20
filter()函数
filter函数会对指定序列执行过滤操作
filter(function, iterable)
- function 可以是函数名称或者None,只能接收一个参数,且返回值为布尔值。
- iterable 可以是序列、支持迭代的容器或者迭代器。
filter函数的作用是以参数迭代器中的每个元素分别调用function函数,最后返回的迭代器包含调用结果为True的元素。
例如:
li1=list(map(lambda x:x+1,li))
print(li1)
li2=list(filter(lambda x:x%2,li1))
print(li2)
输出结果:
[2, 3, 4, 5, 6]
[3, 5]