当前位置:首页>python>每天学习一点Python——从数字处理到智能程序的实战指南

每天学习一点Python——从数字处理到智能程序的实战指南

  • 2026-02-02 15:17:30
每天学习一点Python——从数字处理到智能程序的实战指南

每天学习一点Python——从数字处理到智能程序的实战指南

今天我们来一起学习Python中处理数字、格式化输出、创建函数、条件判断和错误处理的核心技能。这些都是编程的基石,当你把它们巧妙组合起来,就能创建出真正实用的智能程序。

一、数学运算:程序计算的基础

1. 数字处理三剑客

在Python中,有三个非常实用的内置函数专门处理数字,它们是日常编程的好帮手:

1. round() - 精准的四舍五入

基础取整用法

result1 = round(2.3)  # 得到 2
result2 = round(2.7)  # 得到 3
print
(f"round(2.3) = {result1}")
print
(f"round(2.7) = {result2}")

保留指定位数小数

pi_rounded = round(3.14159, 3)  # 保留3位小数
e_rounded = round(2.71828, 2)   # 保留2位小数
print
(f"圆周率保留3位小数: {pi_rounded}")
print
(f"自然常数保留2位小数: {e_rounded}")

特殊规则:当数字以.5结尾时

special1 = round(2.5)  # 得到 2(向偶数取整)
special2 = round(3.5)  # 得到 4(向偶数取整)
print
(f"round(2.5) = {special1} (注意:不是3)")
print
(f"round(3.5) = {special2} (注意:不是4)")

运行结果

round(2.3) = 2
round(2.7) = 3
圆周率保留3位小数: 3.142
自然常数保留2位小数: 2.72
round(2.5) = 2 (注意:不是3)
round(3.5) = 4 (注意:不是4)

小技巧:你可能注意到了,2.5舍入后变成了2,而3.5变成了4。这是因为Python的round()函数采用"向偶数取整"策略,这是IEEE标准推荐的,能够减少大量计算中的累积误差。

2. abs() - 取绝对值,处理正负问题

temperature_change1 = abs(5)      # 温度上升5度
temperature_change2 = abs(-3)     # 温度下降3度(取绝对值)
account_balance1 = abs(1000.50)   # 账户余额
account_balance2 = abs(-500.75)   # 账户欠款(取绝对值)

print
(f"温度上升: {temperature_change1}度")
print
(f"温度下降: {temperature_change2}度")
print
(f"账户余额: ¥{account_balance1}")
print
(f"账户欠款: ¥{account_balance2}")

运行结果

温度上升: 5度
温度下降: 3度    
账户余额: ¥1000.5
账户欠款: ¥500.75

3. pow() - 强大的幂运算

# 基本幂运算
square = pow(5, 2)        # 5的2次方 = 25
cube = pow(2, 3)          # 2的3次方 = 8
negative_power = pow(4, -1)  # 4的-1次方 = 0.25

print
(f"5的平方: {square}")
print
(f"2的立方: {cube}")
print
(f"4的-1次方: {negative_power}")

# 带模运算的幂运算(常用于密码学等场景)

# 计算 (2的10次方) % 3

mod_result = pow(2, 10, 3)
print
(f"(2^10) % 3 = {mod_result}")

运行结果

5的平方: 25
2的立方: 8
4的-1次方: 0.25
(2^10) % 3 = 1

2. 浮点数检查:.is_integer()方法

# 检查数字是否为整数
def
 check_number_type(number):
    if
 number.is_integer():
        return
 f"{number} 是整数"
    else
:
        return
 f"{number} 不是整数(有小数部分)"

# 测试不同的数字(程序建议从这里开始读)

numbers = [2.0, 2.5, 3.0, 3.14, 100.0]

print
("数字类型检查:")
for
 num in numbers:
    result = check_number_type(num)
    print
(f"  {result}")

运行结果

数字类型检查:
  2.0 是整数
  2.5 不是整数(有小数部分)
  3.0 是整数
  3.14 不是整数(有小数部分)
  100.0 是整数

注意is_integer()是浮点数类型的方法,即使是2.0这样的数字,它本质上也是浮点数,但小数部分为0,所以返回True。


二、格式化输出:让数据展示更专业

1. 基础格式化技巧

# 1. 固定小数位数
product_price = 99.99
discounted_price = 79.4925

print
("=== 商品价格显示 ===")
print
(f"原价: ${product_price:.2f}")          # 保留2位小数
print
(f"折扣价: ${discounted_price:.2f}")     # 自动四舍五入
print
(f"折扣价(1位小数): ${discounted_price:.1f}")

# 2. 填充小数位

whole_number = 7
print
(f"\n整数补充小数位: {whole_number:.2f}")  # 7.00
print
(f"整数补充3位小数: {whole_number:.3f}")   # 7.000

2. 大数字和货币格式化

print("=== 财务数据格式化 ===")

# 公司年度数据

