第二篇:Python函数与模块化编程深度教程

发布于:2025-04-13 ⋅ 阅读:(44) ⋅ 点赞:(0)

第一章:函数定义与调用

1.1 函数基础架构

1.1.1 函数定义规范

函数定义采用def关键字,遵循PEP8命名规范(小写字母+下划线)

def calculate_circle_area(radius):
    """计算圆的面积"""  # 文档字符串
    PI = 3.14159
    return PI * radius ​**​ 2
1.1.2 调用机制解析

函数调用时创建独立栈帧,参数传递采用对象引用机制。示例演示参数传递对可变/不可变对象的影响

def modify_data(data):
    data.append(4)  # 修改可变对象
    data = [5,6,7]  # 创建新对象
    
nums = [1,2,3]
modify_data(nums)
print(nums)  # 输出[1,2,3,4]

1.2 参数传递体系

1.2.1 位置参数与关键字参数

位置参数按声明顺序传递,关键字参数显式指定参数名

def create_user(name, age, role="user"):
    print(f"{name} ({age}岁) - {role}")

create_user("Alice", 25)  # 位置参数
create_user(age=30, name="Bob", role="admin")  # 关键字参数
1.2.2 默认参数陷阱与解决方案

默认参数在函数定义时初始化,需避免使用可变默认参数

# 错误示例
def append_value(item, lst=[]):
    lst.append(item)
    return lst

# 正确做法
def safe_append(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst
1.2.3 可变参数处理

使用*args接收元组型位置参数,​**​kwargs接收字典型关键字参数

def dynamic_params(*args, ​**​kwargs):
    print(f"位置参数:{args}")
    print(f"关键字参数:{kwargs}")

dynamic_params(1,2,3, color="red", size=16)

1.3 返回值与作用域

1.3.1 多返回值机制

返回多个值时自动封装为元组,支持结构化赋值

def analyze_numbers(nums):
    return min(nums), max(nums), sum(nums)/len(nums)

min_val, max_val, avg = analyze_numbers([5,2,9,3])
1.3.2 作用域层级

四层作用域解析(LEGB规则)

global_var = 10

def outer_func():
    enclosed_var = 20
    def inner_func():
        local_var = 30
        print(global_var + enclosed_var + local_var)
    return inner_func
1.3.3 作用域修改实践

使用global和nonlocal关键字跨越作用域

counter = 0

def increment():
    global counter
    counter +=1

def outer():
    count = 0
    def inner():
        nonlocal count
        count +=1
    return inner

第二章:模块与包管理

2.1 标准库深度应用

2.1.1 math模块

数学运算核心功能演示

import math

print(math.gcd(48, 180))  # 最大公约数
print(math.radians(180))  # 角度转弧度
print(math.comb(10,3))    # 组合数计算
2.1.2 random模块

随机数生成系统

from random import randint, choices, shuffle

# 生成指定范围整数
print(randint(1,100))

# 权重抽样
colors = ['红', '蓝', '绿']
print(choices(colors, weights=[5,3,2], k=10))

# 列表洗牌
cards = list(range(1,53))
shuffle(cards)

2.2 模块化开发实践

2.2.1 自定义模块架构

规范化的模块创建流程

my_package/
├── __init__.py
├── math_utils.py
└── stats/
    ├── __init__.py
    └── descriptive.py
2.2.2 init.py进阶用法

控制模块导入行为

# __init__.py
__all__ = ['math_utils']  # 控制import *
from .math_utils import *  # 初始化导入

2.3 第三方库生态管理

2.3.1 pip高阶应用

完整的包管理流程

# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate  # Linux/Mac
.\.venv\Scripts\activate  # Windows

# 依赖管理
pip install requests==2.25.1
pip freeze > requirements.txt
pip install -r requirements.txt
2.3.2 Conda环境管理

科学计算环境配置

conda create -n myenv python=3.9
conda activate myenv
conda install numpy pandas matplotlib
conda list --export > spec-file.txt
2.3.3 复杂安装场景

多平台编译安装实践

# 从源码安装
git clone https://github.com/example/lib.git
cd lib
python setup.py install

# WHL文件安装
pip install path/to/package.whl

第三章:综合项目实战

3.1 科学计算模块开发

构建数学工具包:

# my_package/math_utils.py
def quadratic(a, b, c):
    """解二次方程"""
    discriminant = b​**​2 - 4*a*c
    if discriminant < 0:
        return None
    x1 = (-b + sqrt(discriminant)) / (2*a)
    x2 = (-b - sqrt(discriminant)) / (2*a)
    return (x1, x2)

def vector_norm(vector):
    """计算向量模长"""
    return sum(x​**​2 for x in vector)​**​0.5

3.2 数据可视化系统集成

结合第三方库的完整工作流:

import numpy as np
import matplotlib.pyplot as plt
from my_package import stats

data = np.random.normal(0, 1, 1000)
stats.descriptive_report(data)

plt.hist(data, bins=30)
plt.title("正态分布数据可视化")
plt.show()