Python之闭包、装饰器及高阶函数

闭包

三个条件

  1. 存在于两个嵌套关系的函数中,而且闭包是内部函数
  2. 内部函数引用了外部函数的变量
  3. 外部函数会把内部函数的函数名称返回。

例如:

def outer(i=1):
    li=[i]
    def inner():
        li[0]+=1
        return li
    return inner

out=outer(11)
print(out())

输出结果:
[12]

因为outer()为一个函数不能直接打印,需要赋值给一个变量,由变量代替打印。
且此时接收变量也为函数,必须在变量名后加小括号才能打印出值。

注意
  1. 当内部函数调用外部变量为一个简单变量时,需要加nonlocal关键字
    例如:
def outer1(i=1):
    
    def inner1():
        nonlocal i
        i+=1
        return i
    return inner1;

out1=outer1(11)
print(out1())

输出结果:
12
  1. 当函数在参数列表实例化时只执行一次
    第二次调用不再初始化参数,数据操作错误

例如:

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值