revenue = 1234567890     # 收入
profit = 234567890.50    # 利润
employees = 15000        # 员工数

# 使用千位分隔符

print
(f"年度收入: ${revenue:,}")
print
(f"净利润: ${profit:,.2f}")
print
(f"员工总数: {employees:,}人")

# 复杂的财务报告

print
("\n=== 财务报告 ===")
print
(f"{'项目':<15} {'金额':>20}")
print
("-" * 40)
print
(f"{'总收入':<15} ${revenue:>20,}")
print
(f"{'总成本':<15} ${(revenue-profit):>20,}")
print
(f"{'净利润':<15} ${profit:>20,.2f}")
print
(f"{'利润率':<15} {(profit/revenue*100):>19.1f}%")

运行结果

=== 财务数据格式化 ===
年度收入: $1,234,567,890
净利润: $234,567,890.50
员工总数: 15,000人

=== 财务报告 ===
项目                    金额
----------------------------------------
总收入       $1,234,567,890
总成本         $999,999,999.50
净利润         $234,567,890.50
利润率                 19.0%

格式化字符串详解

print(f"{'项目':<15} {'金额':>20}")的详细拆解:

  • • f"...":这是f-string格式化字符串的语法
  • • {'项目':<15}
    • • '项目':要显示的文本内容
    • • :<15:完整的格式化说明符
      • • ::开始格式化的标志
      • • <:左对齐方式
      • • 15:总共占用15个字符宽度
    • • 最终效果:把"项目"这两个字放在15个字符宽度的左侧显示
  • • {'金额':>20}
    • • '金额':要显示的文本内容
    • • :>20:格式化说明符
      • • >:右对齐方式
      • • 20:总共占用20个字符宽度
    • • 最终效果:把"金额"这两个字放在20个字符宽度的右侧显示

print("-" * 40)的解释:

  • • "-":这是一个短横线字符
  • • * 40:重复40次
  • • 作用:创建一条由40个短横线组成的分隔线,让表格看起来更清晰
  • • 这是Python的字符串重复操作,类似"a" * 3会得到"aaa"

输出效果:

----------------------------------------

print(f"{'总收入':<15} ${revenue:>20,}")的详细拆解:
假设revenue = 1234567890

  • • {'总收入':<15}
    • • 左对齐显示"总收入",占用15个字符宽度
  • • ${revenue:>20,}
    • • $:直接输出美元符号
    • • {revenue:>20,}
      • • revenue:变量,值是1234567890
      • • :>20,:格式化说明符
        • • >:右对齐
        • • 20:占20个字符宽度
        • • ,:千位分隔符(这个很关键!让大数字更易读)

3. 百分比和比例显示

# 考试数据分析
exam_results = {
    "数学"
: 0.85,      # 85%通过率
    "英语"
: 0.72,      # 72%通过率
    "编程"
: 0.93,      # 93%通过率
}

print
("=== 考试通过率分析 ===")
for
 subject, rate in exam_results.items():
    print
(f"{subject}: {rate:.0%} 通过")  # 无小数位百分比

print
("\n=== 详细分析 ===")
for
 subject, rate in exam_results.items():
    print
(f"{subject}: {rate:.1%} 通过")  # 1位小数百分比

运行结果

=== 考试通过率分析 ===
数学: 85% 通过
英语: 72% 通过
编程: 93% 通过

=== 详细分析 ===
数学: 85.0% 通过
英语: 72.0% 通过
编程: 93.0% 通过

三、创建智能函数:代码复用之道

1. 基础函数:温度转换器

def celsius_to_fahrenheit(celsius):
    """
    将摄氏温度转换为华氏温度

    参数:
        celsius (float): 摄氏温度

    返回:
        float: 华氏温度
    """

    fahrenheit = celsius * 9 / 5 + 32
    return
 fahrenheit

def
 fahrenheit_to_celsius(fahrenheit):
    """
    将华氏温度转换为摄氏温度

    参数:
        fahrenheit (float): 华氏温度

    返回:
        float: 摄氏温度
    """

    celsius = (fahrenheit - 32) * 5 / 9
    return
 celsius

# 使用函数

print
("=== 温度转换示例 ===")
# 人体正常温度

normal_celsius = 37
normal_fahrenheit = celsius_to_fahrenheit(normal_celsius)
print
(f"人体正常温度: {normal_celsius}°C = {normal_fahrenheit:.1f}°F")

# 水的沸点

boiling_fahrenheit = 212
boiling_celsius = fahrenheit_to_celsius(boiling_fahrenheit)
print
(f"水的沸点: {boiling_fahrenheit}°F = {boiling_celsius:.1f}°C")

# 冰点

freezing_fahrenheit = 32
freezing_celsius = fahrenheit_to_celsius(freezing_fahrenheit)
print
(f"水的冰点: {freezing_fahrenheit}°F = {freezing_celsius:.1f}°C")

运行结果

=== 温度转换示例 ===
人体正常温度: 37°C = 98.6°F
水的沸点: 212°F = 100.0°C
水的冰点: 32°F = 0.0°C

