当前位置:首页>python>Python全栈修炼之路 | 第7篇:函数 —— 代码复用的基石

Python全栈修炼之路 | 第7篇:函数 —— 代码复用的基石

  • 2026-06-30 14:13:33
Python全栈修炼之路 | 第7篇:函数 —— 代码复用的基石
 难度:⭐⭐⭐⭐
 阅读时长:约35分钟

前言

函数是编程中最重要的抽象机制之一。它将一段可复用的代码封装起来,赋予其名称和参数接口,使得复杂的程序可以被分解为可管理的小模块。本文将深入探讨Python函数的方方面面,从基础定义到高级特性,从内存机制到性能优化,帮助你全面掌握Python函数编程。


一、函数基础

1.1 函数定义与调用

# 基础函数定义def greet(name):    """向用户问好"""    return f"你好,{name}!"# 函数调用message = greet("张三")print(message)  # 输出: 你好,张三!# 多返回值函数(实际是返回元组)def get_min_max(numbers):    """返回列表中的最小值和最大值"""    return min(numbers), max(numbers)min_val, max_val = get_min_max([314159])print(f"最小值: {min_val}, 最大值: {max_val}")

1.2 文档字符串(Docstring)

良好的文档是高质量代码的标志:

def calculate_area(length, width):    """    计算矩形的面积。    参数:        length (float): 矩形的长度        width (float): 矩形的宽度    返回:        float: 矩形的面积    示例:        >>> calculate_area(5, 3)        15    """    return length * width# 查看文档print(calculate_area.__doc__)help(calculate_area)

二、参数类型详解

2.1 位置参数与关键字参数

def create_user(name, age, city="北京"):    """创建用户信息"""    return {"name": name, "age": age, "city": city}# 位置参数user1 = create_user("张三"25)# 关键字参数(顺序无关)user2 = create_user(age=30, name="李四")# 混合使用(位置参数必须在关键字参数之前)user3 = create_user("王五", city="上海", age=35)

2.2 默认参数值

from datetime import datetimedef log_message(message, level="INFO", timestamp=None):    """记录日志消息"""    if timestamp is None:        timestamp = datetime.now()    return f"[{timestamp}{level}{message}"# 使用默认参数print(log_message("系统启动"))# 覆盖默认参数print(log_message("发生错误", level="ERROR"))

⚠️ 重要警告:默认参数在函数定义时求值,而非调用时

# ❌ 错误:使用可变对象作为默认参数def add_item(item, item_list=[]):    item_list.append(item)    return item_listprint(add_item(1))  # [1]print(add_item(2))  # [1, 2] - 意外!列表被共享了# ✅ 正确:使用None作为默认值def add_item_safe(item, item_list=None):    if item_list is None:        item_list = []    item_list.append(item)    return item_listprint(add_item_safe(1))  # [1]print(add_item_safe(2))  # [2] - 正确

2.3 可变参数:*args 和 **kwargs

# *args 接收任意数量的位置参数def sum_all(*args):    """求和所有参数"""    return sum(args)print(sum_all(123))      # 6print(sum_all())             # 0print(sum_all(12345)) # 15# **kwargs 接收任意数量的关键字参数def print_info(**kwargs):    """打印所有关键字参数"""    for key, value in kwargs.items():        print(f"{key}{value}")print_info(name="张三", age=25, city="北京")# 组合使用def flexible_function(required, default="value", *args, **kwargs):    """展示所有参数类型的组合"""    print(f"必需参数: {required}")    print(f"默认参数: {default}")    print(f"可变位置参数: {args}")    print(f"可变关键字参数: {kwargs}")flexible_function("必须值""自定义"123, extra="附加信息")

2.4 参数解包

def calculate(x, y, z):    return x + y * z# 列表/元组解包data = [1, 2, 3]result = calculate(*data)  # 等价于 calculate(123)# 字典解包params = {"x"1"y"2"z"3}result = calculate(**params)  # 等价于 calculate(x=1, y=2, z=3)# 组合解包args = [1]kwargs = {"y"2"z"3}result = calculate(*args, **kwargs)

三、作用域与LEGB规则

3.1 命名空间与作用域

