zoukankan      html  css  js  c++  java
  • python学习之函数(二)

    4.4.6 动态传参

    动态传参是针对形参而言

    1.动态位置参数

    ​ 在静态位置参数时,我们知道,定义函数时有几个位置参数,调用时就必须给几个实参,不能多也不能少。有时候,实际应用过程中,参数往往不能固定,就好像吃饭,食物是不确定的,你可以吃三菜一汤,你也可以吃两荤两素一汤,当遇到参数不能固定时,就需要我们的动态参数出场了。

    语法:def 函数名(*args)

    *args--接受到的元素以元组的形式保存。动态参数实质上还是位置参数

    def hero (*args):
        print('德玛西亚:',args)
    hero('皇子','盖伦','赵信')
    hero('皇子','盖伦')
    hero('皇子',)
    
    2.位置参数与动态参数

    混用规则:

    ·动态参数必须在位置参数后⾯,防止所有实参都被动态参数接收后位置参数因没有数据而报错

    def hero (a,b,*args):
        print(a,b,'--',args)
    hero('皇子','盖伦','赵信')  
    hero('皇子','盖伦','赵信','女警')  
    #输出
    皇子 盖伦 -- ('赵信',)
    皇子 盖伦 -- ('赵信', '女警')
    
    

    ·动态参数实质上还是位置参数,所以关键字参数要放在动态参数之后

    def hero (*args,a,b):
        print(a,b,'--',args)
    hero('皇子',a ='盖伦',b='赵信')
    hero('皇子','盖伦',b='赵信',a ='女警')
    #输出
    盖伦 赵信 -- ('皇子',)
    女警 赵信 -- ('皇子', '盖伦')
    
    

    ·动态参数要在默认值参数之前

    顺序:位置参数 >>> 动态参数 >>> 默认参数 >>> 关键字参数

    3.动态关键字参数

    语法:def 参数名(**变量名)

    **:系统会自动把所有的关键字参数集合成字典

    4.形参实参的拆散与聚合

    *实参:解构可迭代对象

    *形参:聚合元素成元组 --没有元素时也会对得到一个空的元组

    **实参:解构可迭代对象

    **形参:聚合元素成字典,(没有元素时得到的是一个空的字典)参数的变量名作为字典的key,参数的值作为字典的value;这里要注意的是不能忘记变量名的命名规则,数字可以作为字典的key存在,但是不能作为变量名使用。

    **仅适用于关键字参数

    #聚合---------------------------
    def hero (*args):
        print(args)
    lst = ['皇子','盖伦','赵信','女警']
    s = 'asdf'
    hero(lst)
    #输出---(['皇子', '盖伦', '赵信', '女警'],)
    
    #解构-----------------------------
    hero(*lst,*s)
    #输出---('皇子', '盖伦', '赵信', '女警', 'a', 's', 'd', 'f')
    
    
    
    #聚合--------------------------
    def hero (**kwargs):
        print(kwargs)
    hero(h1='皇子',h2='盖伦',h3='赵信')
    #输出---{'h1': '皇子', 'h2': '盖伦', 'h3': '赵信'}
    
    #解构---------------------
    def hero (**kwargs):
        print(kwargs)
    dic  = {h1:'皇子',h2:'盖伦',h3:'赵信',h4:'女警'}
    hero(**dic)
    #输出---{'h1': '皇子', 'h2': '盖伦', 'h3': '赵信', 'h4': '女警'}
    
    
    

    *的灵活使用:

    函数中分为打散和聚合。

    函数外可以处理剩余的元素,得到的是列表,即使没有元素填充,也是一个空列表

    #分别赋值
    a,b = (1,2)
    print(a,b)  #输出   1 2
    #利用*解构赋值
    a,*b = (1,2,3,4)
    print(a,b)   #输出   1 [2, 3, 4]
    *a,b,c = range(5)
    print(a,b,c)  #输出  [0, 1, 2] 3 4 
    #利用*进行聚合
    a = 1
    b = 2
    c = [3,4,5]
    print(a,b,c) #输出  1 2 [3, 4, 5]
    

    最终顺序:位置参数 >> *动态位置参数 >> 默认参数 >> 仅限关键字参数 >>**kwargs 默认参数 与 仅限关键字参数 的位置可以互换

    ##name是仅限关键字参数
    def func(a,b,*args,team='德玛西亚',name,**kwargs):
        print(a)
        print(b)
        print(args)
        print(team)
        print(name)
        print(kwargs)
    func(1,2,3,4,name='gailun',equi='日炎',skill='啥蹦地裂',flag='旗子')
    

    4.4.7 命名空间与作用域

    分类:

    ​ 内置命名空间:python自己使用的空间,比如list、str之类

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

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

    加载顺序:

    ​ 内置命名空间 》 全局命名空间 》 局部命名空间

    取值顺序:

    就近原则,在没有任何方法的作用下,取值顺序是单向不可逆的

    ​ 局部命名空间 》 全局命名空间 》 内置命名空间

    作用域:

    ​ 作用域就是作用范围, 按照生效范围来看分为全局作用域和局部作用域。

    ​ 全局作用域:包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用,按照程序从上到下逐行执行;

    ​ 局部作用域: 局部命名空间;在函数内部可以使⽤;

    我们可以通过globals()函数来查看全局作⽤域中的内容, 也可以通过locals()来查看局部作⽤域中的变量和函数信息。

    ​ globals(): 以字典的形式返回全局作用域所有的变量对应关系。

    ​ locals(): 以字典的形式返回当前作用域的变量的对应关系。

    4.4.8函数的嵌套

    #感受一下
    def fun1():
        print(2)
        def fun2():
            print(4)
        print(3)
        fun2()
        print(5)
    print(1)
    fun1()
    print(6)
    #输出1 2 3 4 5 6
    

    关键点:只要遇见了 函数名() 就是函数的调用,如果没有就不是函数的调用,只有调用了才能有结果。

    4.4.9 关键字 global、nonlocl

    1.global:

    ​ ·在局部作用域中可以更改全局作用域的变量;

    ​ ·利用global在局部作用域也可以声明一个全局变量。

    a = 1
    def func():
        print(a)
    func()   #输出 1
    def fun1():
        a += 1   #报错
        print(a)
    

    局部作用域对全局作用域的变量(此变量只能是不可变的数据类型)只能进行引用,而不能进行改变,只要改变就会报错,使用global可以解决这一问题:

    #全局下已经定义了变量
    a = 1
    def fun1():
        global a
        a += 1
        print(a)
    fun1()  #输出 2
    #全局下没有点定义变量
    def func():
        global a
        a = 3
    func()
    print(a)  #输出为 3
    
    2.nonlocal:

    ​ nonlocal是python3新加的功能,与global用法差不多,就是在局部作用域如果想对父级作用域的变量进行改变时,需要用到nonlocal。

    def add_b():
        b = 42
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()  #输出为  62
        print(b)
    add_b()  #因为nonlocal已经更改了b的值,所以也是62
    
    仅供参考,欢迎指正
  • 相关阅读:
    首尾相连一维数组的最大子数组和
    二柱子——在线答题
    二维数组求最大值
    最大子数组和 10.11作业
    最大子数组

    异常
    面向对象2
    面向对象1
    java数据类型
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11045403.html
Copyright © 2011-2022 走看看