2. 带格式化的函数

def display_temperature(temp_c, temp_f):
    """
    优雅地显示温度

    参数:
        temp_c (float): 摄氏温度
        temp_f (float): 华氏温度
    """

    print
("┌─────────────────────────────┐")
    print
("│        温度显示             │")
    print
("├─────────────────────────────┤")
    print
(f"│ 摄氏温度: {temp_c:>10.1f}°C    │")
    print
(f"│ 华氏温度: {temp_f:>10.1f}°F    │")
    print
("└─────────────────────────────┘")

# 使用示例

print
("夏天的温度情况:")
display_temperature(25.5, celsius_to_fahrenheit(25.5))
print
("\n冬天的温度情况:")
display_temperature(-5.0, celsius_to_fahrenheit(-5.0))

运行结果

夏天的温度情况:
┌─────────────────────────────┐
│        温度显示             │
├─────────────────────────────┤
│ 摄氏温度:       25.5°C    │
│ 华氏温度:       77.9°F    │
└─────────────────────────────┘

冬天的温度情况:
┌─────────────────────────────┐
│        温度显示             │
├─────────────────────────────┤
│ 摄氏温度:       -5.0°C    │
│ 华氏温度:       23.0°F    │
└─────────────────────────────┘

四、条件逻辑:让程序会思考

1. 比较和逻辑运算

def compare_numbers(a, b):
    """演示各种比较运算"""

    print
(f"\n比较 {a} 和 {b}:")
    print
(f"  {a} == {b} : {a == b}")
    print
(f"  {a} != {b} : {a != b}")
    print
(f"  {a} > {b}  : {a > b}")
    print
(f"  {a} < {b}  : {a < b}")
    print
(f"  {a} >= {b} : {a >= b}")
    print
(f"  {a} <= {b} : {a <= b}")

def
 logic_demo(p, q):
    """演示逻辑运算"""

    print
(f"\n逻辑运算 P={p}, Q={q}:")
    print
(f"  P and Q : {p and q}")
    print
(f"  P or Q  : {p or q}")
    print
(f"  not P   : {not p}")
    print
(f"  not Q   : {not q}")

# 数字比较

compare_numbers(10, 5)
compare_numbers(3.14, 3.14)
compare_numbers(-5, 0)

# 逻辑运算

logic_demo(True, True)
logic_demo(True, False)
logic_demo(False, False)

运行结果

比较 10 和 5:
  10 == 5 : False
  10 != 5 : True
  10 > 5  : True
  10 < 5  : False
  10 >= 5 : True
  10 <= 5 : False

比较 3.14 和 3.14:
  3.14 == 3.14 : True
  3.14 != 3.14 : False
  3.14 > 3.14  : False
  3.14 < 3.14  : False
  3.14 >= 3.14 : True
  3.14 <= 3.14 : True

比较 -5 和 0:
  -5 == 0 : False
  -5 != 0 : True
  -5 > 0  : False
  -5 < 0  : True
  -5 >= 0 : False
  -5 <= 0 : True

逻辑运算 P=True, Q=True:
  P and Q : True
  P or Q  : True
  not P   : False
  not Q   : False

逻辑运算 P=True, Q=False:
  P and Q : False
  P or Q  : True
  not P   : False
  not Q   : True

逻辑运算 P=False, Q=False:
  P and Q : False
  P or Q  : False
  not P   : True
  not Q   : True

2. 实际应用:成绩评级系统

def calculate_grade(score):
    """
    根据分数计算等级

    参数:
        score (float): 分数 (0-100)

    返回:
        str: 等级 (A, B, C, D, F)
    """

    if
 score >= 90:
        return
 "A"
    elif
 score >= 80:
        return
 "B"
    elif
 score >= 70:
        return
 "C"
    elif
 score >= 60:
        return
 "D"
    else
:
        return
 "F"

def
 get_grade_feedback(grade, score):
    """根据等级提供反馈"""

    feedbacks = {
        "A"
: "优秀!继续保持!",
        "B"
: "良好,还有提升空间!",
        "C"
: "及格,需要更加努力!",
        "D"
: "勉强及格,要加油了!",
        "F"
: "不及格,需要重考!"
    }
    return
 feedbacks.get(grade, "未知等级")

# 测试成绩评级

test_scores = [95.5, 87.0, 72.5, 63.0, 45.5, 100.0]

print
("=== 学生成绩报告 ===")
print
("┌──────┬───────┬────────┬───────────────┐")
print
("│ 姓名 │ 分数  │  等级  │     反馈      │")
print
("├──────┼───────┼────────┼───────────────┤")

students = ["张三", "李四", "王五", "赵六", "小明", "学霸"]
for
 i, score in enumerate(test_scores):
    grade = calculate_grade(score)
    feedback = get_grade_feedback(grade, score)
    print
(f"│ {students[i]:<4} │ {score:>5.1f} │   {grade}    │ {feedback:<13} │")

