Python全栈工程师随笔-生活工作点滴

14-2 可变参数

2019-07-16  本文已影响11人  BeautifulSoulpy

贫穷的思维里,写满了算计和抱怨;富裕的思维里,全是付出和感恩。而笑容就是你这辈子最好的风水!

科技(IT界)引领各行各业的发展

每个人的优点和缺点都是套餐,不贪心就好


写函数是为了方便,不是为了找事;按照一定的标准;

函数的可变参数:

在定义函数的时候,有时候会遇到参数比较多或者不确定参数名的情况。这个时候就可以使用可变参数。

可变参数:
1可变参数的形式有

1.1可变位置参数:在参数前加一个*(尽可能的贪婪,收集0-N个参数;)
*args : 元组类型参数

1.可变参数 *args
def add(*nums):
    print(type(nums),nums)
    sum=0    
    for x in nums:   #for循环是有值才进入;保证了空值也有输出;
        sum+=x
    return(sum)

add(1,3,5,7,9)    |   <class 'tuple'> (1, 3, 5, 7, 9)   25
add()   #空值返回空元组;
------------------------------------
<class 'tuple'> ()
0

2. 形参+可变位置参数;
def add(a,*nums):
#def add(*nums,a):   # 报错,可变参数会尽可能吃掉参数;
#def add(a,*nums,b):
    print(type(nums),nums)
    sum=0    
    for x in nums:   #for循环是有值才进入;保证了空值也有输出;
        sum+=x
    return(sum)

dd(1,3,5),add(1)
---------------------------------------------
<class 'tuple'> (3, 5)
<class 'tuple'> ()
(8, 0)


add(1,2,3) #可变参数不允许使用关键字传参数;
add(1,2,3) #可变参数不允许使用关键字传参数;
---------------------------------------------
<class 'tuple'> (2, 3)
5

1.2可变关键字参数:

.可变关键字参数:
kwargs :字典类型参数
形参前使用
符号,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典

1.可变关键字参数
def config(**kwargs):
    print(type(kwargs))
    print(kwargs)
    kwargs['a']=1000   #添加元素;
    print(kwargs)

config(host='localhost',post=80),config()
-------------------------------------------------------------
<class 'dict'>
{'host': 'localhost', 'post': 80}
{'host': 'localhost', 'post': 80, 'a': 1000}
<class 'dict'>
{}
{'a': 1000}
(None, None)

2.小技巧:字典解构
def showconfig(**kwargs):
    for k,v in kwargs.items():    #解构的思想
        print('{}={}'.format(k,v))     #确认输出的形式

showconfig(host='127.0.0.1',post='8080',username='wayne',password='magedu')
-------------------------------------------------------------
host=127.0.0.1
post=8080
username=wayne
password=magedu

3.形参+可变位置参数+可变关键字参数
def config(host,*args ,**kwargs):   #注意顺序不能错;
    print(type(kwargs))
    print(args)
    print(kwargs)

config('localhost',80,a=1)  #
------------------------------------------------------------------------------------------------
<class 'dict'>
(80,)
{'a': 1}

#小技巧——输出可变位置参数的 value
def config(host,port,**kwargs):
    print(type(kwargs))
    print(kwargs)
    print(host,port)
    kwargs['host']=host
    kwargs['port']=port

config(host=100,port=80)
--------------------------------------------------------
<class 'dict'>
{}
100 80

2 可变参数的特征(要注意的地方):

可变参数不允许使用关键字传参数;是优点也是缺点;

总结
1.有位置可变参数和关键字可变参数
2.位置可变参数在形参前使用一个星号*
3.关键字可变参数在形参前使用两个星号**
4.位置可变参数和关键字可变参数都可以收集若干个实参,位置可变参数收集形成一个tuple,关键字可变参数收集形成一个dict
5.混合使用参数的时候,可变参数要放到参数列表的最后,普通参数需要放到参数列表前面,位置可变参数需要在关键字可变参数之前

可变参数混合使用

配置信息打印
def showconfig(username, password, **kwargs) 
def showconfig(username, *args, **kwargs)
def showconfig(username, password, **kwargs, *args)

3. 可变参数实例练习

按照标准写,不要为难别人;

1.
def fn(x,y,*args,**kwargs):
    print(x)
    print(y)
    print(args)
    print(kwargs)

# 变量名 x 重复赋值;
fn(3,5,a=1,b=2,x=40,y=69)    #x不允许被赋予多个值;
-------------------------------------------------------------------
TypeError:fn() got multiple values for argument 'x'

# 关键字参数y 先从左到右识别;后是字典类型可变参数;
# 关键字传参数随便放位置:关键字参数就靠变量名字;
fn(5,a=1,b=2,y=30)  
fn(a=1,b=2,x=5,y=8)  #关键字传参数位置随便;注意程序运行的顺序;
-----------------------------------------------------------------------------------
5
30
()
{'a': 1, 'b': 2}
5
8
()
{'a': 1, 'b': 2}


2.
#练习2
def fn(*args,x,y,**kwargs):
    print(x)
    print(y)
    print(args)
    print(kwargs)
    
fn(3,5,7)
----------------------
3
5
(7,)
{}

fn(3,5,a=1,b='Python')
---------------------------------
3
5
()
{'a': 1, 'b': 'Python'}

fn(7,9,y=3,x=5,a=1,b='python')
----------------------------------------------------
TypeError: fn() got multiple values for argument 'y'
上一篇 下一篇

猜你喜欢

热点阅读