当前位置: 首页 > news >正文

Python函数进阶:参数类型与返回值详解

目录

一、函数参数的五种类型

1.1 位置参数(必传参数)

1.2 默认参数

1.3 可变位置参数(*args)

1.4 关键字参数

1.5 可变关键字参数(**kwargs)

1.6 参数组合顺序

二、参数传递的细节

2.1 传值还是传引用?

2.2 使用 * 和 ** 解包参数

三、函数返回值详解

3.1 单个返回值

3.2 多个返回值

3.3 返回函数(闭包)

3.4 返回生成器(yield)

四、进阶技巧

4.1 使用类型提示(Type Hints)

4.2 强制关键字参数

4.3 参数与返回值的文档

五、总结


一、函数参数的五种类型

Python 函数的参数分为五类,按声明顺序依次为:

1. 位置参数(Positional Arguments)
2. 默认参数(Default Arguments)
3. 可变位置参数(*args)
4. 关键字参数(Keyword Arguments)
5. 可变关键字参数(**kwargs)

1.1 位置参数(必传参数)

位置参数是最常见的参数形式,调用时必须按定义顺序传递,且数量必须匹配。

python def greet(name, message): print(f"{message}, {name}!") greet("Alice", "Hello") # Hello, Alice! greet("Bob") # TypeError: missing 1 required positional argument

1.2 默认参数

在定义时给参数赋予默认值,调用时可以不传递该参数。默认参数必须放在位置参数之后。

python def greet(name, message="Hello"): print(f"{message}, {name}!") greet("Alice") # Hello, Alice! greet("Bob", "Hi") # Hi, Bob!

注意:默认参数在函数定义时计算,且只计算一次。如果默认参数是可变对象(如列表、字典),多次调用会共享该对象。

python def add_item(item, lst=[]): # 不推荐 lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [1, 2] 共享了同一个列表! # 推荐写法 def add_item(item, lst=None): if lst is None: lst = [] lst.append(item) return lst

1.3 可变位置参数(*args)

*args用于接收任意数量的位置参数,并将它们打包成一个元组。args是约定名称,可以改为其他名字,但*必不可少。

python def sum_all(*args): return sum(args) print(sum_all(1, 2, 3, 4)) # 10 print(sum_all()) # 0

应用场景:当不确定传入多少个参数时使用,如数学计算、装饰器等。

1.4 关键字参数

调用时使用 key=value形式传递的参数,可以不按顺序。但必须在所有位置参数之后传递。

python def describe_person(name, age, city): print(f"{name} is {age} years old and lives in {city}.") describe_person("Alice", city="New York", age=25) # 合法

1.5 可变关键字参数(**kwargs)

**kwargs用于接收任意数量的关键字参数,并将它们打包成一个字典。kwargs是约定名称,**必不可少。

python def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="Alice", age=25, city="New York")

1.6 参数组合顺序

在函数定义中,参数必须按以下顺序声明:

位置参数 → 默认参数 → *args → 关键字参数(仅限Python 3) → **kwargs
示例:

python def complex_func(a, b=1, *args, c, d=2, **kwargs): print(f"a={a}, b={b}, args={args}, c={c}, d={d}, kwargs={kwargs}") complex_func(10, 20, 30, 40, c=50, d=60, e=70, f=80) # a=10, b=20, args=(30, 40), c=50, d=60, kwargs={'e': 70, 'f': 80}

二、参数传递的细节

2.1 传值还是传引用?

Python 的参数传递是对象引用传递。简单说:如果传入的是不可变对象(如整数、字符串),函数内部修改会创建新对象,不影响外部;如果传入的是可变对象(如列表、字典),函数内部修改会影响外部。

python def modify(x, lst): x += 1 # 不可变对象,x指向新对象 lst.append(4) # 可变对象,原列表被修改 a = 10 b = [1,2,3] modify(a, b) print(a) # 10 print(b) # [1,2,3,4]

2.2 使用 * 和 ** 解包参数

在调用函数时,可以用 * 解包列表、元组为位置参数,用 **解包字典为关键字参数。

python def add(a, b, c): return a + b + c nums = [1, 2, 3] print(add(*nums)) # 6 kwargs = {'a': 10, 'b': 20, 'c': 30} print(add(**kwargs)) # 60

三、函数返回值详解

3.1 单个返回值

函数可以使用return返回任意类型的值。如果没有return或只有return,默认返回None。

python def square(x): return x ** 2 result = square(5) # 25

3.2 多个返回值

Python 函数可以返回多个值,实际上返回的是一个元组,可以自动解包。

python def get_stats(numbers): return min(numbers), max(numbers), sum(numbers) / len(numbers) min_val, max_val, avg = get_stats([1, 2, 3, 4, 5]) print(min_val, max_val, avg) # 1 5 3.0

3.3 返回函数(闭包)

函数可以作为返回值,形成闭包,保留外部函数的变量。