print
("└──────┴───────┴────────┴───────────────┘")

逐行详细解释:成绩评级系统代码

第一部分:函数定义解析

函数1:calculate_grade - 分数转等级函数

def calculate_grade(score):
    """
    根据分数计算等级

    参数:
        score (float): 分数 (0-100)

    返回:
        str: 等级 (A, B, C, D, F)
    """

解释

  • • def calculate_grade(score): 这一行定义了函数
    • • def:Python中定义函数的关键字
    • • calculate_grade:函数名,命名遵循"动词+名词"的惯例,清晰表达功能
    • • (score):参数列表,这个函数接受一个参数,命名为score
    • • ::函数定义的结束标志,后面是函数体
  • • 三重引号文档字符串(docstring):
    """
    根据分数计算等级

    参数:
        score (float): 分数 (0-100)

    返回:
        str: 等级 (A, B, C, D, F)
    """
    • • 这是Python的文档字符串
    • • 用三个双引号包裹,可以跨多行
    • • 用于解释函数的功能、参数和返回值
    • • 可以通过help(calculate_grade)查看这些说明
    • • 参数说明格式:score (float): 表示参数名score,期望类型是float(浮点数)
    • • 返回说明:str: 表示返回值类型是字符串,等级 (A, B, C, D, F)是具体说明

作用:这个函数定义创建了一个可重用的"分数转等级"计算器,可以在程序中多次调用。

函数2:get_grade_feedback - 等级反馈函数

def get_grade_feedback(grade, score):
    """根据等级提供反馈"""

解释

  • • def get_grade_feedback(grade, score):
    • • 函数名:get_grade_feedback,意为"获取等级反馈",一看就知道功能
    • • 两个参数:gradescore
      • • grade:等级(A、B、C等)
      • • score:原始分数(虽然函数内没使用,但保留参数接口,便于将来扩展)
  • • 单行文档字符串:
    """根据等级提供反馈"""
    • • 简洁说明函数用途
    • • 即使只有一行,也推荐写文档字符串,养成良好的编程习惯
    feedbacks = {
        "A"
: "优秀!继续保持!",
        "B"
: "良好,还有提升空间!",
        "C"
: "及格,需要更加努力!",
        "D"
: "勉强及格,要加油了!",
        "F"
: "不及格,需要重考!"
    }

解释

  • • 创建了一个字典(dictionary)变量feedbacks
  • • 字典的结构很清晰:
    • • 键(key):等级字符串 "A", "B", "C", "D", "F"
    • • 值(value):对应的反馈信息,这些鼓励话语能激励学生
  • • 字典的作用:建立等级和反馈文本之间的映射关系,就像查字典一样方便
  • • 使用字典的优势:
    • • 比多个if-elif语句更简洁、易读
    • • 易于维护和扩展,如果想添加新等级(如A+),只需添加一个键值对
    • • 查找速度快,效率高
    return feedbacks.get(grade, "未知等级")

解释

  • • feedbacks.get(grade, "未知等级")
  • • 字典的get()方法:安全地获取字典值
  • • 语法:字典.get(键, 默认值)
  • • 工作流程:
    • • 在feedbacks字典中查找键grade
    • • 如果找到,返回对应的值(反馈信息)
    • • 如果没找到(比如不小心传入了"X"等级),返回默认值"未知等级"
  • • 优势:避免因键不存在而引发KeyError异常,使程序更健壮

完整函数作用:根据学生获得的等级,返回对应的鼓励或提醒话语,让程序更有温度。

第二部分:主程序逻辑

数据准备部分

test_scores = [95.5, 87.0, 72.5, 63.0, 45.5, 100.0]

解释

  • • 创建列表(list)变量test_scores
  • • 包含6个测试分数,都是浮点数
  • • 列表特点:
    • • 有序集合,保持插入顺序
    • • 可以包含不同类型的元素(这里都是浮点数,但列表也可以混合类型)
    • • 索引从0开始,这是Python的约定
students = ["张三", "李四", "王五", "赵六", "小明", "学霸"]

解释

  • • 另一个列表students,存储学生姓名
  • • 重要:两个列表长度相同(都是6个元素)
  • • 通过位置对应:students[0]对应test_scores[0]students[1]对应test_scores[1],以此类推

核心循环处理

for i, score in enumerate(test_scores):

详细解释

  • • for循环:遍历test_scores列表中的每个分数
  • • enumerate()函数:
    • • 语法:enumerate(可迭代对象, start=0),start参数可以设置起始索引,如果不指定则默认为0。
    • • 作用:同时获取索引和值,非常实用
    • • 示例:list(enumerate(['a', 'b', 'c'])) 返回 [(0, 'a'), (1, 'b'), (2, 'c')]
  • • 循环变量解包:
    • • i, score 接收enumerate()返回的元组
    • • i:当前元素的索引(0, 1, 2...)
    • • score:当前元素的值(95.5, 87.0...)
  • • 第一次循环时的状态:
    • • i = 0score = 95.5
    • • students[i] → students[0] → "张三"
    • • test_scores[i] → test_scores[0] → 95.5
    grade = calculate_grade(score)

