欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第十讲

程序员文章站 2022-05-28 13:37:34
...

函数(下)

高阶函数

  • 接收函数作为参数
  • 或者将函数作为返回值返回的函数就是⾼阶函数

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def fun1(n):
    if n % 2 == 0:
        return True



def fun(lst, fn):

    new_list = []
    for i in lst:      #遍历list1
        if fn(i):      #调用函数fun1
            new_list.append(i)

    return new_list


print(fun(list1, fun1))    #将接收函数作为参数  

闭包

  • 将函数作为返回值也是⾼阶函数我们也称为闭包
  • 闭包的好处
  • 通过闭包可以创建⼀些只有当前函数能访问的变量
  • 可以将⼀些私有数据藏到闭包中
  • ⾏成闭包的条件:
  • 函数嵌套
  • 将内部函数作为返回值返回
  • 内部函数必须要使⽤到外部函数的变量
def fun1(num1):

    def fun2(num2):
        res = num1 + num2
        return res

    return fun2


r = fun1(1)   #fun1(1) = fun2
r(2)          #fun1(1)() = fun2()
'''
3
'''
闭包里面的外部函数的变量可以保证不被销毁, 闭包要慎用
# 在闭包中修改外部函数的变量
def fun1(num1):

    def fun2(num2):
        nonlocal num1  # 告诉解释器,此处使用的不是本地的这个变量,而是外部变量
        # global num1
        num1 = 10
        res = num1 + num2
        return res
    print(num1)
    fun2(1)
    print(num1)
    return fun2


r = fun1(1)   #fun1(1) = fun2
r(2)          #fun1(1)() = fun2()

匿名函数

# 匿名函数的语法: (lambda 参数列表:运算)(实参)   用于做一些简单的运算, 而不用定义函数
res = (lambda a, b: a + b)(1, 2)
print(res)
'''
3
'''

c = 1
d = 2

dict1 = {
    'key': (lambda a, b: a + b)(c, d)
}

装饰器

  • 装饰器的引⼊:
  • 我们可以直接通过修改函数中的代码来完成需求,但是会产⽣以下⼀些问题
  • 如果修改的函数多,修改起来会⽐较麻烦
  • 不⽅便后期的维护
  • 这样做会违反开闭原则(ocp)
  • 程序的设计,要求开发对程序的扩展,要关闭对程序的修改
  • 装饰器的使⽤:
  • 通过装饰器,可以在不修改原来函数的情况下来对函数进⾏扩展 在开发中,我们都是通过装饰器来扩展函数的功能的
def fun(c, d):
    print('程序开始执行了')
    print(mul(c, d))
    print('程序执行结束了')

fun(1, 2)
#直接修改违反了ocp原则  o是开发对代码的拓展,c是关闭对代码的修改(开闭原则)
# 通用装饰器
def fun_out(old):

    def fun_inner(*args, **kwargs):  # 万能写法
        print('程序开始执行了')
        print(old(*args, **kwargs))
        print('程序执行结束了')

    return fun_inner
r = fun_out(old)
r()
@fun_out  # @fun_out=fun_out(old)   # 语法糖的写法 @fun_out
def fun1():
    print('我是shq')

作业

import time


def get_time(fn):
    def fun_inner():
        begin = time.time()
        fn()
        end = time.time()
        print('函数的执行时间为%s' % (end - begin))

    return fun_inner


@get_time
def fun():
    for i in range(10000):
        print(i)


fun()
'''
9993
9994
9995
9996
9997
9998
9999
函数的执行时间为0.026936054229736328
'''
相关标签: 基础 python