python基础自学

🐍 Python 快速进阶目录

第一阶段:基础语法与变量 (The Basics)

  • 内容:print() 输出、变量定义、基本数据类型(整数、浮点数、字符串)。
  • 核心目标:学会和计算机"说话",存储简单信息。

第二阶段:逻辑控制 (Flow Control)

  • 内容:条件判断 (if/elif/else)、逻辑运算符、循环结构 (for, while)。
  • 核心目标:让程序学会"思考"和自动化"重复劳动"。

第三阶段:数据大管家 (Data Structures)

  • 内容:列表 (List)、字典 (Dictionary)、常用操作(增删改查)。
  • 核心目标:这是灵活运用的关键,学会高效地组织和管理大量数据。

第四阶段:函数与模块化 (Functions & Modules)

  • 内容:定义函数 (def)、参数传递、引入外部库 (import)。
  • 核心目标:学会代码复用,像搭积木一样写程序,而不是从零造轮子。

第五阶段:文件操作与综合实战 (File I/O & Practice)

  • 内容:读取 txt/csv 文件、写入文件、简单的异常处理。
  • 核心目标:能够让你的程序与外部文件交互,解决实际问题。

第一阶段基础变量与语法

      • [🐍 Python 快速进阶目录](#🐍 Python 快速进阶目录)
      • [1. 核心概念讲解](#1. 核心概念讲解)
        • [A. 让程序说话:`print()`](#A. 让程序说话:print())
        • [B. 数据的容器:变量 (Variables)](#B. 数据的容器:变量 (Variables))
        • [C. 超好用的"魔法":f-string (格式化字符串)](#C. 超好用的“魔法”:f-string (格式化字符串))
        • [D. 让程序听你的:`input()`](#D. 让程序听你的:input())
      • [💻 PyCharm 实操环节](#💻 PyCharm 实操环节)
      • [🎯 第一阶段通关测试:【简易个人名片生成器】](#🎯 第一阶段通关测试:【简易个人名片生成器】)
      • [**第二阶段:逻辑控制 (Flow Control)**](#第二阶段:逻辑控制 (Flow Control))
        • [A. Python 的灵魂:缩进 (Indentation) ⚠️ **超级重要**](#A. Python 的灵魂:缩进 (Indentation) ⚠️ 超级重要)
        • [B. 此时此刻非彼时:条件判断 (if/elif/else)](#B. 此时此刻非彼时:条件判断 (if/elif/else))
        • [C. 拒绝手动重复:循环 (For Loop)](#C. 拒绝手动重复:循环 (For Loop))
      • [💻 PyCharm 实操环节](#💻 PyCharm 实操环节)
      • [🎯 第二阶段通关测试:【FizzBuzz 报数游戏】](#🎯 第二阶段通关测试:【FizzBuzz 报数游戏】)
      • [**第三阶段:数据大管家 (Data Structures)**](#第三阶段:数据大管家 (Data Structures))
        • [A. 列表 (List):有序的收纳盒](#A. 列表 (List):有序的收纳盒)
        • [B. 字典 (Dictionary):带标签的档案柜](#B. 字典 (Dictionary):带标签的档案柜)
      • [💻 PyCharm 实操环节](#💻 PyCharm 实操环节)
      • [🎯 第三阶段通关测试:【简易库存管理系统】](#🎯 第三阶段通关测试:【简易库存管理系统】)
      • [**第四阶段:函数与模块化 (Functions & Modules)**](#第四阶段:函数与模块化 (Functions & Modules))
        • [A. 定义函数 (Functions)](#A. 定义函数 (Functions))
        • [B. 引入模块 (Modules)](#B. 引入模块 (Modules))
      • [💻 PyCharm 实操环节](#💻 PyCharm 实操环节)
      • [🎯 第四阶段通关测试:【简易计算器 & 抽奖机】](#🎯 第四阶段通关测试:【简易计算器 & 抽奖机】)
      • [**第五阶段:文件操作与综合实战 (File I/O)**](#第五阶段:文件操作与综合实战 (File I/O))
        • [A. 传统的笨办法(不推荐)](#A. 传统的笨办法(不推荐))
        • [B. 优雅的办法:`with open`(强烈推荐)](#B. 优雅的办法:with open(强烈推荐))
        • [C. 三种常用模式](#C. 三种常用模式)
      • [💻 PyCharm 实操环节](#💻 PyCharm 实操环节)
      • [🎯 第五阶段通关测试:【持久化日记本】](#🎯 第五阶段通关测试:【持久化日记本】)
      • [🚀 最终挑战:【毕业设计 - 命令行记账小助手】](#🚀 最终挑战:【毕业设计 - 命令行记账小助手】)

没问题,那我们马上开始!🔥

这是 第一阶段:基础语法与变量


1. 核心概念讲解

A. 让程序说话:print()

这是 Python 里最常用的指令,把括号里的内容显示在屏幕上。

  • 如果是数字,直接写。
  • 如果是文字 (字符串),必须加引号 (单引号 ' 或双引号 " 都可以,但要成对)。
python 复制代码
print("Hello World")  # 输出文字
print(666)            # 输出数字
print("666")          # 输出文字类型的 "666"(看起来一样,但在电脑眼里不一样)
B. 数据的容器:变量 (Variables)

想象变量就是贴了标签的盒子。你把数据放进去,下次直接喊盒子上的名字(标签),电脑就知道你要用里面的数据。

Python 很聪明,不需要你提前告诉它盒子里装的是什么类型(不像 C 或 Java),它会自动识别。

常见数据类型:

  • String (字符串): 文本信息。 *例如:"Gemini", "123"*
  • Integer (整数): 没有小数点的数字。 *例如:18, -5*
  • Float (浮点数): 带小数点的数字。 *例如:3.14, 19.9*
  • Boolean (布尔值): 只有真假。 *例如:True, False*
python 复制代码
name = "张三"      # 把 "张三" 装进 name 盒子
age = 25           # 把 25 装进 age 盒子
height = 1.75      # float 类型
is_student = True  # bool 类型

print(name)        # 输出:张三
C. 超好用的"魔法":f-string (格式化字符串)

这是 Python 最让人喜欢的特性之一!如果你想把变量和普通文字拼在一起输出,不要用 + 号去拼(容易报错),用 f-string

用法: 在引号前加个 f,然后在字符串里用 {} 把变量包起来。

python 复制代码
name = "李四"
age = 30
# 以前的笨办法(不推荐): print("我是" + name + ",今年" + str(age) + "岁")
# 现在的酷办法(推荐):
print(f"我是{name},今年{age}岁,明年我就{age + 1}岁了!")
D. 让程序听你的:input()

程序不应该只是自言自语。input() 可以暂停程序,等待用户输入内容。
注意:input() 接收到的内容,默认永远是字符串 (String) 类型。

python 复制代码
hobby = input("请输入你的爱好:") 
print(f"哇,原来你也喜欢{hobby}!")

💻 PyCharm 实操环节

现在请打开你的 PyCharm:

  1. 创建一个新的 Python 文件(例如 lesson1.py)。
  2. 把上面的代码敲进去运行一下,感受一下。
  3. 重点: 只有亲手敲过,那些报错(比如漏了括号、漏了引号)才会让你印象深刻。

🎯 第一阶段通关测试:【简易个人名片生成器】

任务要求:

编写一个 Python 程序,完成以下步骤:

  1. 询问用户的 姓名
  2. 询问用户的 出生年份(注意:用户输入的是字符串,比如 "1995")。
  3. 程序内部计算出该用户的 大致年龄 (用 2025 减去出生年份)。 *提示:你需要把输入的年份转成整数,用 int() 包裹一下,例如 int(year_str)*
  4. 询问用户 最喜欢的编程语言
  5. 最后用 f-string 一次性打印出一句完整的话,格式如下:

"你好 [姓名],原来你今年 [年龄] 岁了啊!祝你早日精通 [编程语言]!"

复制代码
print("what's your name?")
name = input()
print("In which year were you born? " )
year = input()
age=2025-int(year)
print("what's your favourite language?")
language = input()
print(f"你好{name},原来你今年 {age} 岁了啊!祝你早日精通 {language}!")

批改:

复制代码
# 你的写法
print("what's your name?")
name = input()

# 更 Pythonic 的写法(效果一样,少写一行)
name = input("What's your name? ")

第二阶段:逻辑控制 (Flow Control)

A. Python 的灵魂:缩进 (Indentation) ⚠️ 超级重要

在 C 或 Java 里,代码块是用大括号 {} 包起来的。但在 Python 里,我们只用缩进(通常是 4 个空格或 1 个 Tab)

  • 缩进对其,就代表它们属于同一个"组织"。
  • 缩进不对,程序必废。
B. 此时此刻非彼时:条件判断 (if/elif/else)

让程序根据不同的情况做不同的事。

  • if: 如果...
  • elif: (else if 的缩写) 或者如果...
  • else: 否则... (以上都不满足时)

**注意冒号 :** ------ 每一句判断语句结尾都要加冒号!

python 复制代码
score = 85

if score >= 90:
    print("大神!")     # 注意这里有缩进
elif score >= 60:
    print("及格了。")   # 这里也有缩进
else:
    print("下次加油!") # 这里也有缩进

# print("结束")        # 如果这行不缩进,不管上面怎么判断,这行最后都会执行
C. 拒绝手动重复:循环 (For Loop)

如果你想打印 100 次"你好",千万别写 100 行 print。

range() 函数:生成一串数字。

  • range(5) -> 生成 0, 1, 2, 3, 4 (注意:从 0 开始,不包含 5)
  • range(1, 4) -> 生成 1, 2, 3
python 复制代码
# 让 i 依次代表 0 到 4
for i in range(5):
    print(f"这是第 {i+1} 次循环")

💻 PyCharm 实操环节

请在 PyCharm 中新建 lesson2.py,尝试下面的逻辑。

🎯 第二阶段通关测试:【FizzBuzz 报数游戏】

这是一个经典的面试题,用来测试逻辑思维。

任务要求:

编写一个程序,使用 for 循环遍历从 1 到 20 的数字(包含 20)。

对于每个数字 i

  1. 如果这个数字能被 3 整除(提示:使用求余运算符 %,如 i % 3 == 0),打印 "Fizz"
  2. 如果这个数字能被 5 整除,打印 "Buzz"
  3. 如果这个数字既能被 3 又能被 5 整除,打印 "FizzBuzz"
  4. 如果以上都不满足,直接打印这个数字本身。

预期输出大概是这样的:

text 复制代码
1
2
Fizz
4
Buzz
Fizz
...
14
FizzBuzz
...

提示: 判断的顺序很重要哦!要把最苛刻的条件放在最前面。

开始吧!写完把代码发给我! ⚔️

复制代码
for i in range(1,21):
    if i%3==0:
        if i%5==0:
            print("FizzBuzz")
        else:
            print("Fizz")
    elif i%5==0:
        print("Buzz")
    else:
        print(i)

指导:

复制代码
# 另一种常见写法(扁平化)
for i in range(1, 21):
    if i % 3 == 0 and i % 5 == 0:  # 同时满足,最苛刻的条件放最上面
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

第三阶段:数据大管家 (Data Structures)

这一关非常关键。在实际工作中,我们很少处理单个变量,通常都是处理一堆 数据。Python 有两个最强大的武器:列表 (List)字典 (Dictionary)

A. 列表 (List):有序的收纳盒

就像一个超市购物清单,里面的东西是有顺序的。

  • 符号 :方括号 []
  • 索引 (Index)重点!Python 的计数是从 0 开始的! 第一个元素是 [0]
python 复制代码
# 创建列表
fruits = ["苹果", "香蕉", "橘子"]

# 查
print(fruits[0])  # 输出:苹果
print(fruits[-1]) # 负数代表倒着数,-1 就是最后一个:橘子

# 增
fruits.append("葡萄") # 加到最后面

# 改
fruits[1] = "大西瓜" # 把香蕉改成大西瓜

# 删
fruits.remove("苹果") # 删掉苹果
B. 字典 (Dictionary):带标签的档案柜

就像我们查字典,通过"拼音(键 Key)"找到"解释(值 Value)"。它是键值对 (Key-Value Pair) 的集合。

  • 符号 :花括号 {}
  • 特点:查找速度极快,不管里面有多少数据。
python 复制代码
# 创建字典: 学生姓名 -> 分数
scores = {
    "张三": 85,
    "李四": 92,
    "王五": 78
}

# 查:通过 Key 查 Value
print(scores["李四"])  # 输出:92

# 增/改:如果 Key 不存在就是新增,存在就是修改
scores["赵六"] = 100   # 新增赵六
scores["张三"] = 99    # 张三进步了,改成 99

# 常用操作:看看有哪些 Key
print(scores.keys())

💻 PyCharm 实操环节

新建 lesson3.py,把上面的代码敲一遍,重点体会一下 List 的 [0] 和 Dict 的 ["key"] 的区别。

🎯 第三阶段通关测试:【简易库存管理系统】

任务要求:

我们要结合列表字典 和之前学的循环来做一个小功能。

  1. 创建一个列表 products,里面初始有:"手机", "电脑"
  2. 创建一个字典 prices,记录价格:{"手机": 3000, "电脑": 5000}
  3. 进货操作 :请用代码往 products 列表里追加一个 "耳机"
  4. 定价操作 :请用代码往 prices 字典里添加耳机的价格,比如 200
  5. 盘点展示(难点)
  • 使用 for 循环遍历 products 列表。
  • 在循环中,通过商品名字去 prices 字典里把价格取出来。
  • 打印格式:商品:手机,价格:3000元 ...

错误版本

复制代码
products=["手机","电脑"]

prices={"手机": 3000, "电脑": 5000}

products.append("耳机")

prices["耳机"]=200

i=0

for i in products:

print(f'商品:{products[i]},价格:{prices["products[i]"]}元')

错误原因没有理解在python的循环里,这个i已经变成了列表里的值。

正确版本

复制代码
products=["手机","电脑"]
prices={"手机": 3000, "电脑": 5000}
products.append("耳机")
prices["耳机"]=200
i=0
for i in products:
    print(f'商品:{i},价格:{prices[i]}元')

哎呀,这就差一点点!🤏 你的逻辑是对的,但是栽在了 Python 循环的一个"特权"上。

如果直接运行你的代码,应该会报错:TypeError: list indices must be integers...

我们来分析一下为什么:

❌ 问题出在这里:

python 复制代码
for i in products: 
    # 这里 Python 和 C/Java 不一样。
    # i 不再是数字下标 (0, 1, 2),i 直接就是那个东西了!
    # 第一轮:i = "手机"
    # 第二轮:i = "电脑"
    
    # 所以当你写 products[i] 时,等于是在写 products["手机"] -> 列表不能用字查,只能用数字查。
    # 另外,prices["products[i]"] 里的引号把 products[i] 变成了一句死板的话,而不是变量。

✅ 修正后的代码:

因为 i 已经是商品名字了,直接用它就行!

python 复制代码
products = ["手机", "电脑"]
prices = {"手机": 3000, "电脑": 5000}

products.append("耳机")
prices["耳机"] = 200

# 建议把变量名 i 改成 item 或 p (product),读起来更顺口
for p in products:  
    # p 现在就是 "手机", "电脑", "耳机"
    # 直接用 p 去字典里查价格
    print(f'商品:{p},价格:{prices[p]}元')

你可以在 PyCharm 里改一下试试,看看是不是成功了?理解了这个,Python 的循环你会觉得比其他语言舒服太多了。


如果你改好了并理解了这一点,我们就进入第四阶段:函数与模块化。这一关是把"写脚本"变成"写工程"的分水岭。

第四阶段:函数与模块化 (Functions & Modules)

这一关的目标是:学会"偷懒"------把重复的代码打包,以后一行指令调用。

A. 定义函数 (Functions)

就像我们数学里的 ,你给它一个原料,它给你加工后的结果。

  • 关键字def (definition)
  • 结构def 名字(参数):
  • 返回值return (把结果扔回来,如果不写 return,函数跑完就结束了,不给你任何东西)
python 复制代码
# 定义一个做加法的工具
def add_numbers(a, b):
    result = a + b
    return result

# 调用它
he = add_numbers(3, 5)
print(he)  # 输出 8
B. 引入模块 (Modules)

Python 之所以强大,是因为它有全世界最大的"工具库"。你想画图、做网站、搞 AI,都不用自己写核心代码,直接借用别人的。

  • 关键字import

比如,我们要算一个随机数,或者算复杂的数学(比如根号):

python 复制代码
import random  # 引入随机数工具箱
import math    # 引入数学工具箱

# 生成一个 1 到 100 的随机整数
lucky_num = random.randint(1, 100)
print(f"今天的幸运数字是:{lucky_num}")

# 算 16 的平方根
root = math.sqrt(16)
print(root)

💻 PyCharm 实操环节

新建 lesson4.py

🎯 第四阶段通关测试:【简易计算器 & 抽奖机】

任务要求:

  1. 自定义函数 :写一个函数叫 calc_area(radius),用来计算圆的面积。
  • 公式: (或者用 3.14 * radius ** 2)
  • 函数要 return 面积结果。
  1. 调用函数:计算半径为 5 的圆面积,并打印出来。
  2. 模块使用
  • 引入 random 库。
  • 创建一个列表 names = ["张三", "李四", "王五", "你的名字"]
  • 使用 random.choice(names) 随机选一个人作为"中奖者"并打印出来。

这个练习让你既学会造工具(函数),又学会用别人的工具(模块)。动手试试! 🛠️

代码

复制代码
import random
def calc_area(radius):
    result=3.14 * radius** 2
    return result
print(calc_area(5))

names = ["张三", "李四", "王五", "你的名字"]
print(random.choice(names))

满分!💯 完全正确,无可挑剔!

你现在的代码风格已经非常像一个熟练的 Python 程序员了:

  1. 引用规范import 放在最上面,符合行业标准。
  2. 逻辑清晰:函数定义 -> 调用 -> 模块使用,一气呵成。

👨‍🏫 老师的小补充(追求完美版):

虽然 3.14 够用了,但如果你做高精度计算,Python 自带了一个更精准的 。

python 复制代码
import math
# math.pi 会提供 3.1415926535... 更加精确
result = math.pi * radius ** 2 

🎉 第四阶段通关! 现在你已经掌握了 Python 的 80% 核心功能。接下来是最后一关,也是让你的程序从"玩具"变成"工具"的关键------不仅要在内存里跑,还要把结果存下来。

第五阶段:文件操作与综合实战 (File I/O)

这一关的目标是:学会读写文件(txt),让数据持久化保存。

A. 传统的笨办法(不推荐)

就像打开冰箱拿大象:打开 -> 放进去 -> 关门。

python 复制代码
f = open("test.txt", "w") # w 代表 write (写入模式)
f.write("Hello World")
f.close()                 # ⚠️ 很多人容易忘写这一句,导致文件损坏或占用
B. 优雅的办法:with open(强烈推荐)

这是 Python 独有的"上下文管理器"。

它的意思是:"只要在这个缩进的代码块里,文件就是打开的;一旦代码跑出这个缩进,Python 自动帮你关掉文件。" 再也不用担心忘记 close() 了!

C. 三种常用模式
  • "w" (Write): 覆盖写 。如果文件不存在,创建它;如果存在,清空里面的内容重写(慎用!)。
  • "a" (Append): 追加写。在文件末尾接着写,不会清空原来的。
  • "r" (Read): 只读
python 复制代码
# 1. 写入 (w 模式)
with open("data.txt", "w", encoding="utf-8") as f:
    f.write("这是第一行数据。\n") # \n 是换行符

# 2. 追加 (a 模式)
with open("data.txt", "a", encoding="utf-8") as f:
    f.write("这是追加的内容。")

# 3. 读取 (r 模式)
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read() # 一次性读完
    print("文件里的内容是:")
    print(content)

注:encoding="utf-8" 是为了防止中文乱码,养成好习惯加上它。


💻 PyCharm 实操环节

新建 lesson5.py。这是我们要完成的最后一个基础实战,我们来做一个**"学习日记本"**。

🎯 第五阶段通关测试:【持久化日记本】

任务要求:

  1. 使用 input() 询问用户:"今天学到了什么?"
  2. 使用 with open"a" (追加模式),把用户输入的内容写入到一个叫 diary.txt 的文件中。
  • 提示:为了美观,可以在写入的内容后面加个换行符 \n
  1. 写入完成后,使用 "r" (读取模式) 打开这个文件,把里面所有的历史记录都打印出来,展示给用户看。

    learn=input("今天学到了什么")
    with open("diary.txt","a",encoding="utf-8") as f:
    f.write(f"{learn}\n")
    with open("diary.txt","r",encoding="utf-8") as f:
    print(f.read())

🎉 恭喜你!满分通关! 🎓

你的代码非常完美,尤其是你灵活运用了 f-string (f"{learn}\n") 来处理写入格式,这比用 + 号拼接要优雅得多。

现在,你已经掌握了 Python 的 六大基石

  1. 变量 (存数据)
  2. 逻辑判断 (做决定)
  3. 循环 (做重复工作)
  4. 数据结构 (列表/字典管理数据)
  5. 函数 (打包工具)
  6. 文件操作 (永久保存)

🚀 最终挑战:【毕业设计 - 命令行记账小助手】

为了让你真正达到"灵活运用",我们需要把前面学的这 6 点全部串联起来,做一个真正有用的小软件。

项目目标:

做一个记账程序,它能一直运行,直到你输入"退出"。它能记录你花的每一笔钱,保存到文件,并告诉你一共花了多少钱。

功能需求(请尝试自己实现):

  1. 死循环 :程序启动后,使用 while True: 让它一直运行。
  2. 交互:每次循环都问用户:"输入项目 (输入 q 退出):" 和 "输入金额:"。
  3. 退出机制 :如果用户在输入项目时输入了 q,使用 break 结束循环。
  4. 保存 :把每一笔"项目 - 金额"写入 bills.txt
  5. 展示(加分项) :程序开始时,先读取 bills.txt,把里面的金额加起来,打印:"你之前一共花了 xx 元"。

💡 给你一个骨架(填空题):

python 复制代码
# 1. 这里先写读取功能,计算历史总金额并打印
# total_money = 0
# with open... (如果文件不存在可能会报错,可以先手动新建一个空的 bills.txt)

print("--- 欢迎使用记账小助手 ---")

while True:
    item = input("\n请输入消费项目 (输入 q 退出): ")
    
    # 2. 这里写退出判断
    if item == 'q':
        print("退出程序,下次见!")
        break # 打断循环
        
    price = input("请输入金额: ")
    
    # 3. 这里写写入文件操作
    # 记得把 price 转成 int 或 float 才能计算,
    # 但写入文件时必须是 string
    
    print(f"记账成功:{item} 花费 {price} 元")

这是你从"新手"迈向"入门"的最后一战。写完这个,你就可以自豪地说你会 Python 基础了! 动手试试吧! 💪

复制代码
# 1. 这里先写读取功能,计算历史总金额并打印
total_money = 0
with open("bills.txt","r",encoding="utf-8") as f:
    for line in f:
        total_money+=int(f.readline())

print(f"--- 欢迎使用记账小助手 (历史总消费: {total_money} 元)---")

while True:
    item = input("\n请输入消费项目 (输入 q 退出): ")

    # 2. 这里写退出判断
    if item == 'q':
        print("退出程序,下次见!")
        break  # 打断循环

    price = input("请输入金额: ")
    with open("bills.txt","a",encoding="utf-8") as f:
        f.write(f"{price}\n")
    # 3. 这里写写入文件操作
    # 记得把 price 转成 int 或 float 才能计算,
    # 但写入文件时必须是 string

    print(f"记账成功:{item} 花费 {price} 元")
相关推荐
毕设源码-朱学姐18 小时前
【开题答辩全过程】以 基于Python的茶语店饮品管理系统的设计与实现为例,包含答辩的问题和答案
开发语言·python
Legendary_00818 小时前
LDR6020:单C口可充可放电PD协议芯片,开启USB2.0数据传输新体验
c语言·开发语言
我想回家种地18 小时前
python期末复习重点
前端·javascript·python
源代码•宸18 小时前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover
行者9618 小时前
Flutter适配OpenHarmony:高效数据筛选组件的设计与实现
开发语言·前端·flutter·harmonyos·鸿蒙
rgeshfgreh18 小时前
掌握PyWinAuto:高效Windows自动化
python
xwill*18 小时前
wandb的使用方法,以navrl为例
开发语言·python·深度学习
YJlio18 小时前
WinObj 学习笔记(15.7):看懂内核对象管理器与命名空间的“地图”
linux·服务器·网络·windows·笔记·学习·微信
编程大师哥18 小时前
Java 常见异常(按「运行时 / 编译时」分类)
java·开发语言