解释

  • • 调用calculate_grade()函数,这是函数复用的体现
  • • 传入参数:当前score值(比如95.5)
  • • 接收返回值:等级字符串("A"、"B"等)
  • • 函数调用过程(内部执行):
    • • 程序跳转到calculate_grade函数
    • • 执行函数体内的条件判断(score >= 90吗?>=80吗?...)
    • • 遇到符合条件的return语句,立即返回结果
    • • 回到这里,将返回值赋给变量grade
    feedback = get_grade_feedback(grade, score)

解释

  • • 调用get_grade_feedback()函数
  • • 传入两个参数:grade(刚刚计算出的等级)和score(原始分数)
  • • 注意:虽然函数定义中score参数没被使用,但我们仍传递它。这样设计的好处是:
    • • 保持接口一致性
    • • 便于未来扩展,比如可以根据具体分数提供更个性化的反馈

数据处理流程示例

让我们跟踪完整的一次循环过程:

# 第一次循环:i=0, score=95.5
grade = calculate_grade(95.5)      # 返回"A"(因为95.5≥90)
feedback = get_grade_feedback("A", 95.5)  # 返回"优秀!继续保持!"

# 输出:│ 张三  │  95.5 │   A    │ 优秀!继续保持! │


# 第四次循环:i=3, score=63.0

grade = calculate_grade(63.0)      # 返回"D"(因为63≥60但<70)
feedback = get_grade_feedback("D", 63.0)  # 返回"勉强及格,要加油了!"

通过这样的循环,我们为每个学生都计算了等级并获得了相应的反馈,最后以美观的表格形式输出。

五、错误处理:编写健壮的程序

1. 处理用户输入错误

def safe_divide(numerator, denominator):
    """
    安全的除法运算,避免除零错误

    参数:
        numerator (float): 分子
        denominator (float): 分母

    返回:
        float: 除法结果,如果出错返回None
    """

    try
:
        result = numerator / denominator
        return
 result
    except
 ZeroDivisionError:
        print
(f"错误:不能除以零! ({numerator} / {denominator})")
        return
 None
    except
 TypeError as e:
        print
(f"类型错误:{e}")
        print
(f"请确保输入的是数字")
        return
 None

def
 get_valid_number(prompt):
    """
    获取有效的数字输入

    参数:
        prompt (str): 提示信息

    返回:
        float: 有效的数字
    """

    while
 True:
        try
:
            user_input = input(prompt)
            number = float(user_input)
            return
 number
        except
 ValueError:
            print
(f"输入错误:'{user_input}' 不是有效的数字,请重新输入!")

# 测试安全的除法

print
("=== 安全除法测试 ===")
test_cases = [
    (10, 2),      # 正常情况
    (8, 0),       # 除零错误
    ("10", 2),    # 类型错误
    (15, 3),      # 正常情况
]

for
 num1, num2 in test_cases:
    result = safe_divide(num1, num2)
    if
 result is not None:
        print
(f"{num1} / {num2} = {result:.2f}")
    print
("-" * 30)

# 获取用户输入

print
("\n=== 计算器程序 ===")
print
("请输入两个数字进行除法运算:")
number1 = get_valid_number("第一个数字: ")
number2 = get_valid_number("第二个数字: ")

result = safe_divide(number1, number2)
if
 result is not None:
    print
(f"\n计算结果: {number1} ÷ {number2} = {result:.4f}")

2. 文件操作中的错误处理

def read_file_safely(filename):
    """
    安全地读取文件内容

    参数:
        filename (str): 文件名

    返回:
        str: 文件内容,如果出错返回错误信息
    """

    try
:
        with
 open(filename, 'r', encoding='utf-8') as file:
            content = file.read()
        return
 content
    except
 FileNotFoundError:
        return
 f"错误:文件 '{filename}' 不存在!"
    except
 PermissionError:
        return
 f"错误:没有权限读取文件 '{filename}'!"
    except
 Exception as e:
        return
 f"未知错误:{type(e).__name__} - {str(e)}"

# 测试文件读取

print
("=== 文件读取测试 ===")
files_to_try = ["data.txt", "nonexistent.txt", "/root/secret.txt", 123]

for
 filename in files_to_try:
    result = read_file_safely(filename)
    print
(f"尝试读取 '{filename}':")
    print
(f"  结果: {result[:50]}{'...' if len(result) > 50 else ''}")
    print
("-" * 50)

逐行详细解释:安全除法运算代码

第一部分:函数定义解析

函数1:safe_divide - 安全除法函数

def safe_divide(numerator, denominator):
    """
    安全的除法运算,避免除零错误

    参数:
        numerator (float): 分子
        denominator (float): 分母

    返回:
        float: 除法结果,如果出错返回None
    """

