Vcenter 7.0.3 no healthy upstream报错排查:服务、数据库、证书与磁盘问题全解析
2026/10/1 6:27:03
Python 函数基础:代码复用的艺术
(2026 年小白友好版,从零到能写出优雅、可维护函数)
函数是 Python 中最重要的代码组织方式之一。
一句话总结它的核心价值:
把一段可重复使用的代码“封装”起来,给它起个名字,需要时直接“调用”它,而不是每次都复制粘贴。
这正是“不要重复自己(DRY)”原则最直接的体现。
| 写法风格 | 代码示例 | 优点 | 缺点 / 问题点 | 推荐指数(2026) |
|---|---|---|---|---|
| 原始重复代码 | 每次都写print("欢迎", name) | 简单 | 改一处要改多处,易出错 | ★☆☆☆☆ |
| 基本 def 函数 | def greet(name): print("欢迎", name) | 初步复用 | 参数类型不清晰,易传错 | ★★★☆☆ |
| 默认值 + 关键字 | def greet(name, greeting="欢迎") | 调用更灵活 | 可变默认值陷阱 | ★★★★☆ |
| 类型提示(现代) | def greet(name: str, greeting: str = "欢迎") -> None: | 可读性强、IDE 提示好、静态检查友好 | 稍显冗长(但值得) | ★★★★★ |
def函数名(参数1:类型,参数2:类型=默认值,*args,**kwargs)->返回类型:""" 函数的文档字符串(docstring) 第一行:一句话概括功能 后续:详细说明每个参数、返回值、可能抛出的异常、用法示例 Args: 参数1: 说明这是什么 参数2: 可选,默认值含义 Returns: 返回什么东西,什么格式 Raises: ValueError: 当xxx时抛出 """# 函数体(实现逻辑)# 建议:函数体尽量控制在 20-30 行以内result=...returnresult| 参数种类 | 语法 | 传递方式 | 常见陷阱 | 最佳实践(2026) |
|---|---|---|---|---|
| 位置参数 | def add(a, b) | add(3, 5) | 顺序错乱难读 | 少用超过 3 个的位置参数 |
| 关键字参数 | add(b=5, a=3) | 显式指定名字 | — | 优先使用,尤其参数多时 |
| 默认参数 | def greet(name, msg="你好") | 可省略 | 可变默认值(如 list/dict)只创建一次 | 默认值用不可变对象;可变默认值写成=None+ 内部分配 |
| 可变位置参数 | *args | func(1,2,3,4)→ args=(1,2,3,4) | 名字不明确 | 常用在“接受任意数量参数”场景,如 print/log |
| 可变关键字参数 | **kwargs | func(a=1, b=2)→ kwargs={‘a’:1,‘b’:2} | 同上 | 常用于“透传参数”、配置、继承等 |
经典默认参数陷阱演示 & 正确写法
# 错误示范(经典面试/生产事故)defadd_item(item,bag=[]):# bag 只在函数定义时创建一次!bag.append(item)returnbagprint(add_item("苹果"))# ['苹果']print(add_item("香蕉"))# ['苹果', '香蕉'] ← 惊不惊喜?!# 正确写法(2026 社区共识)defadd_item(item,bag=None):ifbagisNone:bag=[]# 每次调用都创建新列表bag.append(item)returnbagprint(add_item("苹果"))# ['苹果']print(add_item("香蕉"))# ['香蕉'] ← 正确!# 1. 返回单个值(最常见)defsquare(n:int)->int:returnn*n# 2. 返回多个值(其实是返回 tuple,可解包)defget_user_info()->tuple[str,int,str]:return"Alice",28,"Beijing"name,age,city=get_user_info()# 推荐写法info=get_user_info()# 也可以整体接收# 3. 返回 None(明确什么都不返回)deflog(message:str)->None:print(f"[LOG]{message}")# 4. 早期返回(guard clause 写法,更清晰)defdivide(a:float,b:float)->float|None:ifb==0:print("除数不能为0")returnNonereturna/bx=100# Globaldefouter():x=50# Enclosing( nonlocal 可修改这个)definner():# x = 10 # Local(如果定义了就是这个)nonlocalx# 声明要修改 outer 的 xx=20print(x)# 20inner()print(x)# 20(被修改了)outer()print(x)# 100(全局没变)calculate_total_price)safe_divide(a, b),处理除零返回 None 并打印警告print_info(**kwargs),能接受任意键值对并美观打印log(msg, level="INFO")average(*numbers)函数是 Python 编程的“最小复用单元”。
掌握了函数,你就从“写脚本”真正迈向“写程序”。
有哪一部分还想再深入?
比如:
告诉我,我继续给你展开~