世外桃源

非淡泊无以明志————非宁静无以致远——

python 函数(2),动态参数,名称空间,作用域,函数嵌套

*—*—python函数(2),动态参数,名称空间—*—*
一、动态参数

def func(a,b,c,d,e,f,g):
    pass
func(1,2,3,4,5,6,7)

如果有上百个参数怎么办呢?

有没有可能有一个万能的参数,可以接受一切的参数呢?

*args 动态参数,万能参数,了解一下哈

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

它不会接收关键字参数

def func(*args):
    pass
func(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)

如我们先前所言,结果是一个元组

二、形参对应顺序

动态参数*args 在定义中是聚合 调用时将所有传入的参数传入一个元祖,调用的时候输出这个元祖

def func(*args,a,b,c,d,e='sex'):
    print(args,a,b,c,d,e)
func(1,2,3,4,5)

报错,因为*args接收了所有实参,所以缺少了a,b,c,d参数

TypeError: func() missing 4 required keyword-only arguments: 'a', 'b', 'c', and 'd'

我们修改一下看看

def func(a,b,c,d,*args,e='sex'):
    print(a,b,c,d,args,e)
func(1,2,3,4,5,6,7,8,e='男')

执行输出:

1 2 3 4 (5, 6, 7, 8) 男

 

形参对应顺序:

位置参数,*args,默认参数

 

*args参数,可以不传,默认为空()

def func(a,b,c,d,*args,e='sex'):
    print(a,b,c,d,args,e)
func(1,2,3,4,e='男')

执行输出:

1 2 3 4 () 男

 

*args名字是可以改的,但是约定成俗使用*args

 

**kwargs也是动态参数,和*args不同的是,它只接收关键字参数

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

def func(a,b,c,**kwargs):
    print(kwargs)
func(1,2,a1=3,b1=4,c1=5,c=7) 

执行输出:

{'a1': 3, 'b1': 4, 'c1': 5}

执行没有报错,是因为函数接收参数后,它会从左边到右找,最后找到了c

c=7参数,在a,b,c里面已经定义好了,所以在输出的字典中,并未出现。

因为kwargs返回的是未定义的关键字参数。

 

**kwargs正确的位置

# def func(a,b,c,*args,e='男',**kwargs):
#     print(a,b,c,*args,e,kwargs)
# func(1,2,a1=3,b1=4,c1=5,e='女',c = 7)

执行输出:

1 2 7 女 {'a1': 3, 'b1': 4, 'c1': 5}

 

三、*魔法运用

def func(*args):
    print(args)
l1 = [1,2,3]
l2 = [11,22,33,44]

若要将2个列表的所有元素赋值给args,如何实现呢?

这个时候需要用到*   在调用时*为打散

def func(*args):
    print(args)
l1 = [1,2,3]
l2 = [11,22,33,44]
func(*l1)
func(*l2)

执行输出:

(1, 2, 3)
(11, 22, 33, 44)

 

**kwargs   打散

def func(**kwargs):
    print(kwargs)
dic1 = {'name':'小明','age':18}
dic2 = {'name1':'小李','age1':20}
func(**dic1,**dic2)

执行输出:

{'name': '小明', 'age': 18, 'name1': '小李', 'age1': 20}

 

**kwargs只限于字典类型

 在函数的调用执行时,
   *可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。
   **字典,代表打散,将所有键值对放到一个kwargs字典里。

 

四、命名空间和作用域

 

a = 1
b = 2
c = [1,2,3]
c1 = {'name':'ethan'}
 
def func1():
    name = '大司马'
    print(name)
func1()  #执行输出:大司马

 

 

 

 

  

 

 

posted on 2018-08-21 15:26  蛛丝_马迹  阅读(210)  评论(0编辑  收藏  举报

导航