解释

  • • def safe_divide(numerator, denominator):
    • • 定义函数,名为safe_divide,意为"安全的除法"
    • • 参数命名技巧:
      • • numerator:分子(专业术语,比a、x这样的名字更有意义)
      • • denominator:分母(专业术语)
      • • 使用专业术语使代码更易理解,一看就知道参数的含义
  • • 文档字符串说明:
    • • 明确说明函数目的:避免除零错误
    • • 参数类型提示:(float)表示期望浮点数
    • • 返回值说明:正常返回float,出错返回None
    • • None是Python中表示"无"的特殊值,用于表示没有有效结果
    try:
        result = numerator / denominator
        return
 result

解释

  • • try-except结构:Python的错误处理机制,让程序更健壮
  • • try::开始尝试执行可能会出错的代码
  • • result = numerator / denominator:执行除法运算,这里可能发生两种错误:
    • • ZeroDivisionError:除数为0,数学上不允许
    • • TypeError:分子或分母不是数字类型,比如字符串除以数字
  • • return result:如果成功,立即返回结果
  • • 重要特性:一旦执行到return,函数立即结束,不会执行后面的代码
    except ZeroDivisionError:
        print
(f"错误:不能除以零! ({numerator} / {denominator})")
        return
 None

解释

  • • except ZeroDivisionError::捕获特定的除零错误
  • • 错误类型指定:
    • • ZeroDivisionError:Python内置的除零错误类型
    • • 只捕获这一种错误,其他错误仍会抛出,这样设计更精确
  • • 用户友好提示:显示具体哪个计算出错了,帮助用户理解问题
  • • return None:返回None表示计算失败
  • • 为什么用None而不是0或其他值?
    • • None明确表示"没有结果"或"计算失败"
    • • 如果用0,调用者无法区分"0÷5=0"和"5÷0失败"
    • • 这是Python中表示失败的常见做法,符合编程惯例
    except TypeError as e:
        print
(f"类型错误:{e}")
        print
(f"请确保输入的是数字")
        return
 None

解释

  • • except TypeError as e::捕获类型错误
  • • as e语法:将错误对象赋值给变量e
    • • e包含错误的详细信息
    • • 可以用str(e)获取错误描述
  • • 打印具体错误信息:{e}会显示如"unsupported operand type(s) for /: 'str' and 'int'"
  • • 给出修复建议:指导用户输入数字,使程序更友好
  • • 同样返回None表示失败,保持一致性

错误处理链的完整逻辑

执行顺序:
1. 先尝试执行除法
2. 如果除零错误 → 第一个except块,处理除零情况
3. 如果类型错误 → 第二个except块,处理类型问题
4. 如果其他错误 → 不捕获,会向上抛出,让上层处理

函数2:get_valid_number - 获取有效数字输入

def get_valid_number(prompt):
    """
    获取有效的数字输入

    参数:
        prompt (str): 提示信息

    返回:
        float: 有效的数字
    """

解释

  • • 函数目的:确保用户输入的是有效数字,防止无效输入导致程序崩溃
  • • 参数prompt:给用户的提示信息,如"请输入数字:"
  • • 返回值:转换后的浮点数,确保后续计算能正常进行
    while True:
        try
:
            user_input = input(prompt)
            number = float(user_input)
            return
 number

解释

  • • 无限循环设计:while True: 表示一直循环,直到满足条件退出
  • • 目的:直到用户输入有效数字才退出,保证数据有效性
  • • input(prompt):显示提示信息,等待用户输入
  • • number = float(user_input):尝试将输入转换为浮点数
    • • 这里可能发生ValueError:如果输入不是有效数字,如"abc"、"12a"等
  • • return number:转换成功,立即返回结果,同时退出循环
  • • 无限循环的安全退出机制
    • • 通过return退出循环(也退出函数)
    • • 这是安全的,因为一定会遇到return(成功)或程序被中断
        except ValueError:
            print
(f"输入错误:'{user_input}' 不是有效的数字,请重新输入!")

解释

  • • except ValueError::捕获转换失败的错误
  • • ValueError:当值不符合预期时抛出,如float("abc")
  • • 用户友好的错误信息:
    • • 显示用户实际输入了什么:'{user_input}',让用户知道哪里错了
    • • 指出问题:不是有效的数字
    • • 给出指导:请重新输入,引导用户正确操作
  • • 循环继续:没有returnbreak,所以继续循环,直到输入有效

输入验证的完整流程

循环开始
  获取用户输入
  尝试转换为数字
    成功 → 返回数字,结束循环
    失败 → 显示错误,继续循环(给用户再次输入的机会)

第二部分:测试逻辑解析

测试用例设计和执行

test_cases = [
    (10, 2),      # 正常情况
    (8, 0),       # 除零错误
    ("10", 2),    # 类型错误
    (15, 3),      # 正常情况
]

