函数的定义与调用¶
问题89:什么是函数?为什么要使用函数?¶
函数是一段可重复使用的代码块,用于执行特定的任务:
使用函数的好处:¶
- 代码复用:避免重复编写相同的代码
- 模块化:将复杂问题分解为小问题
- 可维护性:修改一处,影响全局
- 可读性:函数名可以表达功能意图
问题90:如何定义和调用函数?¶
# 1. 无参数函数
def say_hello():
print("Hello!")
# 2. 有参数函数
def greet(name):
print(f"Hello, {name}!")
# 3. 有返回值函数
def add(a, b):
return a + b
# 4. 多参数函数
def calculate_area(length, width):
area = length * width
return area
# 调用函数
say_hello() # Hello!
greet("张三") # Hello, 张三!
result = add(3, 5) # result = 8
area = calculate_area(4, 5) # area = 20
问题91:函数的参数有哪些类型?¶
# 1. 位置参数
def greet(name, age):
print(f"姓名: {name}, 年龄: {age}")
greet("张三", 25) # 按位置传递参数
# 2. 关键字参数
greet(age=25, name="张三") # 按名称传递参数
# 3. 默认参数
def greet_with_default(name, age=18):
print(f"姓名: {name}, 年龄: {age}")
greet_with_default("李四") # 使用默认年龄
greet_with_default("王五", 30) # 覆盖默认年龄
# 4. 可变参数
def sum_numbers(*args):
total = 0
for num in args:
total += num
return total
result = sum_numbers(1, 2, 3, 4, 5) # result = 15
# 5. 关键字可变参数
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="张三", age=25, city="北京")
问题92:函数的返回值如何处理?¶
# 1. 单个返回值
def square(x):
return x * x
result = square(5) # result = 25
# 2. 多个返回值
def get_name_and_age():
return "张三", 25
name, age = get_name_and_age()
print(f"姓名: {name}, 年龄: {age}")
# 3. 无返回值(返回None)
def print_message(msg):
print(msg)
# 没有return语句,默认返回None
result = print_message("Hello")
print(result) # None
# 4. 条件返回值
def divide(a, b):
if b == 0:
return None # 除零时返回None
return a / b
result = divide(10, 2) # result = 5.0
result = divide(10, 0) # result = None
问题93:函数的作用域是什么?¶
# 全局变量
global_var = "我是全局变量"
def test_scope():
# 局部变量
local_var = "我是局部变量"
print(global_var) # 可以访问全局变量
print(local_var) # 可以访问局部变量
test_scope()
# print(local_var) # 错误:局部变量在函数外不可访问
# 修改全局变量
def modify_global():
global global_var
global_var = "修改后的全局变量"
modify_global()
print(global_var) # 修改后的全局变量
问题94:函数的高级特性有哪些?¶
# 1. 函数作为参数
def apply_operation(x, y, operation):
return operation(x, y)
def add(a, b):
return a + b
def multiply(a, b):
return a * b
result1 = apply_operation(3, 4, add) # result1 = 7
result2 = apply_operation(3, 4, multiply) # result2 = 12
# 2. 函数作为返回值
def create_multiplier(factor):
def multiplier(x):
return x * factor
return multiplier
double = create_multiplier(2)
triple = create_multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
# 3. 装饰器
def my_decorator(func):
def wrapper():
print("函数执行前")
func()
print("函数执行后")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
问题95:函数的实际应用场景有哪些?¶
# 1. 数据处理
def process_data(data):
# 数据清洗
cleaned_data = [item for item in data if item is not None]
# 数据转换
processed_data = [item * 2 for item in cleaned_data]
return processed_data
# 2. 计算工具
def calculate_statistics(numbers):
if not numbers:
return None
return {
'count': len(numbers),
'sum': sum(numbers),
'average': sum(numbers) / len(numbers),
'max': max(numbers),
'min': min(numbers)
}
# 3. 验证函数
def validate_email(email):
import re
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
# 4. 文件处理
def read_file_lines(filename):
try:
with open(filename, 'r', encoding='utf-8') as file:
return file.readlines()
except FileNotFoundError:
print(f"文件 {filename} 不存在")
return []
# 5. 用户交互
def get_user_choice(options):
while True:
print("请选择:")
for i, option in enumerate(options, 1):
print(f"{i}. {option}")
try:
choice = int(input("请输入选择: "))
if 1 <= choice <= len(options):
return options[choice - 1]
else:
print("选择超出范围")
except ValueError:
print("请输入有效数字")
问题96:如何编写高质量的函数?¶
# 1. 使用描述性的函数名
def calculate_circle_area(radius):
return 3.14159 * radius ** 2
# 2. 添加文档字符串
def calculate_rectangle_area(length, width):
"""
计算矩形的面积
参数:
length (float): 矩形的长度
width (float): 矩形的宽度
返回:
float: 矩形的面积
"""
return length * width
# 3. 参数验证
def safe_divide(a, b):
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError("参数必须是数字")
if b == 0:
raise ValueError("除数不能为零")
return a / b
# 4. 使用类型提示
def add_numbers(a: int, b: int) -> int:
return a + b
# 5. 单一职责原则
def validate_user_input(username, password):
errors = []
if not username:
errors.append("用户名不能为空")
if len(password) < 6:
errors.append("密码长度至少6位")
return len(errors) == 0, errors
问题97:函数的调试技巧有哪些?¶
# 1. 使用print语句调试
def debug_function(x, y):
print(f"输入参数: x={x}, y={y}")
result = x + y
print(f"计算结果: {result}")
return result
# 2. 使用断言
def divide(a, b):
assert b != 0, "除数不能为零"
return a / b
# 3. 使用日志
import logging
def process_data(data):
logging.info(f"开始处理数据,长度: {len(data)}")
for i, item in enumerate(data):
logging.debug(f"处理第{i}个元素: {item}")
# 处理逻辑
logging.info("数据处理完成")
# 4. 使用异常处理
def safe_operation(data):
try:
result = process_data(data)
return result
except Exception as e:
print(f"处理数据时出错: {e}")
return None
问题98:函数的最佳实践¶
# 1. 保持函数简短
def calculate_tax(income):
if income <= 50000:
return income * 0.1
elif income <= 100000:
return income * 0.2
else:
return income * 0.3
# 2. 避免副作用
def pure_function(x, y):
return x + y # 没有副作用
# 3. 使用默认参数
def create_user(name, age=18, city="未知"):
return {"name": name, "age": age, "city": city}
# 4. 使用*args和**kwargs
def flexible_function(*args, **kwargs):
print(f"位置参数: {args}")
print(f"关键字参数: {kwargs}")
# 5. 函数组合
def compose(f, g):
return lambda x: f(g(x))
def add_one(x):
return x + 1
def multiply_two(x):
return x * 2
add_one_then_multiply = compose(multiply_two, add_one)
result = add_one_then_multiply(5) # (5 + 1) * 2 = 12
总结¶
函数是Python编程的基础,要点包括: - 定义和调用:使用def关键字定义函数 - 参数类型:位置参数、关键字参数、默认参数、可变参数 - 返回值:使用return语句返回值 - 作用域:全局变量和局部变量的访问规则 - 高级特性:函数作为参数、返回值、装饰器 - 最佳实践:单一职责、参数验证、文档字符串 - 调试技巧:print、断言、日志、异常处理