python def make_multiplier(n): def multiplier(x): return x * n return multiplier times2 = make_multiplier(2) times3 = make_multiplier(3) print(times2(5)) # 10 print(times3(5)) # 15

3.4 返回生成器(yield)

使用 yield可以让函数返回一个生成器对象,实现惰性求值,节省内存。

python def count_up_to(n): i = 1 while i <= n: yield i i += 1 for num in count_up_to(5): print(num) # 1 2 3 4 5

四、进阶技巧

4.1 使用类型提示(Type Hints)

Python 3.5+ 支持类型注解,提高代码可读性和 IDE 支持。

python def greet(name: str, age: int = 18) -> str: return f"{name} is {age} years old."

4.2 强制关键字参数

在 *之后的参数必须使用关键字传递,避免歧义。

python def person_info(name, *, age, city): print(f"{name}, {age}, {city}") person_info("Alice", age=25, city="NYC") # 正确 # person_info("Alice", 25, "NYC") # 错误

4.3 参数与返回值的文档

使用 docstring 清晰描述参数和返回值。

python def divide(a: float, b: float) -> float: """ 返回 a 除以 b 的结果。 参数: a (float): 被除数 b (float): 除数 返回: float: 商 异常: ZeroDivisionError: 当 b 为 0 时抛出 """ return a / b

五、总结

位置参数: def f(a, b), 必须按顺序传入
默认参数: def f(a, b=1)可选,定义时求值
可变位置参数: def f(*args), 接收多个位置参数,打包为元组
关键字参数: def f(a, *, b), * 后必须用关键字传递
可变关键字参数: def f(**kwargs), 接收多个关键字参数,打包为字典

http://www.jsqmd.com/news/552218/

相关文章:

  • WebSerialLite:ESP32浏览器串口调试终端
  • Ubuntu服务器部署OpenClaw+nanobot全记录
  • 告别Softmax分类头:用K-Means思想在PyTorch里实现语义分割原型网络
  • Python→WASM部署全流程拆解,7步完成TensorFlow Lite模型Web化(含CI/CD自动化模板)
  • Python智能内存管理最佳实践,从对象生命周期控制到弱引用缓存设计,避开GIL与引用计数的双重陷阱
  • springboot-vue+nodejs的酒店宾馆客房管理系统的设计与实现
  • Docker与NVIDIA CUDA深度学习环境部署:跨平台WSL/Linux镜像问题全解析
  • 03 AgentSkills 生态体系与跨平台支持全景
  • SenseVoice-small部署教程:WSL2子系统Windows本地开发环境完整搭建
  • Go的io.Writer和io.Reader接口:理解Go的IO哲学
  • Linux内核GNU C扩展特性解析与应用
  • 2026年正规吸塑包装优质公司推荐指南:吸塑包装盒、速冻食品托盘、速冻饺子托盘、食品吸塑包装内托、食品吸塑托盘选择指南 - 优质品牌商家
  • 用Python从零实现一个卡尔曼滤波器(附完整代码与可视化)
  • 如何利用CANoe的LINstress功能进行总线压力测试实战
  • 知名商店磁吸门帘优质公司推荐:西安磁吸门帘/超市棉门帘/超市磁吸门帘/陕西磁吸门帘/餐饮店棉门帘/餐饮磁吸门帘/选择指南 - 优质品牌商家
  • 维纳滤波语音信号降噪Matlab程序含报告 包含6页文档报告。 使用了维纳滤波的技术去除高斯噪...
  • ChromeDriver版本匹配与自动化测试环境搭建指南
  • 企业内部AI定制哪家强?
  • 信息论小白必看:用VB/Gamma/Delta编码理解熵编码本质
  • OpenClaw+GLM-4.7-Flash:个人阅读清单自动推荐系统
  • OpCore-Simplify终极指南:快速构建OpenCore EFI的自动化解决方案
  • 开关电源环路稳定性分析:用Multisim和MATLAB手把手教你画伯德图、算相位裕度
  • ADXL362嵌入式驱动开发:SPI通信、寄存器配置与低功耗唤醒
  • 嵌入式裸机编程中的内存管理实践与优化
  • Python MCP服务性能翻倍实录:基于asyncpg+uvloop+Pydantic V2的模板优化路径(QPS从83→417实测数据)
  • 没有独立显卡也能跑!Windows10上保姆级部署OmniParser屏幕解析模型(含镜像下载加速)
  • 2026年优秀新型终端电力钢杆12厂家推荐:新型输电钢管杆/新型钢管杆/新型110kv终端钢管杆/新型110千伏电力钢杆/选择指南 - 优质品牌商家
  • 2026自动化设备直线导轨供应商推荐指南:抽屉滑轨/直线滑轨/米思米滑轨/超重型滑轨/钢制滑轨/钢珠滑轨/铝合金滑轨/选择指南 - 优质品牌商家
  • Free Texture Packer:提升资源管理效率的纹理打包解决方案
  • OpenClaw飞书机器人实战:QwQ-32B驱动自动化问答系统