解释

  • • 测试用例设计思想:
    • • 正常情况(10÷2):验证基本功能是否正常工作
    • • 边界情况(8÷0):验证除零处理是否正确
    • • 错误情况("10"÷2):验证类型错误处理是否有效
    • • 另一正常情况(15÷3):再次验证正常功能,确保稳定性
  • • 使用元组列表存储测试用例:
    • • 每个元组(num1, num2)代表一个测试用例
    • • 列表保持测试用例的顺序,便于按顺序执行
  • • 为什么用元组而不是列表?
    • • 元组不可变,适合表示固定的测试数据
    • • 语义上更清晰:测试用例在运行时不应改变
    • • 性能更好:元组的访问速度比列表稍快
for num1, num2 in test_cases:

解释

  • • 遍历测试用例:for循环遍历test_cases列表
  • • 元组解包:
    # 第一次循环:
    num1, num2 = (10, 2)  # num1=10, num2=2

    # 第二次循环:

    num1, num2 = (8, 0)   # num1=8, num2=0
  • • 遍历过程:
    第1次:num1=10, num2=2   # 正常除法
    第2次:num1=8, num2=0    # 除零测试
    第3次:num1="10", num2=2 # 类型错误测试
    第4次:num1=15, num2=3   # 再次正常测试
    result = safe_divide(num1, num2)

