zoukankan      html  css  js  c++  java
  • 函数的动态参数与命名空间 day10

     

    一、动态参数(不定长参数)def func(*args):

     

    形参: 3种 动态参数
    args元组,他包含了你所有的位置参数.

    *args 动态参数,不定长参数
    **kwargs 他包含了关键字动态参数


    *rarge用法
    def func(*args):
        print(args,type(args))
    func(1,2,'alex',3,4,5,6,8,4,7,2)

    结果

    *args按位置对应不能放到,其他形参位置前边

    def func(*args,a,b,c):
        print(a)
        print(b)
        print(c)
        print(args,type(args))
    func(1,2,'alex',3,4,)

    结果

    正确用法

    def func(a,b,c,*args):
        print(a)
        print(b)
        print(c)
        print(args,type(args))
    func(1,2,'alex')

     结果

    位置参数,*args,默认参数,**kwargs
    def func(a,b,c,sex = '',*args):
        print(a)
        print(b)
        print(c)
        print(sex)
        print(args,type(args))
    func(1,2,'alex','wusir','ritian '

    结果

    sex='男’被wusir覆盖 

    def func(a,b,c,*args,sex = ''):
        print(a)
        print(b)
        print(c)
        print(sex)
        print(args,type(args))
    func(1,2,'alex','wusir','ritian ',sex='')

    结果

    **kwargs的用法

    def func(**kwargs):
        print(kwargs)
    func(a = 1,b = 4,c = 3,d = 2)

     结果

     

    def func(a,b,c,*args,sex = '',**kwargs):
        print(a)
        print(b)
        print(c)
        print(sex)
        print(args,type(args))
        print(kwargs)
    func(1,2,'alex','wusir','ritian ',sex = '',name = 'taibai',age = 21)

    结果 

    *args,**kwargs万能参数

    def func2(*args,**kwargs):
        #万能参数
        print(args)
        print(kwargs)
    func2(1,2,3,5,name='alex',age=56)

    结果

     *rags加法计算器

    def my_sum(*args):
        count = 0
        for i in args:
            count += i
        return count
    print(my_sum(1,2,3,6,78))
    print(sum([1,2,3]))

    结果

     

    *魔法运算:打散

    def func2(*args,**kwargs):
        print(args)
        #(1,2,3)
    l1 = [1,2,3,]
    l2 = [1,2,3,2,3,100,2]
    func2(*l2,*l1)

     

    结果

    def func3(*args,**kwargs):
        print(args)
        print(kwargs)
    dic = {'name':'alex','age':12}
    dic2 = {'name':'jin','age':22}
    func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')

     

    结果 

    def func3(*args,**kwargs):
        print(args)
        print(kwargs)
    dic = {'name':'alex','age':12}
    dic2 = {'name':'jin','age':22}
    func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')

     结果

     

     二、名称空间

    名称空间: 

    等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。我们给这个‘存放名字与值的关系’的空间起了一个名字-------命名空间。

    
    
    
    
    全局名称空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做

    局部名称空间:在函数的运行中开辟的临时的空间
    内置名称空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
    name = 1
    def func():
        n = 2
        print(666)
    print(n)

    结果:因为n不在全局名称空间,所以找不到。

    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    取值顺序:

      在局部调用:局部命名空间->全局命名空间->内置命名空间

      在全局调用:全局命名空间->内置命名空间

    综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

    加载顺序:
    内置名称空间 ---> 全局名称空间 ----> 局部名称空间(执行函数时)
    取值顺序:
    先从局部名称空间找----> 全局名称空间找----->内置名称空间找
    name = 'wusir'
    def func():
        name = 'alex'
        print(name)
    func() 

    结果:

     

    def len(x):
        return x
    
    print(len([1,2,3]))

    结果

    作用域的角度:
    全局作用域 全局名称空间,内置名称空间
    局部作用域 局部名称空间,

     'wusir'
    def func():
        name = 'alex'
        # print(name)
        print(globals())
        print(locals())
    func()
    
    print(globals())
    print(locals())

     结果

     

    三 函数的嵌套 

    #局部找全局的函数名可以找到
    def fun1():
        print(111)
    def fun2():
        print(222)
        fun1()
    fun2()
    print(111)

     结果:

     

    def fun2():
        print(222)
        def fun3():
            print(666)
        print(444)
        fun3()
        print(888)
    print(333)
    fun2()
    print(555)

    结果 

    四 global(翻译:全球)全局变量与nonlocal(翻译:外地)

    作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

    局部作用域:局部名称空间,只能在局部范围生效

    globals和locals方法

    在全局调用

    print(globals())
    print(locals())

    在局部调用

    def func():
        a = 12
        b = 20
        print(locals())
        print(globals())
    
    func()

    global关键字,nonlocal关键字。

    global:

      1,声明一个全局变量。

      2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

     ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。

     

    def func():
        global a
        a = 3
    func()
    print(a)
    
    
    count = 1
    def search():
        global count
        count = 2
    search()
    print(count)
    global 1,声明一个全局变量
            #引用全局变量,并改变
    def func():
        global a
        a = 2
        print(a)
    func()
    print(a)

    结果: 

    l1 = [1,2,3]
    def func():
        l1.append(444)
    func()
    print(l1)

     结果

    nonlocal:

      1,不能修改全局变量。

      2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

     nonlocal的用法:

    a = 1
    def func():
        nonlocal a
        a = 2
        print(a)
    func()

      

    结果:报错

    父级函数
    def func():
        name = 'wusir'
        def inner():
            nonlocal name
            name = 'taibai'
            print(name)
        print(name)
        inner()
        print(name)
    func()

    结果:

    def add_b():
        b = 42
        def do_global():
            b = 10
            print(b)
            def dd_nonlocal():
                nonlocal b
                b = b + 20
                print(b)
            dd_nonlocal()
            print(b)
        do_global()
        print(b)
    add_b()
    10 30 30 42

     结果:

  • 相关阅读:
    canvas背景粒子动态变化动画
    点击屏幕弹出心形效果
    前端图片的性能优化
    vue的computed和method的区别
    es6的...
    命名路由和命名视图
    编程式路由
    [思维]蚂蚁感冒
    [模板]前缀树 / 字典树及应用
    [模板]三分搜索
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8400746.html
Copyright © 2011-2022 走看看