• 函数进阶


    函数进阶

    函数参数 (function arguments)

    形参分类 :

    3. 动态传参 (万能)

    def chi(*food):
     print("我要吃", food)
    chi("⼤⽶饭", "⼩⽶饭")
    # 结果:
    我要吃 ('⼤⽶饭', '⼩⽶饭') # 多个参数传递进去. 收到的内容是元组tuple
    

    动态接收 位置参数 *args

    • *args 位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
    • 在形参位置的 * 表示聚合
    • 实参位置的 * 表示打散
    • *args / *arguments
    • 动态接收位置参数的时候要注意: 动态参数必须在位置参数后⾯
    • 顺序: 位置参数 , , 默认值参数
    def chi(a, b, *food):
     print("我要吃", a, b, food)
    chi("⼤⽶饭", "⼩⽶饭", "馒头", "⾯条") 
    # 前两个参数⽤位置参数来接收, 后⾯的参数⽤动态参数接收
    # 打印结果 : 我要吃 大米饭 小米饭 ('馒头', '面条') # *food最后聚成元组
    

    动态接收 关键字参数 **kwargs

    • kwargs 关键字的动态传参 . 系统会自动把所有的关键字参数聚合成字典
    • key word arguments 关键字参数
    • 形参位置的 ** 表示聚合
    • 实参位置的 ** 表示打散
    def func(**kwargs):
     print(kwargs)
    func(a=1, b=2, c=3)
    func(a=1, b=2)
    结果:
    {'a': 1, 'b': 2, 'c': 3}  # **kwargs 最后聚合成dict
    {'a': 1, 'b': 2}
    
    def func(**kwargs):
        print(*kwargs)
    func(**{'a': 1, 'b': 2, 'c': 3})
    # 打印结果是原字典的key
    # a,b,c
    

    打散

    • (*)在形参中聚合成元组 tuple

    • (**) 在形参中聚合成字典 dict

    s1 = 'alex'
    l1 = [1, 2, 3, 4]
    tu1 = ('武sir', '太白', '女神',)
    def func(*args):
    	print(args) # ('a', 'l', 'e', 'x', 1, 2, 3, 4, '武sir', '太白', '女神')    
    func(*s1,*l1,*tu1) # *在实参中, 结果是打散后组成新的元组
    
    	print(args) # ('alex', [1, 2, 3, 4], ('武sir', '太白', '女神'))
    func(s1,l1,tu1) # *在形参中,打印结果是聚合成一个元组
    
    print(*args) # 结果是 a l e x 1 2 3 4 武sir 太白 女神 (根据索引遍历一次)
    func(*s1,*l1,*tu1)
    

    魔性(*,**)

    def foo(a, b, *args, c, sex=None, **kwargs):
        print(a, b) # 1 ,2
    	print(c) # 12
    	print(sex) # 女
    	print(args) # (3,4)
    	print(kwargs) # {"name":"太白"}
    foo(*[1, 2, 3, 4], **{'name': '太白', 'c': 12, 'sex': '女'}) # *或** 在实参处是打散数据(除int)
    

    函数之外 * 用法 : (处理剩余元素)

    • 类型必须是列表或元组
    a,b,*c = [1,2,3,4,5,6]
    print(a,b,c) # 1 2 [3,4,5,6] # 解包
    a,*c,b = [1,2,3,4,5,6]
    print(a,c,b) # 1 [2,3,4,5] 6
    a,*c = range(5)
    print(a,c) # 0 [1,2,3,4]
    

    无敌传参

    def func(*args, **kwargs): 无敌传参
    

    最终顺序 :

    位置参数 > *args > 默认值参数 > **kwargs

    4.仅限关键字参数 (3.4版本之后新出)

    位置 : 位置参数 > *args > 默认值参数 > 仅限关键字参数 > **kwargs

    • 默认值参数 > 仅限关键字参数(没有特定要求,可互换位置)
    • 只要在位置参数,*args之后,**kwargs之前就行
    def func(a,b,*args,c,sex = "man",**kwargs): #  c 仅限关键字参数
        print(a)
        print(b)
        print(sex)
        print(c)
        print(args)
        print(kwargs)
    func(1,2,3,4,5,sex = "太光",c = 44,age = 22,name = "alex")
    

    名称空间 :

    全局命名空间 :

    • 我们直接在py⽂件中, 函数外声明的变量都属于全局命名空间

    局部命名空间 :

    • 在函数中声明的变量会放在局部命名空间

    内置命名空间 :

    • 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

    加载顺序 : 内置 => 全局 => ( 函数执行时 ) 局部

    取值顺序 : (就近原则)局部 => 全局 => 内置

    作用域 :

    • 作⽤域就是作⽤范围, 按照⽣效范围来看分为 全局作⽤域 和 局部作⽤域
    • 变量或者函数的生命周期

    全局作⽤域

    • 包含内置命名空间和全局命名空间. 在整个⽂件的任何位置都可以使⽤(遵循从上到下逐⾏执⾏).

    局部作⽤域 :

    • 在函数内部可以使⽤.

    作⽤域命名空间 :

    全局作⽤域 : 全局命名空间 + 内置命名空间
    局部作⽤域 : 局部命名空间

    print(globals()) 查看全局作用域中的内容

    print(locals()) 查看的是当前作用域中的内容

    a = 10
    def func():
     a = 40
     b = 20
     def abc():
     print("哈哈")
     print(a, b) # 这⾥使⽤的是局部作⽤域
     print(globals()) # 打印全局作⽤域中的内容
     print(locals()) # 打印局部作⽤域中的内容
    
    

    函数的嵌套 (高级函数)

    关键字gloabal, nonlocal

    global :

    • 第一个功能:在局部作用域中可以更改全局作用域的变量
    • 利用global在局部作用域也可以声明一个全局变量。
    • 在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

    nonlocal :

    • 不能更改全局变量。
    • 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
    
    
  • 相关阅读:
    《Effective Java 第三版》——第五章 泛型
    线性代数在数据科学中的十个强大应用(一)
    ​知识图谱里的知识存储:neo4j的介绍和使用
    一份从入门到精通NLP的完整指南 | NLPer
    NeurIPS审稿引发吐槽大会,落选者把荒唐意见怼了个遍:“我谢谢你们了”
    知识图谱与机器学习|KG入门 -- Part2 建立知识图谱
    知识图谱与机器学习 | KG入门 -- Part1-b 图深度学习
    ​知识图谱与机器学习 | KG入门 -- Part1 Data Fabric
    使用特定领域的文档构建知识图谱 | 教程
    ICCV 2019|70 篇论文抢先读,含目标检测/自动驾驶/GCN/等(提供PDF下载)
  • 原文地址:https://www.cnblogs.com/fanxss/p/11009280.html
Copyright © 2020-2023  润新知