zoukankan      html  css  js  c++  java
  • python‘s tenth day for me

    动态参数    *args   **kwargs

          *args  动态参数,万能参数

          # args 接受的就是实参对应的  所有位置参数,并将其放在元祖中。

    def func(*args):
        print(args)
    func(1,2,3,4,5,6)
    
    # (1, 2, 3, 4, 5, 6)

          # 形参对应顺序:   位置参数, *args  ,默认参数。

    def func(a,b,c,*args,sex = ''):
        print(a)                    
        print(b)
        print(c)
        print(args)
        print(sex)
    func(2,3,4,5,6,7,sex = '')
    
    # 2
    # 3
    # 4
    # (5, 6, 7)
    #

               **kwargs   动态传参,它将所有的关键字参数(无意义的)放到一个字典中。

    def func(a,b,c,**kwargs):
        print(a)
        print(b)
        print(c)
        print(kwargs)
    func(1,2,d = 4,v = 6,c = 3)
    
    # 1
    # 2
    # 3
    # {'d': 4, 'v': 6}

          形参的最终顺序: 位置参数, *args,默认参数,**kwargs

    def func(a,b,c,d,*args,e = '',**kwargs):
        print(a)           
        print(b)
        print(c)
        print(d)
        print(args)
        print(e)
        print(kwargs)
    func(1,2,3,4,5,6,7,e = '',f = 4,v = 6,)
    
    # 1
    # 2
    # 3
    # 4
    # (5, 6, 7)
    #
    # {'v': 6, 'f': 4}

    #  在函数的调用执行时, 

      *可迭代对象,代表打散可迭代对象(list,tuple,str,dict(键))将元素一一加入到args.

    #  在函数定义时,*args,**kwargs 代表的是聚合。

    def func(*args):
        print(args)
    l1 = [1,2,3]
    l2 = [4,5,6,7]
    func(*l1,*l2) 
    
    # (1, 2, 3, 4, 5, 6, 7)
    def func(*args):
        print(args)
    func(1,2,3,4,5,6,7)
    
    # (1, 2, 3, 4, 5, 6, 7)  

      **字典,代表打散,将所有键值对放到一个kwargs字典里。

    def func(**kwargs):
        print(kwargs)
    dic1 = {'k1':1,'k2':2,'k3':3}
    dic2 = {'name':'顾清秋','age':17}
    func(**dic1,**dic2)
    
    # {'name': '顾清秋', 'k3': 3, 'age': 17, 'k2': 2, 'k1': 1}

     命名空间一共分为三种:

          全局命名空间:代码在运行的伊始,创建的存储 ‘变量名与值的关系’ 的空间叫做全局命名空间。

          局部命名空间,在函数的运行中开辟的临时空间叫做局部命名空间。

          内置命名空间。python解释器存在的内置函数运行时的空间叫做内置命名空间。

    三种命名空间的加载顺序与取值顺序:

         加载顺序:内置命名空间--->全局命名空间--->局部命名空间。

         取值顺序:   局部命名空间--->全局命名空间--->内置命名空间。

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

    作用域:

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

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

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

    globals 和 locals 方法:

        globals:   函数会以字典类型返回当前位置的全部全局变量。

        locals:   函数会以字典类型返回当前位置的全部局部变量。

    c = 1
    def func():
        a = 12
        b = 20  
        print(locals())     #{'b': 20, 'a': 12}
        print(globals())
    func()

    global 关键字,nonlocal 关键字。

        global:

          1. 声明一个全局变量。

    def func():
        global a
        a = 3
    func()
    print(a)    #  3

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

    count = 1
    def search():
        global count
        count = 2
    search()
    print(count)   #  2

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

    li = [1,2,3]
    dic = {'k1':1}
    def change():
        li.append('a')
        dic['k2'] = 2
        print(li)   #[1, 2, 3, 'a']
        print(dic)  #{'k2': 2, 'k1': 1}
    change()
    print(li)      #[1, 2, 3, 'a']
    print(dic)     #{'k2': 2, 'k1': 1}

          nonlocal:

            1,不能修改全局变量。

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

    def func():
        b = 2
        def func1():
            b = 4
            print(b)     #  4
            def func2():
                nonlocal b
                b = b + 4     #  8
                print(b)
            func2()
            print(b)     #  8
        func1()
        print(b)   #  2
    func()
  • 相关阅读:
    java纯数字加密解密实例
    C++手稿:std::string
    java裁剪图片
    java打开windows系统的浏览器
    Android手机无线adb
    office-word
    设计模式-享元模式(13)
    设计模式-外观模式(12)
    charles工具过滤腾讯视频播放器广告
    js将json格式的list转换为按某个字段分组的map数组
  • 原文地址:https://www.cnblogs.com/stfei/p/8671195.html
Copyright © 2011-2022 走看看