这篇教程一文搞懂Python的函数传参机制写得很实用,希望能帮到您。 大家好,我是Peter~ 最近写了Python函数的功能,犯了一些错误。本文主要是梳理下Python函数的传参机制,主要内容包含: 
一、最简单的函数(无返回值、参数)def hello_python(): print("hello python!") 输出: hello python!
二、最简单的函数(带返回值、无参数)def hello_python(): data = "hello python!" return data # data就是返回值 输出: 'hello python!'
三、带一个参数(无默认值)def hello(data): result = "hello " + data return result 输出: 'hello python'
传入另一个值: 输出: 'hello java'
还可以在内部修改参数的信息: def hello_name(name): result = "Hello " + name.title() + "!" return resulthello_name("tom") 'Hello Tom!'
'Hello Jack!'
四、带有多个参数(无默认值)def information(name, age): data = "我叫" + name.title() + ", 今年" + str(age) + "岁" return data '我叫Tom, 今年23岁'
'我叫Jack, 今年18岁'
五、参数设置默认值(一个参数)def hello_name(name="Peter"): result = "Hello " + name return result 如果不给参数具体的值,就使用默认值 'Hello Peter'
给参数一个实际的值,比如下面的例子中Tom就是实际的值;这就是常说的实参 'Hello Tom'
六、参数设置默认值(多个参数)def information(name="Peter", age=20): data = "我是" + name + ", 今年" + str(age) + "岁" return data 1、全部使用默认值: '我是Peter, 今年20岁'
2、全部传入实际的值: information(name="Tom", age=27) '我是Tom, 今年27岁'
3、只传入部分参数的实际值;未传入的使用默认值: '我是Tom, 今年20岁'
'我是Peter, 今年18岁'
七、部分参数使用默认值默认值的参数一定要放在最后面;具有默认值的参数一定要放在最后面 def information(name, age=20): data = "我是" + name + ", 今年" + str(age) + "岁" return data information("Peter") # age默认使用20 '我是Peter, 今年20岁'
information(name="Peter") '我是Peter, 今年20岁'
information("Peter", age=18) '我是Peter, 今年18岁'
下面的方式直接报错: information(age=18, "Peter") File "<ipython-input-26-2d03cd04a05a>", line 1 information(age=18, "Peter") ^ SyntaxError: positional argument follows keyword argument
information(age=18, name="Peter") # age默认使用20 '我是Peter, 今年18岁'
重点:在函数必须先列出没有默认值的形参,再列出有默认值的形参: def information(age=20, name): data = "我是" + name + ", 今年" + str(age) + "岁" return data File "<ipython-input-28-d36363c3194c>", line 1 def information(age=20, name): ^ SyntaxError: non-default argument follows default argument
如何理解有默认值的参数一定要放在最后面? 下面自定义个get_name的函数,传入第一个、最后一个和中间的名字,但是并不是每个人都有中间名字: def get_name(first_name, last_name, middle_name=''): if middle_name: # 如果存在中间名字 name = first_name + middle_name + last_name else: name = first_name + last_name return name get_name(first_name="张", last_name="飞", middle_name='') '张飞'
get_name(first_name="孙", last_name="空", middle_name='悟') '孙悟空'
如果不传递middle_name的结果肯定不是我们想要的: get_name(first_name="孙", last_name="空") '孙空'
八、位置实参def get_information(name, age): data = "我是" + name + ", 今年" + str(age) + "岁" return data get_information("Tom", 20) '我是Tom, 今年20岁'
get_information("20","Tom") # 一定要按照原来形参的顺序传递 '我是20, 今年Tom岁'
上面的结果肯定不是我们想要的
九、关键字实参当使用关键字传递实参的时候,和顺序无关: get_information(name="Tom", age=20) '我是Tom, 今年20岁'
get_information(age=20, name="Tom") '我是Tom, 今年20岁'
十、位置实参和关键字实参混合使用get_information("Tom", age=20) '我是Tom, 今年20岁'
在使用的时候还是要按照原函数中的顺序,否则报错: get_information(age=20,"Tom") File "<ipython-input-39-bc20bc544493>", line 1 get_information(age=20,"Tom") ^ SyntaxError: positional argument follows keyword argument
十一、进阶:*args使用有时候我们实现并不知道函数需要接受多少个参数,这个时候可以通过*args或者**kwargs的用法来收集任意数量的参数。 先介绍*args的使用。假设我们想把一个班级中每个同学的身高都变成以米为单位,即除以100: def height(*args): data = args return data 默认情况下函数收集到的是一个空元组: ()
当传入数据的时候,以元组的形式表示: (178,)
(178, 189)
def height(*args): for data in args: # 对args中的元素进行循环操作 print("身高是: {}m".format(data / 100)) height(189,180,167,172) # 调用 身高是: 1.89m 身高是: 1.8m 身高是: 1.67m 身高是: 1.72m
十二、进阶:**kwargs使用**kwargs允许将不定长度的键值对,作为参数传递给一个函数 def information(**kwargs): data = kwargs print(data) 默认情况下收集的是字典: information(name="Peter") {'name': 'Peter'}
information(name="Peter", age=23) {'name': 'Peter', 'age': 23}
def information(**kwargs): for k, v in kwargs.items(): print("{0} == {1}".format(k,v)) information(name="Peter") name == Peter
information(name="Peter", age=23) name == Peter age == 23
information(name="Peter", age=23, height=175) name == Peter age == 23 height == 175
十三、进阶:*args 和形参连用def fun(x, *args): print("x:", x) print("args:", args) x: 1 args: ()
x: 1 args: (2,)
x: 1 args: (2, 3, 4)
x: 1 args: (2, 3, 4, 'Peter')
十四、进阶:**kwargs 和形参连用def fun(x, **kwargs): print("x:", x) print("kwargs:", kwargs) x: 1 kwargs: {}
x: 1 kwargs: {'name': 'Peter'}
fun(1,name="Peter",age=23) x: 1 kwargs: {'name': 'Peter', 'age': 23}
十五、进阶:形参+*args+**kwargs连用def fun(x, *args, **kwargs): print("x:", x) print("args:", args) print("kwargs:", kwargs) x: 1 args: () kwargs: {}
x: 1 args: (2, 3) kwargs: {}
fun(1,name="Peter",age=23) x: 1 args: () kwargs: {'name': 'Peter', 'age': 23}
fun(1,2,3,name="Peter",age=23) x: 1 args: (2, 3) kwargs: {'name': 'Peter', 'age': 23} kwargs = {"name":"Peter","age":23}
x: 1 args: (2, 3) kwargs: {'name': 'Peter', 'age': 23}
以上就是一文搞懂Python的函数传参机制的详细内容,更多关于Python函数传参机制的资料请关注wanshiok.com其它相关文章! Python疫情数据可视化分析 Python实现解析参数的三种方法详解 |