# 全局变量global_var = "我是全局变量"def outer_function():    # 局部变量( enclosing 作用域)    outer_var = "我是外部函数变量"    def inner_function():        # 局部变量( local 作用域)        inner_var = "我是内部函数变量"        print(inner_var)   # 访问局部变量        print(outer_var)   # 访问 enclosing 变量        print(global_var)  # 访问全局变量    inner_function()outer_function()

3.2 LEGB规则详解

Python查找变量的顺序遵循LEGB规则:

层级
名称
说明
范围
L
Local
局部作用域
函数内部
E
Enclosing
嵌套作用域
嵌套函数的外层函数
G
Global
全局作用域
模块级别
B
Built-in
内置作用域
Python内置名称
# 演示LEGB规则len = "我覆盖了内置的len"  # Globaldef demo():    len = "我是局部变量"  # Local    print(len)  # 输出: 我是局部变量demo()print(len)  # 输出: 我覆盖了内置的len# 删除全局覆盖,恢复内置函数del lenprint(len([123]))  # 输出: 3

3.3 global 和 nonlocal 关键字

counter = 0  # 全局变量def increment_global():    global counter  # 声明使用全局变量    counter += 1    return counterdef outer():    count = 0  # enclosing变量    def inner():        nonlocal count  # 声明使用enclosing变量        count += 1        return count    return inner# 测试increment_global()print(counter)  # 1inner_func = outer()print(inner_func())  # 1print(inner_func())  # 2

四、函数是一等公民

4.1 函数作为对象

在Python中,函数是一等公民(First-Class Citizen),这意味着:

  • 函数可以赋值给变量
  • 函数可以作为参数传递
  • 函数可以作为返回值
  • 函数可以存储在数据结构中
def multiply(x, y):    return x * y# 函数赋值给变量operation = multiplyprint(operation(34))  # 12# 函数存储在字典中operations = {    "add"lambda x, y: x + y,    "subtract"lambda x, y: x - y,    "multiply": multiply,    "divide"lambda x, y: x / y if y != 0 else "除数不能为0"}def calculate(a, b, op):    """使用函数作为参数"""    return operations.get(op, lambda x, y: "未知操作")(a, b)print(calculate(105"add"))      # 15print(calculate(105"multiply")) # 50

4.2 高阶函数

def apply_operation(numbers, operation):    """高阶函数:接收函数作为参数"""    return [operation(n) for n in numbers]def make_multiplier(factor):    """高阶函数:返回函数"""    def multiplier(x):        return x * factor    return multiplier# 使用示例double = make_multiplier(2)triple = make_multiplier(3)print(double(5))  # 10print(triple(5))  # 15numbers = [12345]squares = apply_operation(numbers, lambda x: x ** 2)print(squares)  # [1, 4, 9, 16, 25]

4.3 内置高阶函数

numbers = [12345678910]# map: 对每个元素应用函数squares = list(map(lambda x: x ** 2, numbers))# filter: 根据条件过滤evens = list(filter(lambda x: x % 2 == 0, numbers))# sorted: 自定义排序words = ["banana""pie""Washington""book"]sorted_by_length = sorted(words, key=len)# reduce: 累积计算from functools import reduceproduct = reduce(lambda x, y: x * y, numbers)print(f"平方: {squares}")print(f"偶数: {evens}")print(f"按长度排序: {sorted_by_length}")print(f"乘积: {product}")

五、闭包与装饰器

5.1 闭包(Closure)

闭包是指引用了外部作用域变量的函数,即使外部函数已经返回,闭包仍然可以访问这些变量。

def make_counter():    """创建一个计数器闭包"""    count = 0  # 自由变量    def counter():        nonlocal count        count += 1        return count    return counter# 创建两个独立的计数器counter_a = make_counter()counter_b = make_counter()print(counter_a())  # 1print(counter_a())  # 2print(counter_b())  # 1(独立的计数器)print(counter_a())  # 3

闭包的内存机制:

  • 闭包会捕获外部函数的局部变量,即使外部函数执行完毕,这些变量也不会被垃圾回收
  • 每个闭包实例都有自己独立的自由变量副本
  • 闭包通过__closure__属性访问捕获的变量
counter = make_counter()print(counter.__closure__)  # 查看闭包捕获的变量print(counter.__closure__[0].cell_contents)  # 查看变量的值

5.2 装饰器(Decorator)

装饰器是一种用于修改或增强函数行为的高阶函数。

