zoukankan      html  css  js  c++  java
  • 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()

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

    十一、面向过程编程

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

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

  • 相关阅读:
    RPC学习
    json
    jsf
    ajax分析
    async分析
    web后台
    servlet和CGI区别(转)
    forward和redirect
    (转)jvm
    Async分析
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11352423.html
Copyright © 2011-2022 走看看