1. Python函数基础:从零开始构建代码复用能力
作为一名有十年Python开发经验的工程师,我深知函数是Python编程中最基础也是最重要的概念之一。很多初学者在刚开始学习Python时,往往会忽视函数的真正价值,直到项目规模扩大后才意识到代码复用和模块化的重要性。
1.1 为什么我们需要函数?
想象你正在开发一个用户管理系统,需要在多个地方向用户显示问候信息。没有函数的情况下,代码可能是这样的:
python复制print("早上好,张先生!今天是2023-07-15")
# ... 其他代码 ...
print("早上好,李女士!今天是2023-07-15")
# ... 更多代码 ...
print("早上好,王小姐!今天是2023-07-15")
这种写法存在几个明显问题:
- 重复代码:相同的问候逻辑被复制粘贴多次
- 维护困难:如果需要修改问候格式,必须修改多处
- 容易出错:人工复制粘贴容易遗漏某些地方
使用函数可以完美解决这些问题:
python复制from datetime import date
def greet_user(name, title):
"""生成个性化的问候语"""
today = date.today().strftime("%Y-%m-%d")
return f"早上好,{title}{name}!今天是{today}"
print(greet_user("张", "先生"))
print(greet_user("李", "女士"))
print(greet_user("王", "小姐"))
现在,如果需要修改问候格式,只需修改函数内部一处代码即可。
1.2 函数的基本结构
一个完整的Python函数包含以下几个关键部分:
python复制def function_name(parameters: type) -> return_type:
"""文档字符串(docstring)"""
# 函数体
return value
让我们通过一个计算BMI指数的函数来具体说明:
python复制def calculate_bmi(weight: float, height: float) -> float:
"""
计算身体质量指数(BMI)
参数:
weight: 体重,单位千克
height: 身高,单位米
返回:
BMI值,保留两位小数
"""
if height <= 0:
raise ValueError("身高必须大于0")
bmi = weight / (height ** 2)
return round(bmi, 2)
这个例子展示了:
- 明确的参数和返回类型提示
- 完善的文档说明
- 参数验证
- 清晰的返回结果
1.3 函数的参数传递
Python提供了多种参数传递方式,让函数更加灵活:
位置参数
最基本的参数传递方式:
python复制def power(base, exponent):
return base ** exponent
print(power(2, 3)) # 8
关键字参数
通过参数名指定值,顺序不重要:
python复制print(power(exponent=3, base=2)) # 8
默认参数
为参数提供默认值:
python复制def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("Alice")) # Hello, Alice!
print(greet("Bob", "Hi")) # Hi, Bob!
可变参数
使用*args接收任意数量的位置参数:
python复制def average(*numbers):
return sum(numbers) / len(numbers) if numbers else 0
print(average(1, 2, 3, 4)) # 2.5
使用**kwargs接收任意数量的关键字参数:
python复制def print_info(**info):
for key, value in info.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, city="New York")
1.4 返回值与类型提示
Python函数可以返回任何类型的值,也可以不返回(实际返回None)。现代Python开发中,类型提示已经成为最佳实践:
python复制from typing import List, Tuple
def analyze_numbers(numbers: List[float]) -> Tuple[float, float, float]:
"""返回最大值、最小值和平均值"""
if not numbers:
raise ValueError("列表不能为空")
return max(numbers), min(numbers), sum(numbers)/len(numbers)
类型提示的好处:
- 提高代码可读性
- 获得更好的IDE支持
- 可以使用mypy等工具进行静态检查
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
