当前位置:首页>python>Python函数编程最佳实践:让代码像乐高一样拼装自如

Python函数编程最佳实践:让代码像乐高一样拼装自如

  • 2026-02-21 08:10:20
Python函数编程最佳实践:让代码像乐高一样拼装自如

1. 引言:为什么要学模块化编程?

嘿,我是你的Python学习搭子!咱们已经一起走过了Python基础语法的关卡,是不是觉得写代码越来越有意思了?但是你有没有遇到过这样的情况:

  • • 写了一个几百行的程序,想改一个小功能,结果牵一发而动全身?
  • • 同样的逻辑在不同地方复制粘贴了好几次,改起来要到处找?
  • • 看着自己写的代码,过了一周连自己都看不懂了?

别慌,这些都是每个编程小白都会遇到的“成长烦恼”。今天,咱们就要学习一种能让代码变得整洁、可复用、易维护的神奇魔法——模块化编程

模块化编程的核心思想很简单:把复杂的大问题拆分成一个个小模块,每个模块负责一个具体的功能。就像乐高积木一样,我们可以用这些小模块拼装出各种复杂的程序。

这周的学习目标很明确:

  1. 1. 掌握函数定义和调用的基本技能,让代码告别重复劳动
  2. 2. 理解参数传递的各种玩法,让函数变得更加灵活
  3. 3. 学会使用返回值,让函数之间能够“对话”
  4. 4. 掌握模块导入机制,体验Python生态的强大

学完这周,你就能把之前的“一锅炖”代码,变成清晰、可维护的模块化结构。咱们开始吧!

2. 核心内容:函数编程的四大基石

2.1 函数定义:给代码块起个名字

什么是函数?函数就像一个小型的“代码工厂”,你给它输入原材料(参数),它经过加工处理,产出成品(返回值)。定义函数的基本语法很简单:

def函数名(参数1, 参数2, ...):"""这里是函数的文档字符串,说明函数的功能"""# 函数体:具体的处理逻辑return 返回值  # 可选,如果不写return,函数默认返回None

