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()

 

posted @ 2018-03-29 17:32  Qingqiu_Gu  阅读(108)  评论(0编辑  收藏  举报