解释

  • • 调用safe_divide()函数,传入当前测试用例的参数
  • • 接收返回值(可能是数字,也可能是None
  • • 这是测试的核心:验证函数在各种情况下的表现

测试执行过程

测试1:safe_divide(10, 2) → 返回5.0      # 正常情况,成功
测试2:safe_divide(8, 0) → 打印错误,返回None    # 除零情况,正确处理
测试3:safe_divide("10", 2) → 打印错误,返回None  # 类型错误,正确处理
测试4:safe_divide(15, 3) → 返回5.0      # 再次正常情况,成功
    if result is not None:
        print
(f"{num1} / {num2} = {result:.2f}")

解释

  • • None值检查:if result is not None:
    • • 使用is而不是==检查None
    • • 这是Python的惯例:is用于检查身份(是否是同一个对象)
    • • None在Python中是单例,所以可以用is,这样更准确
  • • 条件执行:
    • • 只有当结果不是None时才打印,避免显示无效结果
    • • 错误情况(返回None)不打印结果,保持输出整洁
  • • 格式化输出:{result:.2f}保留2位小数,让数字显示更规范
    print("-" * 30)

解释

  • • 分隔线:每个测试用例后打印30个"-"
  • • 作用:使输出更清晰,区分不同测试结果,提高可读性
  • • 字符串重复操作:"a" * 3 = "aaa",这是Python简洁语法的体现

第三部分:用户交互逻辑

获取用户输入

number1 = get_valid_number("第一个数字: ")

解释

  • • 调用get_valid_number()函数,传入提示字符串"第一个数字: "
  • • 函数执行过程:
    显示:"第一个数字: "
    等待用户输入
    如果输入有效数字 → 返回转换后的数字
    如果输入无效 → 提示错误,重新询问(循环)
  • • 用户可能看到的交互:
    第一个数字: abc
    输入错误:'abc' 不是有效的数字,请重新输入!
    第一个数字: 10
    (成功,number1 = 10.0)
  • • 用户体验设计
    • • 明确的提示告诉用户要做什么
    • • 友好的错误信息告诉用户哪里错了
    • • 无限重试直到成功,不给用户压力
number2 = get_valid_number("第二个数字: ")

同样的过程获取第二个数字,确保两个输入都是有效的。

执行计算并显示结果

result = safe_divide(number1, number2)

解释

  • • 用用户输入的数字调用safe_divide()
  • • 这里不会出现类型错误(因为get_valid_number确保了数字类型)
  • • 但仍可能出现除零错误,这是数学上的限制

可能的执行路径

路径1:正常计算
  number1=10, number2=2
  safe_divide(10, 2) → 返回5.0

路径2:除零错误
  number1=10, number2=0
  safe_divide(10, 0) → 打印错误,返回None
if result is not None:
    print
(f"\n计算结果: {number1} ÷ {number2} = {result:.4f}")

解释

  • • 再次检查是否为None,确保只显示有效结果
  • • 只有成功计算才显示结果,避免混淆
  • • 格式化细节的用心
    • • \n:先换行,使结果更突出,与前面内容分隔
    • • {result:.4f}:保留4位小数,提高精度显示
    • • ÷符号:使用除号而非斜杠,更符合数学习惯,也更友好
  • • 为什么要这个if检查?
    • • 当除零时,resultNone
    • • 如果没有检查直接打印:计算结果: 10 ÷ 0 = None
    • • 这样不友好,用户看不懂None是什么意思
    • • 我们的设计是:除零时只显示错误信息,不显示混乱的结果

七、知识要点总结

这个综合实战例子涵盖了文章中所有核心知识点,让我们回顾一下:

1. 数学函数应用

  • • round():在预测计算中进行精确舍入,确保数据准确性
  • • abs():处理收入和支出的绝对值计算,统一正负表示
  • • pow():计算投资复合回报,处理指数增长问题

2. 格式化输出

  • • :.2f:金额显示保留两位小数,符合财务规范
  • • :,:大数字的千位分隔符,提高可读性
  • • 对齐格式化:{text:<15}左对齐,{number:>15}右对齐,创建整齐的表格
  • • ASCII表格:使用字符画创建美观的报告输出

3. 函数定义

  • • 多个功能函数:add_transaction()generate_report()等,模块化设计
  • • 参数和返回值:完整的函数接口设计,明确输入输出
  • • 文档字符串:详细说明函数用途和参数,提高代码可维护性

4. 条件逻辑

  • • if-elif-else:财务状态评估、等级判断,实现程序分支
  • • 比较运算符:收支比例计算,量化分析
  • • 逻辑运算:复杂的条件判断,处理多条件场景

5. 错误处理

  • • try-except:处理无效金额输入,防止程序崩溃
  • • 特定异常捕获:ValueErrorTypeError,精准处理不同错误
  • • 用户友好的错误提示:引导用户正确操作,提升用户体验

八、易错点和最佳实践

🚨 关键注意事项

小Tip 1:浮点数精度处理

# 错误做法:直接相加可能产生精度问题
total = 0.1 + 0.2  # 可能得到 0.30000000000000004

# 正确做法:使用round控制精度

total = round(0.1 + 0.2, 10)  # 精确控制小数位数,得到 0.3

小Tip 2:格式化字符串中的转义

# 在f-string中显示花括号需要转义
value = 100
print
(f"金额: {{{value}}}")  # 输出: 金额: {100}
# 注意:最外层{}是f-string语法,内层{{}}表示字面量花括号

小Tip 3:除零错误预防

# 总是检查分母,防患于未然
def
 safe_divide(a, b):
    if
 b == 0:
        return
 None  # 或抛出更详细的异常
    return
 a / b

💡 最佳实践建议

  1. 1. 函数单一职责:每个函数只做一件事,保持简洁和可复用性
  2. 2. 错误早发现:尽早验证输入数据,避免错误传播
  3. 3. 用户友好:提供清晰的错误信息和提示,提升用户体验
  4. 4. 代码可读性:使用有意义的变量名和函数名,让代码自文档化
  5. 5. 格式化一致:保持输出格式的统一性,提升专业感

结语:从学习到实践

通过此次学习,我们不仅学会了Python的核心语法,更重要的是要掌握如何将这些知识组合起来解决实际问题。编程的真正价值在于用代码解决现实问题,现在你已经有了很好的开始!

请记住:编程是实践技能,就像学习游泳或骑自行车一样,需要不断练习。多写代码,多解决问题,你的能力就会不断提升!每一次调试都是学习的机会,每一个bug都是进步的阶梯。


📦 资源获取提示

关注「码农自习室」,后台回复关键词 Python学习,即可获取本文完整代码及配套练习数据集,一起动手掌握高效数据操作的核心技巧!


❤️ 支持我们

如果觉得本文对你有帮助,欢迎点赞 + 关注,您的支持是我们持续创作优质内容的最大动力!


📚 学习资源说明

本文内容是基于《Python Basics: A Practical Introduction to Python 3》(Real Python)一书的学习笔记整理。
这本书是一本非常优秀的Python入门教材,推荐给所有想要系统学习Python的朋友们。

这本书的特点:

  • • ✅ 完全面向编程新手
  • • ✅ 每个概念都有代码示例
  • • ✅ 包含大量练习题
  • • ✅ 由经验丰富的Python开发者编写

跟着这本书学习,配合我的笔记整理,相信你能更快掌握Python编程!

让我们一起坚持学习,每天进步一点点!💪

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 01:19:37 HTTP/2.0 GET : https://f.mffb.com.cn/a/469713.html
  2. 运行时间 : 0.145593s [ 吞吐率:6.87req/s ] 内存消耗:5,163.55kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c88f539bce0d83f1945ea9edceaeed50
  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.000623s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000690s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000421s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000335s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000685s ]
  6. SELECT * FROM `set` [ RunTime:0.007498s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000816s ]
  8. SELECT * FROM `article` WHERE `id` = 469713 LIMIT 1 [ RunTime:0.002275s ]
  9. UPDATE `article` SET `lasttime` = 1770484777 WHERE `id` = 469713 [ RunTime:0.005871s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.006163s ]
  11. SELECT * FROM `article` WHERE `id` < 469713 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.015340s ]
  12. SELECT * FROM `article` WHERE `id` > 469713 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006873s ]
  13. SELECT * FROM `article` WHERE `id` < 469713 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.017838s ]
  14. SELECT * FROM `article` WHERE `id` < 469713 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003554s ]
  15. SELECT * FROM `article` WHERE `id` < 469713 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002167s ]
0.147282s