咱们来拆解一下:

  • • def 是定义函数的关键字,告诉Python:“嘿,我要创建一个新函数啦!”
  • • 函数名 要遵循命名规则:小写字母,单词间用下划线连接(例如:calculate_average
  • • 参数列表 放在括号里,可以有零个或多个参数
  • • 冒号: 不能少,表示函数头结束,函数体开始
  • • 函数体要缩进(通常是4个空格),这是Python区分代码块的唯一方式
  • • return 语句用于返回结果,如果没有return,函数会默默返回None

常见错误与解决方案:

  • • ❌ 错误1:忘记冒号
    defsay_hello()  # 缺少冒号!print("Hello")
    ✅ 正确写法def say_hello():
  • • ❌ 错误2:缩进不一致
    defdemo():print("第一行")print("第二行")  # 缩进不一致!
    ✅ 正确写法:统一使用4个空格或一个Tab
  • • ❌ 错误3:函数名使用关键字
    defprint(message):  # print是内置函数名returnf"Message: {message}"
    ✅ 正确写法:避免使用Python关键字和内置函数名

2.2 参数传递:函数的“花样玩法”

参数让函数变得灵活多变。Python支持多种参数传递方式,咱们一种一种来解锁。

2.2.1 位置参数:最基础的方式

defgreet(name, greeting):"""根据名字和问候语生成问候字符串"""returnf"{greeting}{name}!"# 调用时按位置传递参数message = greet("小明""你好")  # 输出:你好, 小明!

使用场景:参数顺序固定,且所有参数都必须传递。

2.2.2 默认参数:给参数设个“备胎”

defgreet(name, greeting="你好"):"""问候某人,默认使用'你好'"""returnf"{greeting}{name}!"# 可以只传递必填参数message1 = greet("小明")          # 输出:你好, 小明!message2 = greet("小明""Hi")   # 输出:Hi, 小明!

重要规则

  1. 1. 默认参数必须放在位置参数后面
  2. 2. 默认值只计算一次,对于可变对象(如列表、字典)要小心!

坑点预警

defadd_item(item, items=[]):  # 危险!默认值是可变对象    items.append(item)return itemsprint(add_item("apple"))   # ['apple']print(add_item("banana"))  # ['apple', 'banana'] !之前的调用影响了结果

✅ 安全写法

defadd_item(item, items=None):if items isNone:        items = []    items.append(item)return items

2.2.3 关键字参数:按名字传递

defcreate_user(name, age, city="北京", country="中国"):"""创建用户信息"""return {"name": name,"age": age,"city": city,"country": country    }# 使用关键字参数,顺序不重要user1 = create_user("张三"25, city="上海")user2 = create_user(age=30, name="李四", country="美国")

优点

  • • 提高代码可读性
  • • 允许跳过某些默认参数
  • • 参数顺序自由

2.2.4 可变参数:处理不确定数量的参数

有时候我们不知道要传递多少个参数,Python提供了两种可变参数:

*args:接收任意数量的位置参数

defcalculate_sum(*numbers):"""计算任意数量数字的和"""    total = 0for num in numbers:        total += numreturn totalprint(calculate_sum(123))      # 6print(calculate_sum(12345)) # 15

**kwargs:接收任意数量的关键字参数

defprint_user_info(**info):"""打印用户的所有信息"""for key, value in info.items():print(f"{key}{value}")print_user_info(name="小明", age=20, city="北京")

混合使用时的顺序规则

defcomplex_func(a, b, *args, c=10, d=20, **kwargs):# a, b: 位置参数# *args: 可变位置参数# c, d: 默认参数(关键字参数)# **kwargs: 可变关键字参数pass

2.3 返回值处理:函数的“成果展示”

函数处理完数据后,需要把结果“告诉”调用者,这就是返回值的作用。

2.3.1 单个返回值

defsquare(number):"""计算一个数的平方"""return number ** 2result = square(5)  # result = 25

2.3.2 多个返回值(元组解包)

Python函数可以返回多个值,实际上返回的是一个元组:

defmin_max(numbers):"""找出列表中的最小值和最大值"""ifnot numbers:returnNoneNonereturnmin(numbers), max(numbers)# 元组解包minimum, maximum = min_max([3141592])print(f"最小值: {minimum}, 最大值: {maximum}")

实用技巧:使用_忽略不需要的返回值

defget_user_info():return"小明"20"北京"name, age, _ = get_user_info()  # 忽略城市信息

2.3.3 返回函数(高阶函数)

函数可以返回另一个函数,这是函数式编程的基础:

defmultiplier(factor):"""创建一个乘以指定因子的函数"""defmultiply(x):return x * factorreturn multiplydouble = multiplier(2)triple = multiplier(3)print(double(5))  # 10print(triple(5))  # 15

应用场景:创建工厂函数、实现闭包、装饰器等高级功能。

2.4 作用域:变量的“活动范围”

理解作用域是避免BUG的关键。Python有四种作用域:

  1. 1. 局部作用域(Local):函数内部定义的变量
  2. 2. 闭包作用域(Enclosing):嵌套函数中,外层函数的作用域
  3. 3. 全局作用域(Global):模块级别定义的变量
  4. 4. 内置作用域(Built-in):Python内置的变量和函数

作用域查找顺序:Local → Enclosing → Global → Built-in(LEGB规则)

x = "全局变量"defouter():    x = "闭包变量"definner():        x = "局部变量"print(f"inner: {x}")  # 输出:局部变量    inner()print(f"outer: {x}")      # 输出:闭包变量outer()print(f"全局: {x}")           # 输出:全局变量

globalnonlocal关键字

  • • global: 在函数内部修改全局变量
  • • nonlocal: 在嵌套函数中修改外层函数的变量
defcounter():    count = 0defincrement():nonlocal count  # 告诉Python:我要修改外层函数的count        count += 1return countreturn incrementc = counter()print(c())  # 1print(c())  # 2

2.5 模块导入:Python的“武器库”

模块是Python代码的组织单位,一个.py文件就是一个模块。导入模块让我们能使用别人写好的代码。

2.5.1 基本导入方式

# 导入整个模块import mathprint(math.sqrt(16))  # 4.0# 导入特定函数/类from math import sqrt, piprint(sqrt(9))  # 3.0print(pi)       # 3.141592653589793# 给模块起别名(常用于长模块名)import numpy as npimport pandas as pd# 导入模块中的所有内容(不推荐,容易命名冲突)from math import *

2.5.2 自定义模块

创建自己的模块非常简单:

文件结构:

my_math/├── __init__.py    # 标识这是一个包├── basic.py       # 基础运算模块└── advanced.py    # 高级运算模块

basic.py内容:

defadd(a, b):return a + bdefmultiply(a, b):return a * b

使用自定义模块:

# 从当前目录导入from my_math.basic import add, multiplyprint(add(23))       # 5print(multiply(23))  # 6

2.5.3 模块搜索路径

当导入模块时,Python会按以下顺序查找:

  1. 1. 当前目录
  2. 2. 环境变量PYTHONPATH指定的目录
  3. 3. Python安装目录的标准库
  4. 4. 第三方库安装目录(如site-packages)

查看模块位置:

import mathprint(math.__file__)  # 显示math模块的文件路径

2.5.4 if __name__ == "__main__"的作用

这个魔法语句让模块既能被导入,又能直接运行:

# my_module.pydefmain():print("这是主程序")if __name__ == "__main__":# 当直接运行此文件时执行    main()else:# 当被导入为模块时执行print("my_module被导入")

作用

  • • 提供模块的测试代码
  • • 防止导入时自动执行不必要的代码
  • • 提高代码的复用性

3. 示例代码:动手实践才是王道

理论说再多,不如动手写代码。咱们来看几个实用的例子。

示例1:简易数学运算库

"""math_operations.py一个简易的数学运算库,包含基本运算函数"""defadd(*numbers):"""    计算任意数量数字的和    参数:        *numbers: 任意数量的数字    返回:        所有数字的和    示例:        >>> add(1, 2, 3)        6        >>> add(10, 20, 30, 40)        100    """returnsum(numbers)defsubtract(a, b):"""    计算两个数的差    参数:        a: 被减数        b: 减数    返回:        a - b 的结果    """return a - bdefmultiply(*numbers):"""    计算任意数量数字的乘积    参数:        *numbers: 任意数量的数字    返回:        所有数字的乘积    注意:        如果没有传入参数,返回1(乘法的单位元)    """ifnot numbers:return1    result = 1for num in numbers:        result *= numreturn resultdefdivide(a, b):"""    计算两个数的商    参数:        a: 被除数        b: 除数    返回:        a / b 的结果    异常:        ZeroDivisionError: 当除数为0时抛出    """if b == 0:raise ZeroDivisionError("除数不能为0")return a / bdefpower(base, exponent):"""    计算幂运算    参数:        base: 底数        exponent: 指数    返回:        base的exponent次幂    """return base ** exponent# 模块测试代码if __name__ == "__main__":# 测试加法print("加法测试:")print(f"1 + 2 = {add(12)}")print(f"1 + 2 + 3 + 4 = {add(1234)}")# 测试减法print("\n减法测试:")print(f"10 - 3 = {subtract(103)}")# 测试乘法print("\n乘法测试:")print(f"2 × 3 = {multiply(23)}")print(f"2 × 3 × 4 = {multiply(234)}")# 测试除法print("\n除法测试:")print(f"10 ÷ 2 = {divide(102)}")# 测试幂运算print("\n幂运算测试:")print(f"2³ = {power(23)}")

示例2:参数传递的不同方式演示

"""parameter_demo.py展示Python函数参数传递的各种方式"""defstudent_info(name, age, city="北京", *hobbies, **additional_info):"""    收集学生信息的函数,演示各种参数类型    参数:        name: 姓名(位置参数)        age: 年龄(位置参数)        city: 城市(默认参数)        *hobbies: 兴趣爱好(可变位置参数)        **additional_info: 附加信息(可变关键字参数)    返回:        包含所有信息的字典    """    info = {"姓名": name,"年龄": age,"城市": city    }# 处理兴趣爱好if hobbies:        info["兴趣爱好"] = list(hobbies)# 处理附加信息if additional_info:        info.update(additional_info)return infodefdemonstrate_parameter_types():"""演示各种参数传递方式"""print("=== 参数传递方式演示 ===\n")# 1. 基本位置参数print("1. 基本位置参数:")    student1 = student_info("张三"20)print(f"  {student1}")# 2. 使用关键字参数(顺序不重要)print("\n2. 关键字参数(顺序自由):")    student2 = student_info(age=22, name="李四", city="上海")print(f"  {student2}")# 3. 使用默认参数print("\n3. 使用默认参数(不传递city):")    student3 = student_info("王五"21)print(f"  {student3}")# 4. 可变位置参数(*hobbies)print("\n4. 可变位置参数(多个兴趣爱好):")    student4 = student_info("赵六"23"广州""篮球""音乐""阅读")print(f"  {student4}")# 5. 可变关键字参数(**additional_info)print("\n5. 可变关键字参数(附加信息):")    student5 = student_info("钱七"24"深圳""摄影"        班级="计算机1班"        学号="20230001"    )print(f"  {student5}")# 6. 混合使用print("\n6. 所有参数类型混合使用:")    student6 = student_info("孙八",25,"成都","游泳""爬山""编程",        电话="13800138000",        邮箱="sunba@example.com",        成绩={"数学"95"英语"88}    )print(f"  {student6}")defdemonstrate_argument_unpacking():"""演示参数解包"""print("\n=== 参数解包演示 ===\n")# 准备数据    positional_args = ("周九"26)    keyword_args = {"city""杭州""专业""软件工程"}print("使用*解包位置参数:")    student = student_info(*positional_args)print(f"  {student}")print("\n使用**解包关键字参数:")    student = student_info("吴十"27, **keyword_args)print(f"  {student}")print("\n同时解包位置参数和关键字参数:")    student = student_info(*positional_args, **keyword_args)print(f"  {student}")if __name__ == "__main__":    demonstrate_parameter_types()    demonstrate_argument_unpacking()

示例3:模块导入和使用的完整流程

让我们创建一个完整的项目,演示模块化的威力:

项目结构:

school_management/├── __init__.py├── students/│   ├── __init__.py│   ├── basic_info.py    # 学生基本信息模块│   ├── grades.py        # 成绩管理模块│   └── utils.py         # 工具函数├── teachers/│   ├── __init__.py│   └── management.py    # 教师管理模块└── main.py              # 主程序

students/basic_info.py:

"""学生基本信息模块"""defcreate_student(name, age, student_id):"""    创建学生基本信息    参数:        name: 姓名        age: 年龄        student_id: 学号    返回:        包含学生信息的字典    """return {"name": name,"age": age,"student_id": student_id,"courses": []  # 初始为空列表    }defadd_course(student, course_name):"""    为学生添加课程    参数:        student: 学生信息字典        course_name: 课程名称    返回:        更新后的学生信息    """if"courses"notin student:        student["courses"] = []if course_name notin student["courses"]:        student["courses"].append(course_name)return studentdefget_student_summary(student):"""    获取学生信息摘要    参数:        student: 学生信息字典    返回:        格式化的学生信息字符串    """    courses = student.get("courses", [])    course_count = len(courses)    summary = f"""    学生信息摘要:    -------------    姓名: {student['name']}    年龄: {student['age']}    学号: {student['student_id']}    课程数量: {course_count}    """if course_count > 0:        summary += "\n    选修课程: " + ", ".join(courses)return summary

students/grades.py:

"""学生成绩管理模块"""defadd_grade(student, course_name, grade):"""    为学生添加课程成绩    参数:        student: 学生信息字典        course_name: 课程名称        grade: 成绩(0-100)    返回:        更新后的学生信息    异常:        ValueError: 当成绩不在0-100范围内时    """ifnot0 <= grade <= 100:raise ValueError("成绩必须在0-100范围内")# 确保grades字典存在if"grades"notin student:        student["grades"] = {}# 添加或更新成绩    student["grades"][course_name] = gradereturn studentdefcalculate_average(student):"""    计算学生的平均成绩    参数:        student: 学生信息字典    返回:        平均成绩(如果没有成绩返回None)    """    grades = student.get("grades", {})ifnot grades:returnNone    total = sum(grades.values())    average = total / len(grades)returnround(average, 2)defget_grade_report(student):"""    生成成绩报告    参数:        student: 学生信息字典    返回:        格式化的成绩报告字符串    """    grades = student.get("grades", {})ifnot grades:return"暂无成绩信息"    report = "成绩报告:\n"    report += "-" * 30 + "\n"for course, grade in grades.items():        level = "优秀"if grade >= 90else"良好"if grade >= 80else"及格"if grade >= 60else"不及格"        report += f"{course}{grade}分 ({level})\n"    avg = calculate_average(student)if avg isnotNone:        report += f"\n平均成绩: {avg}分"return report

students/utils.py:

"""学生管理工具函数"""defvalidate_student_id(student_id):"""    验证学号格式    参数:        student_id: 学号字符串    返回:        bool: 格式是否有效    规则:        - 必须是8位数字        - 前4位是年份        - 后4位是序列号    """ifnotisinstance(student_id, str):returnFalseiflen(student_id) != 8:returnFalseifnot student_id.isdigit():returnFalse    year = int(student_id[:4])    current_year = 2026# 假设当前年份# 年份应该在合理范围内(如2000-当前年份)return2000 <= year <= current_yeardefformat_student_info(student, include_grades=True):"""    格式化学生信息用于显示    参数:        student: 学生信息字典        include_grades: 是否包含成绩信息    返回:        格式化的字符串    """    info = f"【{student['name']}】 学号: {student['student_id']} 年龄: {student['age']}"    courses = student.get("courses", [])if courses:        info += f"\n  课程: {', '.join(courses)}"if include_grades and"grades"in student:        grades = student["grades"]if grades:            grade_info = []for course, grade in grades.items():                grade_info.append(f"{course}:{grade}")            info += f"\n  成绩: {' '.join(grade_info)}"return info

main.py:

"""学校管理系统主程序演示模块化编程的实际应用"""# 导入我们创建的各种模块from students.basic_info import create_student, add_course, get_student_summaryfrom students.grades import add_grade, calculate_average, get_grade_reportfrom students.utils import validate_student_id, format_student_infodefdemonstrate_module_usage():"""演示模块的使用"""print("=== 学校管理系统演示 ===\n")# 1. 创建学生print("1. 创建学生信息:")    student = create_student("张小凡"18"20260001")print(f"   创建成功: {student['name']} (学号: {student['student_id']})")# 2. 添加课程print("\n2. 为学生添加课程:")    student = add_course(student, "Python编程")    student = add_course(student, "数据结构")    student = add_course(student, "数据库原理")print(f"   添加了{len(student['courses'])}门课程")# 3. 添加成绩print("\n3. 录入学生成绩:")try:        student = add_grade(student, "Python编程"92)        student = add_grade(student, "数据结构"85)        student = add_grade(student, "数据库原理"88)print("   成绩录入成功!")except ValueError as e:print(f"   错误: {e}")# 4. 显示学生信息摘要print("\n4. 学生信息摘要:")print(get_student_summary(student))# 5. 显示成绩报告print("\n5. 学生成绩报告:")print(get_grade_report(student))# 6. 计算平均成绩print("\n6. 平均成绩计算:")    avg = calculate_average(student)print(f"   平均成绩: {avg}分")# 7. 验证学号格式print("\n7. 学号格式验证:")    test_ids = ["20260001""2026abcd""20260""19990001"]for test_id in test_ids:        is_valid = validate_student_id(test_id)print(f"   {test_id}{'有效'if is_valid else'无效'}")# 8. 格式化显示print("\n8. 格式化学生信息:")print(format_student_info(student))defshow_module_structure():"""展示模块结构"""print("\n=== 项目模块结构 ===")print("""school_management/          # 项目根目录├── __init__.py            # 包标识文件├── students/              # 学生管理模块│   ├── __init__.py│   ├── basic_info.py     # 学生基本信息│   ├── grades.py         # 成绩管理│   └── utils.py          # 工具函数├── teachers/              # 教师管理模块│   ├── __init__.py│   └── management.py└── main.py                # 主程序入口优势体现:1. 功能分离:每个模块专注一个领域2. 易于维护:修改一个模块不影响其他部分3. 代码复用:可以在多个项目中重用模块4. 团队协作:不同开发者负责不同模块    """)if __name__ == "__main__":    demonstrate_module_usage()    show_module_structure()print("\n" + "="*50)print("模块化编程的核心优势:")print("1. 代码更清晰:每个文件都有明确职责")print("2. 调试更容易:问题定位到具体模块")print("3. 扩展性更好:添加新功能只需新增模块")print("4. 协作更高效:多人同时开发不同模块")

4. 阶梯式练习:从理解到应用

光看不练假把式,咱们来动手巩固一下知识点。

练习1:基础巩固(10道选择题)

  1. 1. 下面哪个是Python定义函数的关键字?A) funcB) functionC) defD) define
  2. 2. 函数中如果没有return语句,默认返回什么?A) 0B) ""C) NoneD) False
  3. 3. 下面哪种参数必须放在参数列表的最后?A) 位置参数B) 默认参数C) 可变位置参数(*args)D) 可变关键字参数(**kwargs)
  4. 4. 以下代码的输出是什么?
    deffunc(x, y=[]):    y.append(x)return yprint(func(1))print(func(2))
    A) [1] 和 [2]B) [1] 和 [1, 2]C) [1] 和 [2]D) 报错
  5. 5. 使用哪个关键字可以在函数内部修改全局变量?A) globalB) nonlocalC) externD) outer
  6. 6. 导入math模块中的sqrt函数,正确的写法是?A) import sqrt from mathB) from math import sqrtC) import math.sqrtD) include math.sqrt
  7. 7. 下面哪个不是Python的作用域?A) LocalB) GlobalC) StaticD) Built-in
  8. 8. 函数可以返回多少个值?A) 只能1个B) 最多2个C) 最多3个D) 任意多个(通过元组)
  9. 9. 给模块起别名应该使用哪个关键字?A) aliasB) renameC) asD) using
  10. 10. if __name__ == "__main__"的作用是什么?A) 定义主函数B) 防止模块被导入时执行测试代码C) 设置模块版本D) 声明模块作者

