python中函数是非常重要的一个知识点,想要把函数学习好,就必须要把函数的参数学习好,这样才能够进行很好的传递参数,发挥出应有的作用
函数的参数分类:
- 形式参数和实际参数
- 关键字参数
- 可变类型参数和不可变类型参数
- 位置参数
- 可变长度参数
- 默认值参数
- 形参(形式参数)和实参(实际参数)
形参:就是定义一个函数的时候,函数名称后面 () 中的参数
实参:就是函数调用的时候,() 中的参数
如下实例中,a 就是实参,b 就是形参
# 定义一个函数名为 test_one
def test_one(b)
print(b)
# 函数调用
a = 1
test_one(a)
-位置参数
位置参数:就是实际参数和形式参数进行按照位置一一对应的方式进行传递参数
# 定义一个函数名为 test_two的函数
def test_two(c,d):
e = c + d
print(f"这就是{c}")
print(f"这就是{d}")
print(e)
# 函数调用
a = int(input("请输入a的值:"))
b = int(input("请输入b的值:"))
test_two(a,b)
当我输入 a 的值为:10,b 的值为20
然后将 下面实参 a 和 b 的值位置进行对调结果如下
-关键字参数
关键字参数就是以 形参 = 实参的形式去指定的,不受传递参数的位置的影响,实例代码如下
# 定义一个函数名为 test_two的函数
def test_two(num1, num2):
res = num1 + num2
print(f"这就是{num1}")
print(f"这就是{num2}")
print(res)
# 函数调用
num1 = int(input("请输入num1的值:"))
num2 = int(input("请输入num2的值:"))
test_two(num1=num1,num2=num2)
输出的结果如下
将num1 = num1 和num2=num2 的调用位置更换还是一样的。不随位置的变化而影响传参
-可变类型参数和不可变类型参数
可变类型参数,实例代码如下:
# 定义一个名字叫做 test_two 的函数
def test_two(a):
a = 10 # a 为数值,数值为不可变的数据类型,在函数体内,这里就相当于重新开辟了一个内存地址来进行保存
print("inner",a,id(a))
a = 1
# 函数调用
test_two(a)
print("outer",a,id(a))
输出的结果如下:从输出的结果来看,很显然,函数体里面的 a 与 函数体外面的a 是不一样的变量。因为使用 id 获取到了内存地址都不一样
不可变类型参数,实例代码如下:
# 定义函数名称为 test_three 的函数
def test_three(li):
print("inner", li, id(li))
# 列表是可变数据类型,这里调用列表的 extend 延伸、扩展的方法
li.extend([1,11])
li = [1,2,3,4]
# 函数调用
test_three(li)
print("outer",li,id(li))
输出的结果如下,经过传参后,函数体内的列表 li 和函数体外的列表 li 是同一个列表,因为我们使用 id 函数去获取内存地址都相同
-可变长度参数
可变长度参数:
*args 接受实际参数传递参数的时候会转化为元组的形式
**kwargs 接受实际参数传递参数的时候会转化为字典的形式
实例代码如下
def test_seven(*args): # *args 可变长度参数,可传也可以不传,并且长度没有做任何限制,会统一的打包成元组
print(args)
print(type(args))
test_seven(1,2,3,4,6,7,"chen")
def test_eight(*args,b = 20,c = 30): # 注意:在python 3.0以后,*args 参数后面只能跟关键字参数,放在 *args 参数后面防止位置传参出现不必要的错误
print(args)
print(b)
print(c)
test_eight("chen",1,2,3,4,5,20,b = 20,c = 30)
# **kwargs **kwargs 可变长度参数,可传也可以不传,并且长度没有做任何限制,会统一的打包成字典,实参传需要传入键值对,然后形参会将它打包成字典
# 定义一个函数名称为 test_nine 的函数
def test_nine(**kwargs):
print(kwargs)
print(type(kwargs))
test_nine(a=1,b=2,c=3)
输出的结果如下
-默认值参数
形参处进行赋值,当函数调用的时候,实际参数如果不传参数到形式参数的时候,那就使用默认形式参数的默认值,如果实际参数传了,那形式参数的的默认参数就会被覆盖
代码实例如下
def test_five(a, b = 2):
a = a + b
print(a, b) # 输出的值为:3 2
a = 1
# 函数调用
test_five(a)
def test_six(a, b = 4):
a = a + b
print(a, b) # 如果默认值参数,当实际参数不传了,就为形式参数指定的值,如果实际参数传了,则实际参数会覆盖掉形式参数的值
a = 1
# 函数调用
test_six(a, 20)
输出的结果如下
补充知识:关于拆包 和 解包
代码实例如下
# 拆包
# 定义一个元组
a, b, c = (1,2,3)
# 分别打印 a , b ,c 并换行
print(a, b, c,sep = "\n")
# 关乎解包
# 定义一个函数名 test_case 的函数
def test_case(a ,b ,c):
print(a, b, c)
# 进行函数调用
# 定义一个元组
tup = (1,2,3)
test_case(*tup)
输出的结果如下:
关于函数的参数就学习到这里了,有什么问题欢迎大家留言探讨,fighting!