• day 11小结


    1.可变长参数

    1.1 形参名之 *

    def f1(*args):  # 调用函数时,有多少个位置实参,我就接收多少个参数
        print(args)
        
    f1()  # () # a是空元组
    # f1(1)  # (1, )
    # f1(1, 2)
    f1(1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, )
    
    # *args(约定俗称的),用元组接收 多余 的位置实参
    

    1.2形参名之 **

    def f1(**kwargs):
    print(kwargs)## f1(x=1)  # 空字典
    # **kwargs,用字典接收多余的关键字实参
    

    1.3实参名之 *(了解)

    def f1(a, b, c, e, d, f, g):
        print(a, b, c, e, d, f, g)
        
    lt = [1, 2, 3, 4, 5, 6, 7]
    # f1(lt[0],lt[1],lt[2],lt[3],lt[4],lt[5],lt[6])
    f1(*lt)  # *lt把列表中的元素打散成位置实参依次传给位置形参
    

    1.4实参名之 **(了解)

    def f1(z, b):
        print(z, b)
        dic = {'z': 1, 'b': 2}  # a=1,b=2
        f1(**dic)  # **dic把字典打散成关键字实参然后传给函数f1
    

    2.函数对象

    python中一切皆对象

    2.1 引用

    func = f1
    print('f1:', f1)
    print('func:', func)
    
    func()
    

    2.2 容器元素

    lt = [f1, 1, 2, 3]
    
    print('lt[0]', lt[0])
    print('f1', f1)
    
    lt[0]()
    

    2.3 作为函数实参

    def f2(f2_f1):
         print('f2_f1',f2_f1)
         f2_f1()
    
    f2(f1)
    
    print('f1', f1)
    

    2.4 作为函数返回值

    def f2(f2_f1):
        return f2_f1
    
    
    res = f2(f1)
    print('res', res)
    print('f1', f1)
    
    res()
    
    1. 引用(拷贝)

    2. 当作容器类元素

    3. 当作函数的实参

    4. 当作函数的返回值

      函数对象的联系

    def register():
        print('register')
    
    
    def login():
        print('login')
    
    
    def withdraw():
        print('wightdraw')
    
    
    def shopping():
        print('shopping')
    
    
    func_dict = {
        '1': register,
        '2': login,
        '3': withdraw,
        '4': shopping,
    }
    
    print('''
    1 注册
    2 登录
    3 提现
    4 购物
    ''')
    
    while True:
        choice = input('请选择你需要的功能(输入q退出):')
        if choice == 'q':
            break
        func_dict[choice]()
    

    3.函数的嵌套

    打印九九乘法表

    for i in range(1, 10):  # i控制的是行
         for j in range(i):  # j控制的是列
             print(f'{j+1}*{i}={(i)*(j+1)}', end=' ')
    
         print()  # 打印换行
    
     '''
     i控制行,j控制列
     i = 1  for j in range(1) j = 0 + 1
     i = 2  for j in range(2) j = 0 + 1 j = 1 + 1
     i = 3  for j in range(3) j = 0 + 1 j = 1 +1 j = 2 + 1
     i = 4
     i = 5
    

    函数嵌套:函数里面有函数

    # 定义函数,只检测语法,不会执行代码
     def f1():
         print('from f1')
    
         def f2():
             print('from f2')
    
    
    
    res = f1()
    

    函数内部定义的函数,外部不能用

    4.名称空间和作用域

    4.1变量名/函数名 --》 名称 --》 名称空间:专门存储名称的

    4.2内置名称空间:存储了内置方法的名称

    1. 3数据类型自带内置方法;python解释器自带内置方法(print/len/list/str/dict)

    全局名称空间:除了内置和局部都叫全局

    def f1():
         x = 10
         def f2():
             z = 20
    
     y = 10
    
     lt = [1, 2, 3]
    

    局部名称空间:函数内部定义的都叫局部

    4.1 名称空间的执行(生成)顺序:

    内置名称空间:python解释器启动的时候就有了

    全局名称空间:执行文件代码的时候才会有全局

    局部名称空间:函数调用的时候才会有局部

    搜索顺序: 先从当前所在位置寻找,找不到再按照这种顺序,不会逆着方向寻找 局部 --》 全局 --》 内置 --》 报错

    len  =10
    
     def f1():
         # len = 20
    
         print(len)
    
     f1()
    
    
     def f1():
         print('from f1')
    
         def f2():
             print('from f2')
    
     res = f1()
    

    4.2 作用域

    全局作用域: 内置名称空间+全局名称空间 --》 全局作用域

    def f1():
         y = 2
    
         print(1, y)
    
    
     y = 10
     f1()
    
     print(2, y)
    
     print(y)
    

    局部作用域

    def f1():
         def f2():
             def f3():
                 x = 1
                 print(x)
    
             x = 2
             f3()
    
         f2()
    
    
     f1()
    

    局部作用域:局部名称空间 --》 局部名称空间

    局部作用域1的x和局部作用域2的x也没有任何关系,即使局部作用域1和局部作用域2再同一个局部作用域下

    global和nonlocal了解,尽量不要使用

    global:打破了上述的第1点规则

    x = 10
    
    
    def f1():
        global x  # 让global以下的局部的x变成全局的x
        x = 20
    
    f1()
    print(x)
    

    nonlocal:打破了上述的第2点规则

    x = 10
    
    def f1():
        def f2():
            def f3():
                nonlocal x  # nonlocal让x成为顶层函数的局部,不是让他成为全局  # 压根没有应用情景,尽量不要嵌套函数
                x = 1
            x = 2
           f3()
            print(1, x)
        f2()
    def f0():
    #     x  = 3  # f1的nonlocal无法修改
    #     f1()
    f1()
    print(2, x)
    

    所有可变数据类型均可打破上述一切规则

    lt = [10]
    
    def f1():
        lt.append(12)
        lt[0] = 11
       
    
    f1()
    print(lt)python
    

    不理解就记住/算了

    def f1(i, lt=[]):
        lt.append(i)
        print(lt)
    
    for i in range(10):
        f1(i)
    
    
    def f1(i, lt):
        lt.append(i)
        print(lt)
    
    
    for i in range(10):
        f1(i, [])
    

    定义函数:只检测语法,不执行代码

    def f1():
        def f2():
            def f3():
                print('f3')
            f3()
    
    
    f1()
    
    x = 10
    print(x)
    
    def f1():
        x = 10
        print(x)
    
    f1()
    
    
  • 相关阅读:
    模板方法模式
    策略模式
    享元模式
    组合模式
    桥接模式
    外观模式
    代理模式
    装饰者模式
    适配器模式
    类之间的关联关系和依赖关系
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11570006.html
Copyright © 2020-2023  润新知