import functoolsimport timedef timing_decorator(func):    """计算函数执行时间的装饰器"""    @functools.wraps(func)  # 保留原函数元数据    def wrapper(*args, **kwargs):        start = time.time()        result = func(*args, **kwargs)        elapsed = time.time() - start        print(f"{func.__name__} 执行时间: {elapsed:.4f}秒")        return result    return wrapper@timing_decoratordef slow_function():    """一个慢函数"""    time.sleep(1)    return "Done"# 等价于: slow_function = timing_decorator(slow_function)result = slow_function()

5.3 带参数的装饰器

def repeat(times):    """带参数的装饰器:重复执行函数"""    def decorator(func):        @functools.wraps(func)        def wrapper(*args, **kwargs):            for _ in range(times):                result = func(*args, **kwargs)            return result        return wrapper    return decorator@repeat(times=3)def greet(name):    print(f"你好, {name}!")greet("张三")  # 会打印3次

六、递归函数

6.1 递归基础

def factorial(n):    """阶乘的递归实现"""    if n <= 1:        return 1    return n * factorial(n - 1)def fibonacci(n):    """斐波那契数列的递归实现"""    if n <= 1:        return n    return fibonacci(n - 1) + fibonacci(n - 2)print(f"5! = {factorial(5)}")  # 120print(f"fib(10) = {fibonacci(10)}")  # 55

6.2 递归深度限制

Python默认的递归深度限制为1000:

import sysprint(f"默认递归深度限制: {sys.getrecursionlimit()}")# 修改递归深度限制(谨慎使用)sys.setrecursionlimit(2000)

为什么会有递归深度限制?

递归深度限制的存在是为了防止栈溢出。每次函数调用都会在调用栈上创建一个新的栈帧(Stack Frame),包含:

  • 局部变量
  • 参数
  • 返回地址

栈空间是有限的,无限递归会导致栈溢出,程序崩溃。

6.3 尾递归优化(有限支持)

Python解释器不支持尾递归优化,但我们可以手动优化:

# 普通递归(有栈溢出风险)def factorial_normal(n):    if n <= 1:        return 1    return n * factorial_normal(n - 1)# 尾递归形式(Python不优化,仅展示概念)def factorial_tail(n, accumulator=1):    if n <= 1:        return accumulator    return factorial_tail(n - 1, n * accumulator)# 迭代版本(推荐)def factorial_iterative(n):    result = 1    for i in range(2, n + 1):        result *= i    return result

七、函数性能优化:lru_cache

7.1 记忆化(Memoization)

from functools import lru_cache# 未优化的斐波那契(重复计算严重)def fib_slow(n):    if n <= 1:        return n    return fib_slow(n - 1) + fib_slow(n - 2)# 使用lru_cache优化@lru_cache(maxsize=None)def fib_fast(n):    if n <= 1:        return n    return fib_fast(n - 1) + fib_fast(n - 2)# 性能对比import timen = 35start = time.time()result1 = fib_slow(n)print(f"未优化: fib({n}) = {result1}, 耗时: {time.time() - start:.4f}秒")start = time.time()result2 = fib_fast(n)print(f"优化后: fib({n}) = {result2}, 耗时: {time.time() - start:.4f}秒")

7.2 lru_cache 原理

lru_cache使用LRU(Least Recently Used)缓存策略

@lru_cache(maxsize=128)  # 最多缓存128个结果def expensive_function(x):    """模拟耗时操作"""    time.sleep(0.1)    return x * x# 查看缓存信息print(expensive_function.cache_info())# CacheInfo(hits=0, misses=0, maxsize=128, currsize=0)expensive_function(5)print(expensive_function.cache_info())# CacheInfo(hits=0, misses=1, maxsize=128, currsize=1)expensive_function(5)  # 命中缓存print(expensive_function.cache_info())# CacheInfo(hits=1, misses=1, maxsize=128, currsize=1)# 清空缓存expensive_function.cache_clear()

缓存策略对比:

策略
说明
适用场景
LRU
淘汰最近最少使用
通用场景
LFU
淘汰最少使用频率
访问频率差异大
FIFO
先进先出
顺序访问

八、实战项目

8.1 斐波那契数列的多种实现

