4. 参数类型
调用函数时,可以使用以下几种类型的参数:
4.1 必需参数
必需参数必须以正确的顺序传入函数,调用时的数量必须和声明时一样。
🌅实例:必需参数
def describe_pet(animal_type, pet_name): """显示宠物的信息""" print(f"我有一只{animal_type},名字叫{pet_name}。")①. 正确调用describe_pet("猫", "咪咪")②. 错误调用:参数数量不匹配describe_pet("狗") # 这会引发 TypeError
以上实例输出结果:
4.2 关键字参数
关键字参数允许函数调用时参数的顺序与声明时不一致,Python 解释器能够用参数名匹配参数值。
🔄实例:关键字参数
def introduce_student(name, age, city): """介绍学生信息""" print(f"学生姓名:{name}") print(f"年龄:{age}") print(f"城市:{city}")# 使用关键字参数,顺序可以不同introduce_student(age=18, city="北京", name="李华")print("-" * 20)# 混合使用位置参数和关键字参数(位置参数必须在关键字参数之前)introduce_student("王芳", city="上海", age=20)
以上实例输出结果:
学生姓名:李华年龄:18城市:北京--------------------学生姓名:王芳年龄:20城市:上海
4.3 默认参数
调用函数时,如果没有传递某个参数,则会使用该参数的默认值。
🌊实例:默认参数
def register_user(username, is_active=True, role="普通用户"): """注册用户,默认状态为激活,默认角色为普通用户""" print(f"用户名:{username}") print(f"激活状态:{'是'if is_active else'否'}") print(f"角色:{role}") print("-" * 15)①. 只传递必需参数register_user("alice")②. 传递部分可选参数register_user("bob", is_active=False)③. 传递所有参数register_user("charlie", is_active=True, role="管理员")
以上实例输出结果:
用户名:alice激活状态:是角色:普通用户---------------用户名:bob激活状态:否角色:普通用户---------------用户名:charlie激活状态:是角色:管理员---------------
4.4 不定长参数
当需要一个函数处理比声明时更多的参数时,可以使用不定长参数。
🌱实例:使用 *args 处理多余的位置参数
def calculate_sum(initial, *numbers): """计算初始值与任意数量数字的和""" total = initial print(f"传入的额外数字(元组形式):{numbers}") for num in numbers: total += num return total# 调用函数result1 = calculate_sum(5)print(f"总和:{result1}\n")result2 = calculate_sum(10, 1, 2, 3, 4)print(f"总和:{result2}\n")result3 = calculate_sum(100, 50, 60)print(f"总和:{result3}")
以上实例输出结果:
传入的额外数字(元组形式):()总和:5传入的额外数字(元组形式):(1, 2, 3, 4)总和:20传入的额外数字(元组形式):(50, 60)总和:210
🧩实例:使用 **kwargs 处理多余的关键字参数
def print_user_profile(name, **details): """打印用户档案,可以包含任意多的详细信息""" print(f"用户:{name}") print("详细信息:") for key, value in details.items(): print(f" {key}: {value}")# 调用函数print_user_profile("张三", age=28, city="广州", job="工程师")print("-" * 20)print_user_profile("李四", country="中国", hobby=["阅读", "游泳"], score=95.5)
以上实例输出结果:
用户:张三详细信息: age: 28 city: 广州 job: 工程师--------------------用户:李四详细信息: country: 中国 hobby: ['阅读', '游泳'] score: 95.5
🌄实例:组合使用普通参数、*args 和 **kwargs
def complex_function(required, *args, **kwargs): """演示三种参数的组合使用""" print(f"必需参数:{required}") if args: print(f"额外的位置参数 (args):{args}") if kwargs: print(f"额外的关键字参数 (kwargs):{kwargs}")# 调用complex_function("A")print("-" * 15)complex_function("B", 1, 2, 3)print("-" * 15)complex_function("C", x=10, y=20)print("-" * 15)complex_function("D", 5, 6, name="Eve", age=25)
以上实例输出结果:
必需参数:A---------------必需参数:B额外的位置参数 (args):(1, 2, 3)---------------必需参数:C额外的关键字参数 (kwargs):{'x': 10, 'y': 20}---------------必需参数:D额外的位置参数 (args):(5, 6)额外的关键字参数 (kwargs):{'name': 'Eve', 'age': 25}
5. 匿名函数(Lambda 函数)
使用 lambda 关键字可以创建小型匿名函数。它只是一个表达式,函数体比 def 简单很多。
语法:
lambda [arg1 [, arg2, ...]]: 表达式
🔥实例 1:简单的 lambda 函数
①. 定义一个 lambda 函数,计算两个数的和add = lambda x, y: x + y②. 调用 lambda 函数print(add(3, 5)) # 输出 8print(add(10, -2)) # 输出 8③. 直接使用 lambda 而不赋值print((lambda a, b: a * b)(4, 7)) # 输出 28
以上实例输出结果:
🎭实例 2:lambda 与内置函数结合使用
lambda 常用于 map(), filter(), sorted() 等函数中。
①. 使用 lambda 对列表中的每个数求平方numbers = [1, 2, 3, 4, 5]squared = list(map(lambda x: x ** 2, numbers))print(f"平方结果:{squared}")②. 使用 lambda 过滤出列表中的偶数even_numbers = list(filter(lambda x: x % 2 == 0, numbers))print(f"偶数:{even_numbers}")③. 使用 lambda 作为排序的关键字students = [("Alice", 85), ("Bob", 92), ("Charlie", 78)]# 按分数排序students_sorted = sorted(students, key=lambda student: student[1], reverse=True)print(f"按分数排序:{students_sorted}")
以上实例输出结果:
平方结果:[1, 4, 9, 16, 25]偶数:[2, 4]按分数排序:[('Bob', 92), ('Alice', 85), ('Charlie', 78)]
💡实例 3:在函数中返回 lambda
def make_multiplier(n): """创建一个函数,该函数将其参数乘以 n""" return lambda x: x * n# 创建两个不同的乘法函数double = make_multiplier(2)triple = make_multiplier(3)print(double(10)) # 输出 20print(triple(10)) # 输出 30print(double(7)) # 输出 14
以上实例输出结果:
6. return 语句
return [表达式] 用于退出函数并选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。
🚀实例:多个 return 路径
def check_grade(score): """根据分数返回等级""" if score >= 90: return "优秀" elif score >= 75: return "良好" elif score >= 60: return "及格" else: return "不及格"# 测试函数grades = [95, 82, 67, 48]for g in grades: print(f"分数:{g},等级:{check_grade(g)}")
以上实例输出结果:
分数:95,等级:优秀分数:82,等级:良好分数:67,等级:及格分数:48,等级:不及格
🎯实例:无 return 语句的函数
def say_hello(name): print(f"Hello, {name}!")# 没有 return 语句,默认返回 Noneresult = say_hello("Python")print(f"函数返回的值:{result}")
以上实例输出结果:
Hello, Python!函数返回的值:None
7. 强制位置参数(Python 3.8+)
Python 3.8 引入了函数形参语法 /,用于指明其左侧的参数必须使用位置参数传递,不能使用关键字参数形式。
📢实例:强制位置参数
def create_point(x, y, /, z=0, *, label=None): """ 创建一个三维点 x, y: 必须使用位置参数传递 z: 可以使用位置或关键字(因为有默认值) label: 必须使用关键字参数传递(因为 * 之后) """ point_info = f"点坐标:({x}, {y}, {z})" if label: point_info += f",标签:{label}" return point_info①. 正确调用print(create_point(1, 2)) # x, y 位置参数print(create_point(3, 4, z=10)) # x, y 位置参数,z 关键字print(create_point(5, 6, label="A")) # x, y 位置参数,label 关键字print(create_point(7, 8, 15, label="B")) # x, y, z 位置参数,label 关键字②. 错误调用print(create_point(x=1, y=2)) # 错误:x, y 不能使用关键字参数print(create_point(1, 2, 3, 4)) # 错误:label 必须使用关键字参数
以上实例输出结果:
点坐标:(1, 2, 0)点坐标:(3, 4, 10)点坐标:(5, 6, 0),标签:A点坐标:(7, 8, 15),标签:B
8. 总结
函数定义:使用 def 关键字,包含函数名、参数、文档字符串和函数体。
函数调用:通过函数名和括号内的参数来执行函数。
参数传递:理解 Python 中可变与不可变对象在函数传递时的不同行为。
参数类型:必需参数、关键字参数、默认参数和不定长参数(*args, **kwargs)。
匿名函数:使用 lambda 创建简单的、一次性的函数。
return 语句:返回函数结果,无 return 时返回 None。
强制位置参数:Python 3.8+ 中使用 / 指定必须为位置参数的形参。