七. 函数(模块化的核心)
7.1 定义与调用
def greet(name):
"""显示问候语(文档字符串)"""
print(f"你好,{name}")
greet("小明") # 调用
# 带返回值
def add(a, b):
return a + b
result = add(3, 5)
7.2 参数类型详解
# 1. 位置参数(必须按顺序)
def introduce(name, age):
print(f"{name} {age}岁")
introduce("李华", 18)
# 2. 关键字参数(可乱序)
introduce(age=20, name="王芳")
# 3. 默认参数(必须放在位置参数之后)
def power(base, exponent=2):
return base ** exponent
print(power(3)) # 9
print(power(3, 3)) # 27
# 警告:默认参数不要用可变对象(如列表)
def add_item(item, lst=[]): # 错误示范,lst 会在函数定义时创建一次
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [1,2] 不是[2],因为共享同一个列表
# 正确做法
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
# 4. 可变位置参数 *args(元组)
def sum_all(*numbers):
return sum(numbers)
print(sum_all(1,2,3,4)) # 10
# 5. 可变关键字参数 **kwargs(字典)
def print_info(**info):
for k, v in info.items():
print(f"{k}: {v}")
print_info(name="张三", age=25)
# 6. 组合使用
def func(a, b, *args, c=10, **kwargs):
pass
7.3 返回值与作用域
# 多个返回值实际返回元组
def min_max(lst):
return min(lst), max(lst)
minimum, maximum = min_max([3,1,4,2])
# 作用域(LEGB规则)
x = 10 # 全局变量
def outer():
y = 20 # 外层变量
def inner():
z = 30 # 局部变量
nonlocal y # 声明要修改外层变量
y += 1
global x # 声明要修改全局变量
x += 1
print(x, y, z)
inner()
outer()
7.4 lambda 匿名函数
# 简单的单表达式函数
square = lambda x: x ** 2
print(square(5)) # 25
# 常与 sorted, filter, map 配合
students = [("张三", 85), ("李四", 92), ("王五", 78)]
students_sorted = sorted(students, key=lambda s: s[1], reverse=True)
print(students_sorted) # 按成绩降序
# filter 过滤
numbers = [1,2,3,4,5,6]
evens = list(filter(lambda x: x%2==0, numbers))
# map 映射
squared = list(map(lambda x: x**2, numbers))
7.5 递归(简单介绍)
# 计算阶乘
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5)) # 120
# 注意递归深度限制(默认1000)
7.6 装饰器入门(给函数增加功能)
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 耗时 {end-start:.4f}秒")
return result
return wrapper
@timer
def slow_function():
import time
time.sleep(1)
return "完成"
slow_function()
八. 模块与包
8.1 导入方式
# 方式1: 导入整个模块
import math
print(math.sqrt(16))
# 方式2: 导入特定函数
from random import randint, choice
print(randint(1,10))
# 方式3: 导入所有(不推荐,可能命名冲突)
from os import *
# 方式4: 起别名
import datetime as dt
now = dt.datetime.now()
8.2 if name == "main" 的作用
创建 mymodule.py:
def hello():
print("Hello from module")
if __name__ == "__main__":
# 当直接运行此文件时执行,被导入时不执行
hello()
8.3 创建自己的包
mypackage/
__init__.py # 可以为空,但必须存在
module1.py
module2.py
导入:from mypackage import module1
8.4 安装第三方库
pip install requests # 安装
pip list # 列出已安装
pip install requests==2.28.0 # 指定版本
pip freeze > requirements.txt # 导出依赖