Python_day11_高阶函数、匿名函数、闭包、装饰器、命名空间

高阶函数

  • 概念:接手函数作为参数,或者将函数作为返回值返回的函数就是高阶函数
    通过例子衍生出高阶函数
# 定义一个函数,将偶数添加到新列表当中
lst = [1,2,3,4,5,6,7,8,9,10]
def fn(l):
    new_lst = []
    for i in l:
        if i % 2 == 0:
            new_lst.append(i)
    return new_lst
print(fn(lst))
# 定义一个函数,将奇数添加到新列表当中
lst = [1,2,3,4,5,6,7,8,9,10]
def fn(l):
    new_lst = []
    for i in l:
        if i % 2!= 0:
            new_lst.append(i)
    return new_lst
print(fn(lst))
# 定义一个函数,将大于5添加到新列表当中
lst = [1,2,3,4,5,6,7,8,9,10]
def fn(l):
    new_lst = []
    for i in l:
        if i > 5:
            new_lst.append(i)
    return new_lst
print(fn(lst))

引出高阶函数:

lst = [1,2,3,4,5,6,7,8,9,10]
def fn1(i):
    if i % 2 == 0:
        return True

def fn2(i):
    if i % 2 != 0:
        return True

def fn3(i):
    if i > 5:
        return True

def fn4(i):
    if i < 5:
        return True
def fn(func,l):
    new_lst = []
    for i in l:
        if func(i):
            new_lst.append(i)
    return new_lst
print(fn(fn4,lst))
  • 高级函数有什么好处?
  • 当我们使用一个函数作为参数的时候,实际是将指定的代码传递到目标函数

匿名函数

filter

  • filter,(函数,对象)可以对列表进行一个过滤
  • function函数对象
  • interable 可迭代对象(序列)
lst = [1,2,3,4,5,6,7,8,9,10]
def fn4(i):
        if i % 3 == 0:
            return True
        return False
print(filter(fn4,lst))

lambda

  • lambda函数表达式:可以用来创建一些简单的函数,它是函数的另一种创建方式
  • 语法:lambda 参数列表:返回值
  • 例题:定义一个函数 实现2个数的和
def fn(a,b):
    return a + b
print(fn(1,2))
def fn(a,b):
    return a + b
print(lambda a,b:a+b) # <function <lambda> at 0x00000262CB7D1AE8>
def fn(a,b):
    return a + b
print((lambda a,b:a+b)(122,344)) # 466
def fn(a,b):
    return a + b
fn1 = lambda a,b:a+b
print(fn1(1,2)) # 3

闭包

  • 将函数作为返回值返回的函数
def fn1():
    def fn2():
        print('我是fn2')
    return fn2
fn1()()
# r = fn1()
# r()
def make_fn():
    lst = []
    def fn1(n):
        lst.append(n)
        return sum(lst)/len(lst)
    return fn1
f = make_fn()
print(f(100))
print(f(50))
# 执行结果:
100.0
75.0

形成闭包的条件 :
1、函数嵌套
2、将内部函数作为返回值返回
3、内部函数必须要使用到外部函数的变量

装饰器的引入

  • 创建几个简单的功能函数
def add(a,b):
# 求任意两个数的和
	return a + b
r = add(12,36)
print(r)
def add(a,b):
    r = a + b
    return r
# n = add(10,2)
# print(n)
def fn():
    print('我是函数fn....')
def fn2():
    print('函数开始了....')
    fn()
    print('函数结束了....')
def new_add(a,b):
    print('函数开始了....')
    r = add(a,b)
    print('函数结束了....')
    return r
r = new_add(123,456)
print(r)

我们可以直接通过修改函数中的代码去完成这个需求,但是会产生一些问题
1 如果要修改的函数比较多,修改起来比较麻烦
2 不方便后期的维护
3 这种方式会违反开闭原则(ocp) 要求对开发程序的扩展,要求关闭程序的修改
直接目的为调用现有的函数实现优化功能

装饰器的使用

def fn():
    print('我是函数fn')
    return
def add(a,b):
    r = a+b
    return r
def start_end(old):
    def new_function(*a,**b):
        print('函数调取中...')
        print('函数开始了')

        print('函数计算中')
        result=old(*a,**b)
        print('函数结束了')

        return result
    return new_function
# r=start_end(add)
p=start_end(add)
print(p(1,2))
@start_end
def speak():
    print('同学们都辛苦了,加油加油')
speak()
#执行结果

> 函数调取中... 
> 函数开始了
> 函数计算中 
> 函数结束了 
>  3 
> 函数调取中...
> 函数开始了 
> 函数计算中 
> 同学们都辛苦了,加油加油 函数结束了

以上课堂示例,结果执行顺序不理解

命名空间

  • locals()来获取当前作用域的命名空间 返回的是一个字典
a = 10

def fn():
    print('我是函数fn....')

# scope = locals()
# # print(scope)
# # print(a)
# # print(scope['a'])
# scope['c'] = 123 # 像命名空间中添加了key-value 就相当于在全局中创了一个变量
# print(c)
# print(scope)

def fn2():
    a = 456
    scope = locals()
    scope['c'] = 123
    print(c)
    print(scope)
fn2()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值