Python传参机制详解
本文主要是讲解Python函数的传参机制,主要内容包含:
一、最简单的函数(无返回值、参数)
1 | def hello_python(): |
1 | hello_python() # 直接调用 |
hello python!
二、最简单的函数(带返回值、无参数)
1 | def hello_python(): |
1 | hello_python() |
'hello python!'
三、带一个参数(无默认值)
1 | def hello(data): |
1 | hello("python") |
'hello python'
传入另一个值:
1 | hello("java") |
'hello java'
还可以在内部修改参数的信息:
1 | def hello_name(name): |
1 | hello_name("tom") |
'Hello Tom!'
1 | hello_name("jack") |
'Hello Jack!'
四、带有多个参数(无默认值)
1 | def information(name, age): |
1 | information("tom", 23) |
'我叫Tom, 今年23岁'
1 | information("JACK", 18) |
'我叫Jack, 今年18岁'
五、参数设置默认值(一个参数)
1 | def hello_name(name="Peter"): |
如果不给参数具体的值,就使用默认值
1 | hello_name() |
'Hello Peter'
给参数一个实际的值,比如下面的例子中Tom就是实际的值;这就是常说的实参
1 | hello_name(name="Tom") |
'Hello Tom'
六、参数设置默认值(多个参数)
1 | def information(name="Peter", age=20): |
1、全部使用默认值:
1 | information() |
'我是Peter, 今年20岁'
2、全部传入实际的值:
1 | information(name="Tom", age=27) |
'我是Tom, 今年27岁'
3、只传入部分参数的实际值;未传入的使用默认值:
1 | information(name="Tom") |
'我是Tom, 今年20岁'
1 | information(age=18) |
'我是Peter, 今年18岁'
七、部分参数使用默认值
默认值的参数一定要放在最后面;具有默认值的参数一定要放在最后面
1 | def information(name, age=20): |
1 | information("Peter") # age默认使用20 |
'我是Peter, 今年20岁'
1 | information(name="Peter") |
'我是Peter, 今年20岁'
1 | information("Peter", age=18) |
'我是Peter, 今年18岁'
下面的方式直接报错:
1 | information(age=18, "Peter") |
File "<ipython-input-26-2d03cd04a05a>", line 1
information(age=18, "Peter")
^
SyntaxError: positional argument follows keyword argument
1 | information(age=18, name="Peter") # age默认使用20 |
'我是Peter, 今年18岁'
重点:在函数必须先列出没有默认值的形参,再列出有默认值的形参:
1 | def information(age=20, name): |
File "<ipython-input-28-d36363c3194c>", line 1
def information(age=20, name):
^
SyntaxError: non-default argument follows default argument
如何理解有默认值的参数一定要放在最后面?
下面自定义个get_name的函数,传入第一个、最后一个和中间的名字,但是并不是每个人都有中间名字:
1 | def get_name(first_name, last_name, middle_name=''): |
1 | get_name(first_name="张", last_name="飞", middle_name='') |
'张飞'
1 | get_name(first_name="孙", last_name="空", middle_name='悟') |
'孙悟空'
如果不传递middle_name的结果肯定不是我们想要的:
1 | get_name(first_name="孙", last_name="空") |
'孙空'
八、位置实参
1 | def get_information(name, age): |
1 | get_information("Tom", 20) |
'我是Tom, 今年20岁'
1 | get_information("20","Tom") # 一定要按照原来形参的顺序传递 |
'我是20, 今年Tom岁'
上面的结果肯定不是我们想要的
九、关键字实参
当使用关键字传递实参的时候,和顺序无关:
1 | get_information(name="Tom", age=20) |
'我是Tom, 今年20岁'
1 | get_information(age=20, name="Tom") |
'我是Tom, 今年20岁'
十、位置实参和关键字实参混合使用
1 | get_information("Tom", age=20) |
'我是Tom, 今年20岁'
在使用的时候还是要按照原函数中的顺序,否则报错:
1 | get_information(age=20,"Tom") |
1 | File "<ipython-input-39-bc20bc544493>", line 1 |
十一、进阶:*args使用
有时候我们实现并不知道函数需要接受多少个参数,这个时候可以通过*args
或者**kwargs
的用法来收集任意数量的参数。
先介绍*args
的使用。假设我们想把一个班级中每个同学的身高都变成以米为单位,即除以100:
1 | def height(*args): |
1 | height() |
默认情况下函数收集到的是一个空元组:
()
1 | height(178) |
当传入数据的时候,以元组的形式表示:
(178,)
1 | height(178,189) |
(178, 189)
1 | def height(*args): |
1 | height(189,180,167,172) # 调用 |
身高是: 1.89m
身高是: 1.8m
身高是: 1.67m
身高是: 1.72m
十二、进阶:**kwargs使用
**kwargs
允许将不定长度的键值对,作为参数传递给一个函数
1 | def information(**kwargs): |
默认情况下收集的是字典:
1 | information(name="Peter") |
{'name': 'Peter'}
1 | information(name="Peter", age=23) |
{'name': 'Peter', 'age': 23}
1 | def information(**kwargs): |
1 | information(name="Peter") |
name == Peter
1 | information(name="Peter", age=23) |
name == Peter
age == 23
1 | information(name="Peter", age=23, height=175) |
name == Peter
age == 23
height == 175
十三、进阶:*args
和形参连用
1 | def fun(x, *args): |
1 | fun(1) |
x: 1
args: ()
1 | fun(1,2) |
x: 1
args: (2,)
1 | fun(1,2,3,4) |
x: 1
args: (2, 3, 4)
1 | fun(1,2,3,4,"Peter") |
x: 1
args: (2, 3, 4, 'Peter')
十四、进阶:**kwargs 和形参连用
1 | def fun(x, **kwargs): |
1 | fun(1) |
x: 1
kwargs: {}
1 | fun(1,name="Peter") |
x: 1
kwargs: {'name': 'Peter'}
1 | fun(1,name="Peter",age=23) |
x: 1
kwargs: {'name': 'Peter', 'age': 23}
十五、进阶:形参+*args
+**kwargs
连用
1 | def fun(x, *args, **kwargs): |
1 | fun(1) |
x: 1
args: ()
kwargs: {}
1 | fun(1,2,3) |
x: 1
args: (2, 3)
kwargs: {}
1 | fun(1,name="Peter",age=23) |
x: 1
args: ()
kwargs: {'name': 'Peter', 'age': 23}
1 | fun(1,2,3,name="Peter",age=23) |
x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}
1 | kwargs = {"name":"Peter","age":23} |
x: 1
args: (2, 3)
kwargs: {'name': 'Peter', 'age': 23}
推荐资料
最后给大家推荐一个来自B站的波波老师讲解的关于Python函数的内容,感兴趣可以去观看,讲解的很详细:
https://www.bilibili.com/video/BV1At411s7q1?p=1&vd_source=4fbe9321251f5c37499f1f14d9937037