目录
4.2 进阶练习题:结合 *args 和 kwargs 使用
一、函数调用的基础
1. 函数调用(Function Call)
函数定义之后,需要使用“函数名 + 括号”来调用它。可以传入实参,也可以省略(如果函数无参数)。
调用方式:
def say_hello():
print("Hello!")
say_hello() # 调用函数
2. 函数调用过程
Python 查找函数名
检查参数个数是否匹配
执行函数体,返回结果
二、函数参数类型
1. 位置参数(Positional Arguments)
def describe_pet(animal, name):
print(f"这是一只{animal},名字叫{name}")
describe_pet("狗", "旺财") # 位置参数:第1个给animal,第2个给name
2. 关键词参数(Keyword Arguments)
def describe_pet(animal, name):
print(f"这是一只{animal},名字叫{name}")
describe_pet(animal="猫", name="咪咪")# 使用关键词参数调用
3. 默认参数(Default Parameters)
def greet(name="朋友"):
print(f"你好,{name}!")
greet() # 没有传参,使用默认值:朋友
greet("小李") # 输出:你好,小李!
4. 可变位置参数 *args
在函数参数中使用
*args,表示可以接受 任意数量的位置参数,这些参数会被打包成一个 元组。
示例:
def add_all(*args):
print(args)
return sum(args)
add_all(1, 2, 3) # 输出: (1, 2, 3),返回: 6
add_all(5, 10, 15, 20) # 输出: (5, 10, 15, 20),返回: 50
-
*args是一个打包器,把传进来的多个值组合成一个元组。 -
名字不一定必须叫
args,你也可以叫*numbers、*values,但惯例用args
5. 可变关键词参数 **kwargs
使用
**kwargs,表示可以接收 任意数量的关键词参数(形如key=value),它们会被打包成一个 字典。
示例:
def show_info(**kwargs):
print(kwargs)
show_info(name="Alice", age=30)
# 输出: {'name': 'Alice', 'age': 30}
-
**kwargs是一个打包器,把多个 key=value 的参数封装成一个字典。 -
名字不一定非得叫
kwargs,可以叫**data、**options,但惯例用kwargs(keyword arguments
6. 可变位置参数和可变关键词参数两者一起使用
示例:
def demo(a, *args, **kwargs):
print("a:", a)
print("args:", args)
print("kwargs:", kwargs)
demo(1, 2, 3, 4, name="Alice", age=25)
输出结果:
a: 1 args: (2, 3, 4) kwargs: {'name': 'Alice', 'age': 25}
两者对比表
| 类型 | 语法 | 接收内容 | 数据类型 | 示例调用方式 |
|---|---|---|---|---|
| 可变位置参数 | *args | 多个位置参数 | 元组 (tuple) | func(1, 2, 3) → args = (1, 2, 3) |
| 可变关键词参数 | **kwargs | 多个 key=value 参数 | 字典 (dict) | func(a=1, b=2) → kwargs = {'a': 1, 'b': 2} |
综合示例之函数参数打印机
def func(*args, **kwargs): print("位置参数:") for i in args: print(f" {i}") print("关键词参数:") for k, v in kwargs.items(): print(f" {k} = {v}") func(1, 2, 3, name="Tom", age=20)
三、参数的解包调用
1.什么是“参数解包”?
在 Python 中,我们可以用:
*解包 序列(如 list、tuple) 作为位置参数
**解包 字典(dict) 作为关键字参数这是函数调用时的一种简洁、灵活的写法。
2. 解包位置参数 *args
2.1 基础示例
def greet(name, age):
print(f"Hello, {name}. You are {age} years old.")
args = ["Alice", 30]
greet(*args) # 相当于:greet("Alice", 30)
-
*args把列表["Alice", 30]中的两个值,按顺序传给了greet的两个参数name和age。
2.2 另一个示例:传入任意长度的参数
def add(a, b, c):
print(a + b + c)
nums = (1, 2, 3)
add(*nums) # 相当于 add(1, 2, 3)
你也可以直接在函数定义中使用 *args 来接收任意个位置参数:
def print_all(*args):
for i in args:
print(i)
print_all("apple", "banana", "cherry")
3. 解包关键词参数 **kwargs
3.1 基础示例
def greet(name, age):
print(f"Hello, {name}. You are {age} years old.")
kwargs = {"name": "Alice", "age": 30}
greet(**kwargs) # 相当于 greet(name="Alice", age=30)
-
**kwargs会把字典中每个键值对,按关键词参数形式传入函数。
3.2 另一个例子:动态传参 + 默认参数
def introduce(name, age, country="Unknown"):
print(f"{name} is {age} years old from {country}.")
info = {"name": "Bob", "age": 25}
introduce(**info) # 没传 country,使用默认值
你也可以定义函数时用 **kwargs 来接收任意个关键词参数:
def show_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
show_info(name="Alice", age=30, hobby="reading")
4. 练习题
4.1 基础练习题
练习 1:解包位置参数
def multiply(a, b, c):
return a * b * c
nums = [2, 3, 4]
# 请使用 * 解包 nums,调用 multiply 函数
目标:学会用 *list 解包并作为位置参数传入函数。
参考答案:
def multiply(a, b, c):
return a * b * c
nums = [2, 3, 4]
result = multiply(*nums)
print(result) # 输出: 24
练习 2:解包关键词参数
def student_info(name, age, grade):
print(f"{name} is {age} years old and in grade {grade}.")
info = {"name": "Tom", "age": 15, "grade": 9}
# 请使用 ** 解包 info,调用 student_info 函数
目标:学会用 **dict 解包并作为关键词参数传入函数。
参考答案:
def student_info(name, age, grade):
print(f"{name} is {age} years old and in grade {grade}.")
info = {"name": "Tom", "age": 15, "grade": 9}
student_info(**info)
# 输出: Tom is 15 years old and in grade 9.
练习 3:遍历 kwargs 的 .items()
def print_kwargs(**kwargs):
# 请用 for 循环,遍历 kwargs,并输出 key 和 value
pass
# 调用:
print_kwargs(city="Beijing", year=2025, month="July")
目标:掌握 kwargs.items() 的使用方式。
参考答案:
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
print_kwargs(city="Beijing", year=2025, month="July")
# 输出:
# city = Beijing
# year = 2025
# month = July
4.2 进阶练习题:结合 *args 和 kwargs 使用
练习 1:函数同时接收位置参数和关键词参数
def demo(a, b, c=0, d=0):
print(a, b, c, d)
args = (1, 2)
kwargs = {"c": 3, "d": 4}
# 请将 args 和 kwargs 一起传入 demo 函数,打印输出
目标:掌握 *args + **kwargs 混合使用。
参考答案:
def demo(a, b, c=0, d=0):
print(a, b, c, d)
args = (1, 2)
kwargs = {"c": 3, "d": 4}
demo(*args, **kwargs)
# 输出: 1 2 3 4
#*args 解包为位置参数 a=1, b=2
#**kwargs 解包为 c=3, d=4
练习 2:用 *args 构建一个求和函数
# 定义一个函数 sum_all,它可以接收任意数量的数字,并返回它们的总和
# 提示:使用 *args 来接收参数
# 例:
# sum_all(1, 2, 3) => 6
# sum_all(10, 20) => 30
目标:灵活使用 *args 接收不定数量的位置参数。
参考答案:
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3)) # 输出: 6
print(sum_all(10, 20)) # 输出: 30
练习 3:统计关键词参数中的值类型
def analyze_kwargs(**kwargs):
# 输出每个 key 和对应值的类型
# 如:name => <class 'str'>,age => <class 'int'>
pass
# 调用:
analyze_kwargs(name="Alice", age=30, score=99.5)
目标:灵活使用 **kwargs 与 .items() 进行参数分析。
参考答案:
def analyze_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key} => {type(value)}")
analyze_kwargs(name="Alice", age=30, score=99.5)
# 输出:
# name => <class 'str'>
# age => <class 'int'>
# score => <class 'float'>
总结表格
| 符号位置 | * | ** |
|---|---|---|
| 函数定义中 | 把多个位置参数打包成 tuple → *args | 把多个关键词参数打包成 dict → **kwargs |
| 函数调用中 | 把序列(如 list/tuple)解包成多个位置参数 | 把字典解包成多个关键词参数 |
小编总结:放在形参前既定义函数,放在实参前既调用函数
符号位置 含义 动作 *在形参中打包位置参数 收集 → 元组 *在实参中解包序列为位置参数 拆开 → 传参 **在形参中打包关键词参数 收集 → 字典 **在实参中解包字典为关键词参数 拆开 → 传参
四、参数传递的顺序规则
1. 定义函数时,参数顺序必须遵循:
def func(
位置参数,
默认参数,
*args,
命名关键词参数(*之后的参数),
**kwargs
):
2. 调用函数时,顺序推荐:
func(位置参数, 关键词参数, *args, **kwargs)
五、函数调用返回值
1.单个返回值
def add(x, y):
return x + y
2.多个返回值
def calc(x, y):
return x + y, x - y
a, b = calc(5, 3)
注:不是所有函数都必须有返回值,但所有函数调用本质上都会返回一个值,即使你没写
return,Python 也会自动返回一个特殊的值:None。
情况 返回值 有 return 表达式返回表达式的结果 有 return(但没有值)返回 None没有写 return返回 None
六、常见错误与注意事项
参数数量不匹配:
TypeError: missing required positional argument多次传同一参数(位置+关键词):
TypeError: got multiple values for argument字典解包时缺失必要参数
*args和**kwargs顺序不能乱(调用中也要注意)
503

被折叠的 条评论
为什么被折叠?