答案:

  1. 1. C) def
  2. 2. C) None
  3. 3. C) 可变位置参数(*args)
  4. 4. B) [1] 和 [1, 2] (注意默认参数的可变对象陷阱!)
  5. 5. A) global
  6. 6. B) from math import sqrt
  7. 7. C) Static
  8. 8. D) 任意多个(通过元组)
  9. 9. C) as
  10. 10. B) 防止模块被导入时执行测试代码

练习2:实战应用 - 重构成绩管理系统

还记得第2周咱们实现的成绩管理系统吗?现在要用模块化思想重构它!

原始代码回顾(简化版):

# 原始的单文件版本students = []defadd_student(name, score):    students.append({"name": name, "score": score})defcalculate_average():    total = sum(s["score"for s in students)return total / len(students) if students else0deffind_top_student():ifnot students:returnNonereturnmax(students, key=lambda s: s["score"])# 主程序add_student("张三"85)add_student("李四"92)print(f"平均分: {calculate_average()}")print(f"最高分: {find_top_student()['name']}")

你的任务:将这个单文件程序拆分为模块化结构:

grade_system/├── __init__.py├── student_manager.py    # 学生数据管理├── grade_calculator.py   # 成绩计算逻辑├── report_generator.py   # 报告生成└── main.py              # 程序入口