from functools import lru_cachefrom time import time# 方法1: 纯递归(指数级复杂度)def fib_recursive(n):    if n <= 1:        return n    return fib_recursive(n - 1) + fib_recursive(n - 2)# 方法2: 记忆化递归@lru_cache(maxsize=None)def fib_memoized(n):    if n <= 1:        return n    return fib_memoized(n - 1) + fib_memoized(n - 2)# 方法3: 迭代(线性复杂度)def fib_iterative(n):    if n <= 1:        return n    a, b = 01    for _ in range(2, n + 1):        a, b = b, a + b    return b# 方法4: 矩阵快速幂(对数级复杂度)def matrix_mult(A, B):    """2x2矩阵乘法"""    return [        [A[0][0]*B[0][0] + A[0][1]*B[1][0], A[0][0]*B[0][1] + A[0][1]*B[1][1]],        [A[1][0]*B[0][0] + A[1][1]*B[1][0], A[1][0]*B[0][1] + A[1][1]*B[1][1]]    ]def matrix_pow(M, n):    """矩阵快速幂"""    if n == 1:        return M    if n % 2 == 0:        half = matrix_pow(M, n // 2)        return matrix_mult(half, half)    else:        return matrix_mult(M, matrix_pow(M, n - 1))def fib_matrix(n):    if n <= 1:        return n    M = [[11], [10]]    result = matrix_pow(M, n)    return result[0][1]# 性能对比def benchmark(func, n, runs=5):    times = []    for _ in range(runs):        start = time()        result = func(n)        times.append(time() - start)    return sum(times) / runs, resultn = 30print(f"计算第 {n} 个斐波那契数\n")for name, func in [    ("递归", fib_recursive),    ("记忆化", fib_memoized),    ("迭代", fib_iterative),    ("矩阵", fib_matrix)]:    avg_time, result = benchmark(func, n)    print(f"{name:8s}{result:10d}  平均耗时: {avg_time:.6f}秒")

8.2 简易计算器

def make_calculator():    """创建一个支持历史记录的计算器"""    history = []    def calculate(operation, a, b):        operations = {            'add'lambda x, y: x + y,            'subtract'lambda x, y: x - y,            'multiply'lambda x, y: x * y,            'divide'lambda x, y: x / y if y != 0 else float('inf'),            'power'lambda x, y: x ** y        }        if operation not in operations:            raise ValueError(f"不支持的操作: {operation}")        result = operations[operation](a, b)        history.append(f"{operation}({a}{b}) = {result}")        return result    def get_history():        return history.copy()    def clear_history():        history.clear()    # 返回一个包含多个函数的命名空间    return type('Calculator', (), {        'calc': calculate,        'history': get_history,        'clear': clear_history    })()# 使用计算器calc = make_calculator()print(calc.calc('add'53))        # 8print(calc.calc('multiply'47))   # 28print(calc.calc('power'210))     # 1024print("\n计算历史:")for record in calc.history():    print(record)

8.3 文件批量重命名工具

import osimport refrom pathlib import Pathdef batch_rename(directory, pattern, replacement, preview=True):    """    批量重命名文件    参数:        directory: 目标目录        pattern: 正则表达式模式        replacement: 替换字符串        preview: 是否仅预览(不实际执行)    """    path = Path(directory)    if not path.exists():        raise FileNotFoundError(f"目录不存在: {directory}")    changes = []    regex = re.compile(pattern)    for file_path in path.iterdir():        if file_path.is_file():            old_name = file_path.name            new_name = regex.sub(replacement, old_name)            if old_name != new_name:                changes.append((file_path, path / new_name))    if not changes:        print("没有需要重命名的文件")        return    print(f"\n发现 {len(changes)} 个文件需要重命名:\n")    for old, new in changes:        print(f"  {old.name}")        print(f"    -> {new.name}\n")    if preview:        print("⚠️  这是预览模式,使用 preview=False 执行实际重命名")        return    # 执行重命名    for old, new in changes:        old.rename(new)    print(f"✅ 成功重命名 {len(changes)} 个文件")# 使用示例# batch_rename("./photos", r"IMG_(\d+)", r"vacation_\1", preview=True)

九、常见陷阱与最佳实践

9.1 陷阱1:默认参数的坑

# ❌ 错误示例已在2.2节展示# ✅ 最佳实践:可变默认参数的处理模式def process_data(data=None):    data = data or []  # 简洁写法    # 或    if data is None:        data = []    # 处理数据...    return data

9.2 陷阱2:延迟绑定闭包

