大家好,我是小眼睛优粥面,今天跟小伙伴聊天的时候说到python的函数,大家说python函数的参数形式简直太多了,有时候记起来慢,用起来又有点乱,什么关键字参数、序列实参、不定形参巴拉巴拉的一大堆。正好今天简单总结下python函数形参与实参的几种奇妙用法,欢迎大家交流分享(码字不易,希望大家标明出处),有不对的地方也请大家指正,万分感谢啦^ ^
也希望大家关注我的微信公众号 “记不住先生和忘不了小姐”,里面不光有 “记不住” 的技术还有那 “忘不了” 的情怀。
0. 文章目录
目录
1. 函数的定义
首先,说到函数的参数,我们有必要先回忆一下什么是函数?函数是一段具有特定功能,与主程序相隔离,且易于复用的程序代码。(重点的理解标注的内容)。
同时,以至于函数是如何调用的、函数的形参、实参是什么,这些内容不一一详细赘述,就是长成以下这个样子。
# 函数定义,用于封装一个特定的功能,表示一个功能或者行为。
def func_name(形式参数):
函数体
# 函数调用,函数是可以重复执行的语句块,可以重复调用。
func_name(实际参数)
2. 函数的实参
2.1. 位置实参
那么,我们就先从实际参数开始聊起吧,位置实参最为简单也最常见一种实参形式,所谓位置实参就是实参与形参的位置依次对应,就如张导电影的名字一样《一个也不能少》,同样,一个也不能多,就像这样:
def func_name(p1, p2, p3):
print("p1:", p1)
print("p2:", p2)
print("p3:", p3)
# 函数调用:位置形参必须按照位置顺序传递参数
func_name(1, 2, 3)
'''
输出结果:
p1: 1
p2: 2
p3: 3
'''
2.2. 关键字实参
关键字实参:实参按照名称与形参进行对应,这个也很好理解,传参的时候加上“形参名”即可。什么意思呢?其实就是在告诉你函数的 “调用者” 给你 “制作者” 传递信息时不用再按照 “位置关系” 一一对应,可以按照名字(关键字)去对应啦,既然这样那他自然就可以改变传参的位置了。就像这样:
def func_name(p1, p2, p3):
print("p1:", p1)
print("p2:", p2)
print("p3:", p3)
# 函数调用:关键字形参可以不按顺序传递
func_name(p2=1, p3=3, p1=2)
'''
输出结果:
p1: 2
p2: 1
p3: 3
'''
好吧,不知道你们看到这里有没有疑惑,它有啥用呢?我们平时写代码的时候难道就按照 “位置” 去传递参数不香吗?而且写得内容还少,何必罗里吧嗦的去写这么一大堆关键字呢?恩,你想的没错,这个不是他应用的重点,这块留个疑问,你继续看,我们到后面会讲到。
2.3. 序列实参
序列实参是用序列容器的思想去进行传参,python容器都有哪些是有序的呢?我们都知道有 “字符串、列表、元组”,Python中可以把实参用 * 号将序列容器拆解后,将元素与形参依次对应。这块重点在拆分,即将实参按照位置进行拆分给函数。注意:序列实参传参的时候要遵循位置关系,还是那句话 “一个也不能多,一个也不能少”,其实他还是 “位置实参” 的一个扩展的高级应用,如下面所示:
def func_name(p1, p2, p3):
print(p1, p2, p3, sep=",")
# 将实参用*将序列容器拆解后与形参的位置依次对应
str_data = "123"
func_name(*str_data)
list_data = [4, 5, 6]
func_name(*list_data)
tuple_data = (7, 8, 9)
func_name(*tuple_data)
'''
输出结果:
1,2,3
4,5,6
7,8,9
'''
2.4. 字典实参
上面说完了 “序列实参” ,那对应的势必会有 “散列实参” 的容器传参,python中字典就是无序的散列,那就是 “字典实参” ,Python中可以将实参用 ** 将字典拆解后与形参的名字进行对应。重点还是在拆分上。同样,字典实参需要根据键值对与名字相对应,类似于上面讲的 “关键字实参”,所以关键字实参有的特性它都有,如不按照顺序传递等等,直接上代码吧。
def func_name(p1, p2, p3):
print("p1:", p1)
print("p2:", p2)
print("p3:", p3)
dict_data = {'p3':3, 'p1':1, 'p2':2}
func_name(*