具体要求:

  1. 1. student_manager.py:负责学生的增删改查
    • • Student类(包含name和score属性)
    • • StudentManager类(管理学生列表)
  2. 2. grade_calculator.py:负责成绩计算
    • • calculate_average(students)函数
    • • find_top_student(students)函数
    • • calculate_grade_statistics(students)函数(返回平均分、最高分、最低分)
  3. 3. report_generator.py:负责生成各种报告
    • • generate_summary_report(students)函数
    • • generate_detailed_report(students)函数
    • • export_to_csv(students, filename)函数
  4. 4. main.py:程序主入口
    • • 导入各个模块
    • • 演示模块化系统的使用

加分挑战:

  1. 1. 添加异常处理(如成绩范围0-100)
  2. 2. 添加数据持久化(将学生数据保存到文件)
  3. 3. 添加单元测试模块

重构后的优势:

  • • 代码结构清晰,易于维护
  • • 每个模块职责单一
  • • 方便团队协作开发
  • • 易于扩展新功能

5. 总结与预告

本周核心概念总结

概念
说明
关键要点
函数定义
使用def关键字创建可复用的代码块
函数名要描述功能,参数列表要合理设计
参数传递
位置参数、默认参数、关键字参数、可变参数
注意默认参数的可变对象陷阱,掌握参数解包
返回值
函数执行后的输出结果
可以返回多个值(元组),支持返回函数
作用域
变量的可见范围
LEGB规则,使用global/nonlocal修改外层变量
模块导入
组织和使用代码的方式
import/from import,理解__name__作用

