# 定义函数def 函数名(参数1, 参数2, ...):"""函数文档字符串(可选,用于说明函数功能)"""# 函数体:要执行的代码逻辑 执行语句# 返回值(可选,没有return则默认返回None)return 返回值# 调用函数函数名(参数1的值, 参数2的值, ...)#函数定义#函数不带参数def my_fun1 ():print("定义了一个函数")#函数带参数 , 计算两个数的和def my_fun2 (a,b):print(a+b)#函数调用my_fun1()my_fun2(1,2)my_fun2()TypeError: my_fun2() missing 2 required positional arguments: 'a' and 'b'def my_fun2 (a,b=2):print(a+b)my_fun2(1) #不传入b,使用默认值2,输出3my_fun2(5,6) ## 传入b,b值使用6,输出11def person (name,age=18):print(f"姓名:{name},年龄:{age}")person("张三",20) #混合 位置参数+默认参数person("张三",age=20) #混合 位置参数+关键字参数(关键字参数必须在位置参数后)person(name="张三",age=20) person(age=20,name="张三") #纯关键字参数调用,位置可换person(20,"张三") #混合 位置参数+默认参数 (位置不可换)输出:姓名:张三,年龄:20姓名:张三,年龄:20姓名:张三,年龄:20姓名:张三,年龄:20姓名:20,年龄:张三def person(**kwargs):# 函数内部,kwargs会被打包成字典print("接收的关键字参数:", kwargs)# 遍历获取所有关键字参数的名和值for key, value in kwargs.items():print(f"{key} = {value}")person(name="张三",age=18,city="SH")输出:接收的关键字参数: {'name': '张三', 'age': 18, 'city': 'SH'}name = 张三age = 18city = SHdef sum_numbers(*args):"""计算任意数量数字的和""" total = 0# args是一个元组,可以遍历for num in args: total += numreturn total# 测试不同数量的参数print(sum_numbers(1, 2,5)) # 输出: 8print(sum_numbers(1, 2, 3, 4,6)) # 输出: 16print(sum_numbers()) # 输出: 0(不传参数也能正常运行)# 也可以将列表/元组解包后传入nums = [1, 2, 3]print(sum_numbers(*nums)) # 输出: 6(*用于解包)命名关键字参数是一种固定名称的关键字参数,强制调用者必须以「关键字形式」传入指定名称的参数,且参数名是预先定义好的,不能随意传入。要求:参数名固定、数量固定,调用时必须用关键字形式传参(不能按位置传);语法上需要先写一个 * 作为分隔符(如果前面有可变位置参数 *args,则 * 可省略),后面跟着具体的参数名。
# 方式1:用 * 作为分隔符,后面的 city、age 是命名关键字参数def print_person(name, *, city, age):print(f"姓名:{name},城市:{city},年龄:{age}")# 正确调用:必须用关键字形式传 city 和 ageprint_person("李四", city="上海", age=25)# 错误调用1:按位置传 city/age(会报错)# print_person("李四", "上海", 25) # TypeError: print_person() takes 1 positional argument but 3 were given# 错误调用2:传入未定义的关键字参数(会报错)# print_person("李四", city="上海", age=25, gender="男") # TypeError: print_person() got an unexpected keyword argument 'gender'# 方式2:前面有 *args,省略单独的 * 分隔符def print_person2(*args, city, age):print(f"位置参数:{args},城市:{city},年龄:{age}")print_person2("李四", "学生", city="上海", age=25) # 正确:args 接收 ("李四", "学生")输出:姓名:李四,城市:上海,年龄:25位置参数:('李四', '学生'),城市:上海,年龄:25# 完整的参数组合定义def func(a, b=10, *args, c, **kwargs):print(f"位置参数a: {a}")print(f"默认参数b: {b}")print(f"可变位置参数args: {args}")print(f"命名关键字参数c: {c}")print(f"可变关键字参数kwargs: {kwargs}")# 调用(注意传参顺序)func(1, 2, 3, 4, c=5, d=6, e=7)# 输出:# 位置参数a: 1# 默认参数b: 2# 可变位置参数args: (3, 4)# 命名关键字参数c: 5# 可变关键字参数kwargs: {'d': 6, 'e': 7}