python函数的参数

关键字参数:

按照形参位置传入的参数被称为位置参数,如果使用位置参数的方式来传入参数值,则必须严格按照定义函数时指定的顺序来传入参数值,如果根据参数名来传入参数值,则无需遵守定义形参的顺序,这种方式被称为关键字参数。

>>> def mianji(length,width):
print('长度:',length)
print('高度:',width)
return width*length

>>> print(mianji(3,2))   #根据位置传入参数值
长度: 3
高度: 2
6
>>> print(mianji(length=6,width=3)) #根据关键字参数传入参数值
长度: 6
高度: 3
18
>>> print(mianji(width=4,length=8)) #使用关键字参数传入是可以变换位置
长度: 8
高度: 4
32
>>> print(mianji(3.4,width=3)) # 部分使用关键字参数,部分使用位置参数
长度: 3.4
高度: 3
10.2
>>> print(mianji(3.4,length=3)) #3.4对应的是位置参数:length,则后面的length冲突。
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
print(mianji(3.4,length=3))
TypeError: mianji() got multiple values for argument 'length'

>>> print(mianji(width=3,3.2))#关键字参数必须位于位置参数之后
SyntaxError: positional argument follows keyword argument

 

 

参数默认值

在某些情况下,程序需要在定义函数时为一个或者多个形参指定一个默认值,这样在调用函数时就可以省略为该形参传入参数值。而是直接使用形参的默认值。

>>> def message(name,age,sex='boy'):
print(name,',你好')
print(age,sex)


>>> message(name='kity',age=22) #此时没有传入sex参数值,但是默认为boy
kity ,你好
22 boy

 python要求将带默认值得参数定义在形参列表的最后。

 

参数收集(个数可变参数)

很多编程语言都允许定义个数可变的参数,这样可以在调用函数时传入任意多个参数。python当然也不例外。python允许在形参前面添加一个星号(*),这样就意味着该参数可以接受多个参数值。多个参数值被当成元组传入。

python允许个数可变的形参可以处于形参列表的任意位置,但python要求第一个函数最多只能带一个支持“普通”参数收集的形参。

>>> def test(i,*books):
print(books)
for a in books:
print(a)
print(i)


>>> test(1,'数学','英语','语文')
('数学', '英语', '语文')
数学
英语
语文
1


>>> ib('政治','地理','历史',num=20)
('政治', '地理', '历史')
政治
地理
历史
20
>>> def ib(*books,num,a):
print(books)
for i in books:
print(i)
print(num)
print(a)


>>> ib('政治','地理','历史',num=20,a=3)
('政治', '地理', '历史')
政治
地理
历史
20
3

>>> ib('政治','地理','历史',20,3)   #这里后面两个参数必须使用关键字参数传入参数,如果不这样所有参数都会传入books
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
ib('政治','地理','历史',20,3)
TypeError: ib() missing 2 required keyword-only arguments: 'num' and 'a'

 

 

python还可以收集关键字参数(key=value),此时python会将这种关键字参数收集成字典。为了让python能收集关键字参数,需要在参数前面添加两个星号(**)。在这种情况下,一个函数可同时包含一个支持‘普通’参数收集的参数和一个支持关键字参数收集的参数。

>>> all(1,2,3,'政治','地理','历史','a=1','b=2','c=3')
1 2 3
('政治', '地理', '历史', 'a=1', 'b=2', 'c=3')
{}   #没有参数传入则为空字典
>>> all(1,2,3,'政治','地理','历史','a=1','b=2','c=3',a=1,b=2,c=3)
1 2 3
('政治', '地理', '历史', 'a=1', 'b=2', 'c=3')
{'a': 1, 'b': 2, 'c': 3}

>>> all(1,2,'政治','地理','历史','a=1','b=2','c=3',a=1,b=2,c=3)
1 2 政治  #此时z的值变成了‘’政治‘’
('地理', '历史', 'a=1', 'b=2', 'c=3')
{'a': 1, 'b': 2, 'c': 3}

>>> all(1,2,a=1,b=2,c=3)
1 2 3 #此时没有参数传入z默认为3
()
{'a': 1, 'b': 2, 'c': 3}

 

逆向参数收集

在程序已有列表,元组,字典等对象前提下,吧他们的元素拆开后穿个函数的参数

逆向函数收集需要在传入的列表,元组参数之前添加一个星号,在字典参数之前添加两个星号

>>> def ls(name,data):
print('名字:',name)
print('来自于',data)


>>> a=['阿衰','北京','阿斗','四川']
>>> ls(*a)  #参数个数冲突。a有4个可传入的参数,但是ls只有2个。
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
ls(*a)
TypeError: ls() takes 2 positional arguments but 4 were given
>>> a=['阿衰','北京']
>>> ls(*a)
名字: 阿衰
来自于 北京

>>> def foo(name,*nums):
print('name参数',name)
print('num参数',nums)


>>> b=(1,2,3,4,5,6)
>>> foo(*b)
name参数 1
num参数 (2, 3, 4, 5, 6)
>>> foo('good',*b)
name参数 good
num参数 (1, 2, 3, 4, 5, 6)
>>> foo(1,2,3,*b)
name参数 1
num参数 (2, 3, 1, 2, 3, 4, 5, 6)

>>> foo(b) #如果不加*号则整个列表传入第一个参数
name参数 (1, 2, 3, 4, 5, 6)
num参数 ()

>>> def bar(book,price,desc):
print(book)
print(price)
print(desc)


>>> c={'price':89,'book':'物理','desc':'高中'}
>>> bar(**c)
物理
89
高中

 

posted @ 2020-04-20 15:14  夜影嘉臆  阅读(197)  评论(0编辑  收藏  举报