常见问题解答

Q:函数参数太多怎么办?A:考虑使用字典参数数据类来组织相关参数,或者重构函数拆分成更小的函数。

Q:模块循环导入怎么解决?A:1)重新设计代码结构,避免循环依赖;2)将导入语句放在函数内部;3)使用接口抽象。

Q:如何选择使用函数还是类?A:如果只是操作数据,使用函数;如果需要维护状态和复杂行为,使用类。

下周预告:面向对象编程(OOP)

学完这周的模块化编程,你已经掌握了组织代码的基本功。下周咱们要进入Python的另一个核心领域——面向对象编程

你将学到:

  • • 🏗️ 类和对象:用现实世界的思维建模程序
  • • 🔄 继承与多态:构建可扩展的代码家族
  • • 🛡️ 封装:保护数据,暴露接口
  • • 🎭 魔术方法:让对象更加"Pythonic"

实战项目:我们将创建一个图书馆管理系统,用面向对象的方式管理图书、读者、借阅记录。你会发现,面对复杂系统时,OOP能让代码更加优雅、可维护。

给学习搭子的话

看到这里的你,已经成功掌握了Python模块化编程的核心技能!是不是觉得代码世界变得更加清晰了?

记住,编程就像搭积木:

  1. 1. 先拆解:把大问题拆成小函数
  2. 2. 再组装:把小函数组合成大程序
  3. 3. 常重构:随时优化代码结构

