062 函数进阶小结 一、闭包函数 二、装饰器 三、迭代器 四、三元表达式 五、列表推导式 六、字典生成式 七、生成器和生成器表达式 八、匿名函数 九、递归函数 十、内置方法 十一、面向过程编程

二、装饰器

装饰器: 装饰的工具(函数),这个函数有装饰的作用.可以理解为装饰器就是一个函数的加工厂

装饰器本质: 装饰器 就是一个函数A装饰的对象 也就是一个函数B

装饰器的实现必须遵循两大原则:

  1. 不改变函数B的调用方式
  2. 不改变函数B的源代码

2.1 双层装饰器

模板:

# 双层装饰器模板
def outer(func): # 函数对象形参
    def inner(*args, **kwargs):   # 函数形参
        # 加功能
        print(f"这里是函数参数args:{args}, kwargs:{kwargs}")
        res = func(*args, **kwargs)   # 解压缩 func是被装饰的函数 函数实参
        return res

    return inner

2.2 三层装饰器

模板:

# 三层装饰器模板: 给双层装饰器加参数的
def outer(engine): # 给装饰器传参
    def inner(func):    # func是真正的功能函数
        def wrapper(*args, **kwargs):  # wrapper是未来要运行的函数
            # 加功能
            print(f"这里是装饰器参数engine:{engine}")
            print(f"这里是函数参数args:{args}, kwargs:{kwargs}")
            res = func(*args, **kwargs)  # func是被装饰的函数
            return res

        return wrapper

2.3 语法糖

模板:

@outer     # 语法糖(表示使用outer函数进行装饰) 相当于 func = outer(func)
def func(*args, **kwargs):
    print('双层装饰器模板')

三、迭代器

  1. 可迭代对象:具有iter方法的对象(Python中一切皆对象)
  2. 迭代器对对象:具有iter和next方法
  • 迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象(f)

四、三元表达式

模板:

def func(flag):
    print("对") if flag else print("错") # 三元表达式格式

func(True)

五、列表推导式

模板:

lt = [i for i in range(10)]     # 列表推导式
print(lt)

六、字典生成式

模板:

# 字典生成式
new_dic = {k:v for k,v in {"a":1,"b":2}.items()}      # 字典生成式
print(new_dic)
res = {i:i**i for i in range(10)}   # 字典生成式
print(res)

6.1 zip()方法与字典生成式连用

字典生成式一般与zip()方法连用。zip方法必须传递两个长度一样的可迭代对象。

zip方法必须传递两个长度一样的可迭代对象。

# zip()方法
z = zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])      # 压缩方法,Python解释器的内置方法,得到 zip类型变量
for i in z:
    print(i)

new_dic = {k: v ** 2 for k, v in z}         # 字典生成式
new_dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) }         # 字典生成式,另一种形式

七、生成器和生成器表达式

生成器: 是自定义的迭代器,生成器就是迭代器(自己造出来的)

生成器必须使用yield关键字

7.1 yield关键字

yield的三个特性:

  1. yield可以把 函数 变成生成器(自定制的迭代器对象,具有__iter____next__方法)
  2. yield可以停止函数,再下一次next再次运行yield下面的代码
  3. 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错
# 例子
def func():
    yield [1,1,23]  # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
    print(789)      # yield会停止函数,当运行下一次next才会继续运行下面的代码
    yield 101112    # 一个yield对应一个next
    print(131415)


f = func()  # 调用func()函数 会得到生成器对象
for i in f:
    print(i)

7.2 生成器表达式

生成器表达式就是:把列表推导式的[]换成()

# 生成器表达式就是:把列表表达式的[]换成()
lt = (i for i in range(100))    # 生成器表达式
print(lt)   # 生成器对象
print(lt.__next__())    # 迭代一次迭代器()

# 使用for循环迭代生成器对象
for i in lt:    # 因为next方法迭代了一次.就会从1开始
    print(i)

八、匿名函数

lamdbda 参数 : 逻辑代码

  • 匿名函数使用一次就失效了,一般不单独使用,与max最大值/min最小值/sorted排序/map映射/filter过滤 连用

九、递归函数

递归本质上就是函数调用函数本身,必须得有结束条件,并且在递归的过程中,问题的规模必须都不断缩小

十、内置方法

其实:记住,只要记住一个enumerate()

别的方法,知道什么意思。用到了再去查也可以

十一、面向过程编程

类似于工厂的流水线,机械式的一步一步完成一个项目,把完成步骤具体细分,这样步骤与步骤之间互不干涉

缺点:扩展性差,只要有一个步骤断了,项目就崩溃了
优点:清晰优雅