函数 function

可变/不可变类型在传参时的区别

不可变类型参数有

  • 数值型(整数,浮点数)
  • 布尔值bool
  • None 空值
  • 字符串str
  • 元组tuple

可变类型参数有

  • 列表 list
  • 字典 dict
  • 集合 set

传参说明

  • 不可变类型的数据传参时,函数内部不会改变原数据的值
  • 可变类型的数据传参时,函数内部可以改变原数据

函数参数

实参传递方式argument

位置传参

实参与形参的位置依次对应

def fun01(p1, p2, p3):
    print(p1)
    print(p2)
    print(p3)
# 位置实参:根据顺序与形参进行对应
fun01(1, 2, 3)

序列传参

实参用*将序列拆解后与形参的位置依次对应

def func01(p1, p2, p3):
    print(p1, p2, p3)

# 序列实参:拆,按照顺序与形参对应
list01 = [1, 2, 3]
name = "孙悟空"
tuple01 = (4, 5, 6)
# func01(list01)
func01(*list01) # 拆 1, 2, 3
func01(*name) # 拆 孙 悟 空
func01(*tuple01) # 拆 4, 5, 6

关键字传参

实参根据形参的名字进行对应

def fun01(p1, p2, p3):
    print(p1)
    print(p2)
    print(p3)

# 关键字实参:根据名字与形参进行对应
fun01(p1=1, p2=2, p3=3)
fun01(p2=2, p1=1, p3=3)

字典关键字传参

实参用**将字典拆解后与形参的名字进行对应,配合形参的缺省参数,可以使调用者随意传参

def func01(p1, p2, p3):
    print(p1, p2, p3)

# 字典实参:拆,按照名称与形参对应
dict01 = {"p2":"B","p1":"A","p3":"C"}
func01(**dict01)

形参定义方式parameter

缺省形参

"""
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):
    函数体
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数
"""

def func01(p1 =0, p2="", p3=100):
    print(p1)
    print(p2)
    print(p3)

func01(p2=2)
func01(p2=2,p3=3)
# 支持同时使用位置实参与关键字实参
func01(1,p3=3)
# 注意1:先位置实参,后关键字实参
# func01(p1 =1,2,3) # 错误

位置形参

def 函数名(形参名1, 形参名2, ...):
 函数体

def func01(p1, p2, p3):
    print(p1)
    print(p2)
    print(p3)

func01(1,2,3)

命名关键字形参

"""
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
 函数体
def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):
 函数体

强制实参使用关键字传参
"""

# 命名关键字形参:
# 星号元组形参后面的位置形参
# 限制实参必须是关键字实参
def func01(*args, p1, p2):
    print(args)
    print(p1)
    print(p2)

func01(p1=1, p2=2)
func01(1, 2, 3, p1=1, p2=2)

def func02(p1, *, p2=0):
    print(p1)
    print(p2)

# 通常星号后面的命名关键字形参属于辅助参数,可选.
func02(1)
func02(1, p2=2)

星号元组形参

"""
def 函数名(*元组形参名):
    函数体
可以将多个位置实参合并为一个元组,一般命名为'args',形参列表中最多只能有一个
"""

# 位置实参数量可以无限
def func01(*args):
    print(args)

func01() # 空元组
func01(1, 2, 34) # (1, 2, 34)
# 不支持关键字实参
# func01(args = 1,a=1)

双星号字典形参

"""
def 函数名(**字典形参名):
    函数体
可以将多个关键字实参合并为一个字典,一般命名为'kwargs',形参列表中最多只能有一个
"""

# 关键字实参数量无限
def func01(**kwargs):
    print(kwargs) # {'a': 1, 'b': 2}

func01(a=1,b=2)
# func01(1,2,3) # 报错

参数自左至右的顺序

位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参

def func01(list_target):
    print(list_target)# [1,2,3]

def func02(*args):
    print(args)# (1,2,3)

def func03(*args,**kwargs):
    print(args)# (1,2,3)
    print(kwargs)# {a=4,b=5,c=6}

def func04(p1,p2,*,p4,**kwargs):
    print(p1)# 10
    print(p2)# 20
    print(p4)# 30
    print(kwargs)# {p5 = 40}

func01([1,2,3])
func02(*[1,2,3])
func03(1,2,3,a=4,b=5,c=6)
func04(10,20,p4 = 30,p5 = 40)