如果你在练习中遇到问题,别慌!这是学习的正常过程。可以把你的代码和问题记下来,咱们一起讨论解决。

模块化思维不仅适用于Python,它是所有编程语言的通用法则。掌握了这个思维,你学习其他语言也会事半功倍!

下周,咱们继续面向对象编程的冒险之旅。记得完成练习,动手实践哦!

"代码是写给人看的,只是顺带能让机器执行。" —— Python哲学

保持好奇,持续练习,你正在成为一名真正的Python开发者!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 10:51:28 HTTP/2.0 GET : https://f.mffb.com.cn/a/475858.html
  2. 运行时间 : 0.120856s [ 吞吐率:8.27req/s ] 内存消耗:4,548.65kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c3ef0fc85be330b113af2d9fc514cb00
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001016s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001800s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000699s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000652s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001651s ]
  6. SELECT * FROM `set` [ RunTime:0.000589s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001543s ]
  8. SELECT * FROM `article` WHERE `id` = 475858 LIMIT 1 [ RunTime:0.002003s ]
  9. UPDATE `article` SET `lasttime` = 1772247088 WHERE `id` = 475858 [ RunTime:0.010305s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000662s ]
  11. SELECT * FROM `article` WHERE `id` < 475858 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001272s ]
  12. SELECT * FROM `article` WHERE `id` > 475858 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001057s ]
  13. SELECT * FROM `article` WHERE `id` < 475858 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001511s ]
  14. SELECT * FROM `article` WHERE `id` < 475858 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004730s ]
  15. SELECT * FROM `article` WHERE `id` < 475858 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004067s ]
0.124573s