# ❌ 错误:所有函数返回相同结果functions = []for i in range(5):    functions.append(lambda: i)print([f() for f in functions])  # [4, 4, 4, 4, 4]# ✅ 正确:使用默认参数绑定当前值functions = []for i in range(5):    functions.append(lambda x=i: x)print([f() for f in functions])  # [0, 1, 2, 3, 4]

9.3 陷阱3:递归没有终止条件

# ❌ 无限递归def infinite_recursion(n):    return infinite_recursion(n + 1)  # 没有终止条件# ✅ 始终确保有终止条件def safe_recursion(n, limit=100):    if n >= limit:        return n    return safe_recursion(n + 1, limit)

9.4 最佳实践清单

实践
说明
单一职责
一个函数只做一件事
文档字符串
所有公共函数都应包含docstring
类型注解
使用Python 3.5+的类型注解提高可读性
避免全局变量
使用参数传递数据
纯函数优先
相同的输入总是产生相同的输出,无副作用
异常处理
使用异常而非返回错误码

十、本章小结

核心知识点

  1. 函数定义
    :使用def定义函数,支持多返回值
  2. 参数类型
    :位置参数、关键字参数、默认参数、*args、**kwargs
  3. 作用域
    :LEGB规则,global和nonlocal关键字
  4. 一等公民
    :函数可作为对象传递、返回和存储
  5. 闭包
    :捕获外部变量的函数,实现数据隐藏和状态保持
  6. 装饰器
    :增强函数功能的优雅方式
  7. 递归
    :分治思想,注意深度限制
  8. 缓存
    :lru_cache大幅提升重复计算性能

底层原理要点

  • 栈帧
    :每次函数调用创建,包含局部变量和返回地址
  • 闭包内存
    :通过__closure__捕获自由变量,延长生命周期
  • 递归限制
    :防止栈溢出,默认1000层
  • lru_cache
    :使用字典存储结果,O(1)查询

十一、课后练习

基础练习

  1. 参数解析器:编写一个函数,接收任意数量的位置参数和关键字参数,打印它们的值和类型

  2. 计数器工厂:使用闭包创建一个计数器工厂,每个计数器有独立的计数值

  3. 类型检查装饰器:编写一个装饰器,检查函数参数的类型是否符合注解要求

进阶练习

  1. 管道函数:实现一个管道操作符,允许 data | func1 | func2 | func3 这样的链式调用

  2. 尾递归装饰器:编写一个装饰器,将尾递归函数转换为迭代执行(绕过Python的递归限制)

  3. 函数组合:实现函数组合操作,(f ∘ g)(x) = f(g(x))

挑战练习

  1. 实现partial函数:不借助functools,自己实现partial函数

  2. 实现简单的lru_cache:不借助functools,自己实现带大小限制的缓存装饰器


参考资源

  • Python官方文档 - 函数定义
  • Python官方文档 - functools模块
  • PEP 3102 - 关键字-only参数
  • Python闭包详解

💡 学习建议:函数是编程的核心抽象工具。建议多练习高阶函数和装饰器的使用,它们是写出优雅Python代码的关键。同时要注意递归的使用场景,在Python中迭代通常比递归更高效。


本文是《Python全栈修炼之路》系列第7篇,系列文章持续更新中,欢迎关注!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 12:24:33 HTTP/2.0 GET : https://f.mffb.com.cn/a/498054.html
  2. 运行时间 : 0.181975s [ 吞吐率:5.50req/s ] 内存消耗:4,711.37kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fb4ddaba77325cc0c4b45f35f61364dd
  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.000989s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001676s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000685s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000683s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001369s ]
  6. SELECT * FROM `set` [ RunTime:0.000609s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001479s ]
  8. SELECT * FROM `article` WHERE `id` = 498054 LIMIT 1 [ RunTime:0.001905s ]
  9. UPDATE `article` SET `lasttime` = 1783052673 WHERE `id` = 498054 [ RunTime:0.047452s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.004861s ]
  11. SELECT * FROM `article` WHERE `id` < 498054 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001654s ]
  12. SELECT * FROM `article` WHERE `id` > 498054 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001159s ]
  13. SELECT * FROM `article` WHERE `id` < 498054 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.007254s ]
  14. SELECT * FROM `article` WHERE `id` < 498054 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004506s ]
  15. SELECT * FROM `article` WHERE `id` < 498054 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.016428s ]
0.185743s