os 模块是你和操作系统之间的翻译官。你想让操作系统帮你"创建一个文件夹"、"删除一个文件"、"看看当前目录有什么",不用自己写底层指令,通过 os 模块就能完成。
生活类比:操作系统就像一个国家的政府,你想办个手续(比如查户口、建房审批),不需要直接跑到市长办公室,而是去政务大厅(os 模块),工作人员帮你代办。
import os # 导入模块,所有功能都在 os.xxx 里# 递归创建多层目录(父目录不存会自动创建,推荐!)os.makedirs("project/src/utils", exist_ok=True)# exist_ok=True:如果目录已经存在,不报错,直接跳过if os.path.exists("temp.txt"):os.rmdir("empty_folder") # 注意:只能删空目录!# shutil.rmtree("non_empty_folder")os.rename("old_name.txt", "new_name.txt")for root, dirs, files in os.walk("."): depth = root.count(os.sep) # 用分隔符数量表示层级深度print(f"{indent}[目录] {root}")print(f"{indent} 📄 {file}")新手易踩坑:
坑 1:os.mkdir("a/b") 其中 a 不存在 → 报错!请用 os.makedirs("a/b")坑 2:os.rmdir() 删非空目录 → 报错!非空目录用 shutil.rmtree()坑 3:os.listdir() 返回的只是名字,不是完整路径 → 拼完整路径用 os.path.join()
# === 拼接路径(自动处理 / 和 \ 的问题)===# 不要: "folder" + "\\" + "file.txt"path = os.path.join("folder", "subfolder", "file.txt")# Windows 输出:folder\subfolder\file.txt# Linux 输出: folder/subfolder/file.txtpath = "/home/user/documents/report.pdf"print(os.path.dirname(path)) # /home/user/documentsprint(os.path.basename(path)) # report.pdfname, ext = os.path.splitext("report.pdf")print(f"主名:{name},后缀:{ext}") # 主名:report,后缀:.pdfprint(f"是否存在:{os.path.exists(target)}")print(f"是文件吗:{os.path.isfile(target)}")print(f"是目录吗:{os.path.isdir(target)}")print(f"是绝对路径吗:{os.path.isabs(target)}")cwd = os.getcwd() # 当前工作目录abs_path = os.path.abspath(".") # 相对路径转绝对路径print(f"绝对路径:{abs_path}")跨平台路径的易错点:
# file_path = "data\images\photo.jpg" # Windows 上 \i 会被当成转义符!file_path = os.path.join("data", "images", "photo.jpg")file_path = r"data\images\photo.jpg"# r 前缀让 \ 变成普通字符# 正确写法3:直接用 /(Python 在 Windows 上也能识别)file_path = "data/images/photo.jpg"print(f"操作系统名称:{os.name}") # nt=Windows, posix=Linux/macOSprint(f"当前工作目录:{os.getcwd()}")print(f"登录用户名:{os.getlogin()}")print(f"PATH 环境变量:{os.environ.get('PATH', '未设置')}")if os.path.exists("test.txt"): stat = os.stat("test.txt")print(f"文件大小:{stat.st_size} 字节")print(f"最后修改时间:{stat.st_mtime}")print(f"创建时间:{stat.st_ctime}")# ret = os.system("dir") # Windows 上列出目录# ret = os.system("ls -la") # Linux/macOS 上# result = os.popen("dir").read()练习 1:在当前目录下创建 school/class1/students 三层目录,然后列出 school 目录下的所有内容。
练习 2:写一个函数 safe_delete(filepath),如果文件存在则删除并打印"已删除",否则打印"文件不存在"。
练习 3:用 os.walk() 遍历当前目录,统计一共有多少个 .py 文件。
练习 4:获取当前文件的绝对路径,分离出目录部分和文件名部分。
sys 模块管理的是Python 解释器本身的运行时信息。如果说 os 是"和操作系统对话",那 sys 就是"和 Python 解释器对话"。它帮你获取命令行参数、控制程序退出、查看模块搜索路径等。
生活类比:sys 就像汽车的仪表盘——它不参与行驶(不处理业务逻辑),但告诉你车速多少(运行状态)、还剩多少油(内存使用)、行驶了多远(命令行参数)。
sys.argv 是程序从命令行收到的参数列表。argv[0] 永远是脚本名本身,后面的才是真正的参数。
print(f"脚本名:{sys.argv[0]}")print(f"所有参数:{sys.argv}")print("用法:python greet.py <你的名字>")# > python greet.py 小明 18# 所有参数:['greet.py', '小明', '18']实战案例:一个简易命令行计算器
print("用法:python calc.py <数字1> <运算符> <数字2>")print("示例:python calc.py 10 + 5")num1 = float(sys.argv[1])num2 = float(sys.argv[3]) result = num1 / num2 if num2 != 0else"错误:除数不能为零" result = f"错误:不支持的运算符 '{operator}'"print(f"{num1}{operator}{num2} = {result}")# > python calc.py 10 + 5 sys.exit(1) # 退出码非 0 表示异常退出 sys.exit(0) # 退出码 0 表示正常退出check_age(15) # 输出"未满 18 岁,无法继续"后程序终止# check_age(15) 后面的代码都不会执行退出码约定:0 = 正常退出,1(或其他非零值)= 异常退出。这在 Linux 脚本中很重要。
sys.path 是一个列表,Python 按顺序去这些路径里找你要导入的模块。
for i, path inenumerate(sys.path, 1):实战场景:动态添加模块搜索路径
# └── my_utils.py ← 你想导入这个# 方法:把 libs 目录加到 sys.path 中sys.path.insert(0, os.path.join(os.path.dirname(__file__), "libs"))# stdout:标准输出(print 实际上就写到这里)sys.stdout.write("这行等价于 print,但没有自动换行\n")# stderr:标准错误输出(错误信息写到这里,可以独立重定向)sys.stderr.write("这是一条错误信息\n")# stdin:标准输入(input 实际上就从这里读)line = sys.stdin.readline().strip()实战:错误信息和正常输出分离
# 场景:程序运行时,正常结果输出到 result.txt,错误信息显示在屏幕上 sys.stdout.write(f"处理第 {i} 项...成功\n") sys.stderr.write(f"处理第 {i} 项...失败\n")# > python script.py > result.txt# 正常输出进了 result.txt,错误信息仍然显示在屏幕上!print(f"Python 版本:{sys.version}")print(f"Python 版本号:{sys.version_info}") # sys.version_info(major=3, minor=11, ...)print(f"操作系统平台:{sys.platform}") # win32 / linux / darwinif sys.version_info.major < 3:print(f"最大递归深度:{sys.getrecursionlimit()}")print(f"已加载模块数量:{len(sys.modules)}")练习 1:写一个脚本 add.py,从命令行接收两个数字,输出它们的和。如果参数不足则提示用法并退出。
练习 2:用 sys.stdout.write() 输出五行数字(每行一个),再用 sys.stderr.write() 输出两行警告。
练习 3:打印当前 Python 版本信息,如果是 Python 3.8 以下版本则输出警告。
math 模块提供了高级数学函数和常量。Python 自带 +、-、*、/ 等基础运算符,但要做开方、三角函数、对数运算,就需要 math 了。
生活类比:+、-、*、/ 就像加减法口算——日常够用。而 math 就像科学计算器——有 sin、cos、log、√ 等高级按钮。
print(f"π(圆周率):{math.pi}") # 3.141592653589793print(f"e(自然常数):{math.e}") # 2.718281828459045print(f"τ(2π,一圈的弧度):{math.tau}") # 6.283185307179586print(f"无穷大:{math.inf}") # infprint(f"非数字:{math.nan}") # nanarea = math.pi * radius ** 2print(f"半径为 {radius} 的圆面积:{area:.2f}") # 78.54print(f"是无穷大吗:{math.isinf(big)}") # Trueprint(f"向上取整 ceil(3.2):{math.ceil(3.2)}") # 4print(f"向上取整 ceil(-3.2):{math.ceil(-3.2)}") # -3print(f"向下取整 floor(3.8):{math.floor(3.8)}") # 3print(f"向下取整 floor(-3.8):{math.floor(-3.8)}") # -4print(f"截断取整 trunc(3.8):{math.trunc(3.8)}") # 3(直接砍掉小数)# 注意:math.floor 向负无穷取整,math.trunc 向零取整# trunc(-3.2) = -3 (更接近零)print(f"绝对值 fabs(-5.5):{math.fabs(-5.5)}") # 5.5print(f"复制符号 copysign(1, -3):{math.copysign(1, -3)}") # -1.0print(f"平方根 sqrt(16):{math.sqrt(16)}") # 4.0print(f"幂 pow(2, 3):{math.pow(2, 3)}") # 8.0(和 2**3 一样,但返回浮点数)print(f"e 的幂 exp(1):{math.exp(1)}") # 2.71828... 即 e¹print(f"阶乘 factorial(5):{math.factorial(5)}") # 120 (5×4×3×2×1)print(f"组合 comb(5,2):{math.comb(5, 2)}") # 10 (5选2的组合数)print(f"排列 perm(5,2):{math.perm(5, 2)}") # 20 (5选2的排列数)print(f"最大公约数 gcd(12, 18):{math.gcd(12, 18)}") # 6print(f"最小公倍数 lcm(12, 18):{math.lcm(12, 18)}") # 36print(f"带余除法 divmod(10, 3):{divmod(10, 3)}") # (3, 1) 商3余1angle_rad = math.radians(angle_deg) # 30° → 0.5236 弧度# 反过来:math.degrees(rad) 弧度转角度print(f"sin(30°) = {math.sin(angle_rad):.4f}") # 0.5000print(f"cos(60°) = {math.cos(math.radians(60)):.4f}") # 0.5000print(f"tan(45°) = {math.tan(math.radians(45)):.4f}") # 1.0000print(f"arcsin(0.5) = {math.degrees(math.asin(0.5)):.1f}°") # 30.0°print(f"arctan(1) = {math.degrees(math.atan(1)):.1f}°") # 45.0°r = math.hypot(x, y) # 距离 = √(x²+y²) = 5.0theta = math.atan2(y, x) # 角度(弧度)print(f"极坐标:距离={r},角度={math.degrees(theta):.1f}°")print(f"ln(e) = {math.log(math.e):.1f}") # 1.0print(f"ln(10) = {math.log(10):.4f}") # 2.3026print(f"log₁₀(100) = {math.log10(100):.1f}") # 2.0print(f"log₂(8) = {math.log2(8):.1f}") # 3.0print(f"log₃(27) = {math.log(27, 3):.1f}") # 3.03.5 math 与 Python 原生运算符的区别print(16 ** 0.5) # 4.0 (Python 运算符)print(math.sqrt(16)) # 4.0 (math 函数 —— 专门做开方,意图更明确)print(2 ** 3) # 8 (int —— 结果取决于输入类型)print(math.pow(2, 3)) # 8.0 (float —— 始终返回浮点数)# 3. 绝对值:内置 abs() vs math.fabs()print(abs(-5)) # 5 (int —— 返回同类型)print(math.fabs(-5)) # 5.0 (float —— 始终返回浮点数)print(math.isclose(0.1 + 0.2, 0.3)) # True# 0.1 + 0.2 在浮点数中不是精确的 0.3,但 isclose 判断足够接近print(0.1 + 0.2 == 0.3) # False —— 直接比较会出问题!练习 1:输入一个圆的半径,计算并输出它的面积和周长。
练习 2:使用 math.comb() 计算从 52 张牌中任意抽 5 张有几种可能。
练习 3:计算 sin(45°)、cos(45°)、tan(45°) 的值。
练习 4:一个人距离一座大楼 50 米,仰角 30°,求大楼高度。(提示:高度 = 距离 × tan(仰角))
练习 5:用 math.isclose() 判断 0.1 × 3 是否等于 0.3?
datetime 是 Python 中处理日期和时间的主力模块。它能创建日期对象、格式化输出、计算两个日期之间的差值,是日常开发中最常用的时间模块。
生活类比:datetime 就是你的电子日历——能看今天是几号、下个月几号是周几、距离过年还有多少天。
from datetime import datetime, date, time, timedelta# 注意:模块叫 datetime,里面有个类也叫 datetime(容易搞混!) | | |
|---|
date | | |
time | | |
datetime | | |
timedelta | | |
from datetime import datetime, date, timenow = datetime.now() # 当前日期+时间today = date.today() # 仅当前日期print(f"现在:{now}") # 2026-07-01 14:30:00.123456print(f"今天:{today}") # 2026-07-01d = date(2026, 7, 1) # 年, 月, 日t = time(14, 30, 0) # 时, 分, 秒dt = datetime(2026, 7, 1, 14, 30, 0) # 年, 月, 日, 时, 分, 秒dt2 = datetime(2026, 7, 1, 14, 30, 0, 500) # 最后是微秒print(f"日期:{d}") # 2026-07-01print(f"时间:{t}") # 14:30:00print(f"日期时间:{dt}") # 2026-07-01 14:30:00print(f"微秒:{now.microsecond}")print(f"星期几(0=周一,6=周日):{now.weekday()}")print(f"星期几(1=周日,7=周六):{now.isoweekday()}")strftime = string format time —— 把日期时间对象变成字符串。
from datetime import datetime# %Y = 四位年份(2026) %y = 两位年份(26)# %H = 24小时制(14) %I = 12小时制(02)print(now.strftime("%Y-%m-%d")) # 2026-07-01print(now.strftime("%Y年%m月%d日")) # 2026年07月01日print(now.strftime("%Y-%m-%d %H:%M:%S")) # 2026-07-01 14:30:00print(now.strftime("%A, %B %d, %Y")) # Wednesday, July 01, 2026print(now.strftime("%Y/%m/%d %I:%M %p")) # 2026/07/01 02:30 PMstrptime = string parse time —— 把字符串解析成日期时间对象。
from datetime import datetimedt1 = datetime.strptime(s1, "%Y-%m-%d")print(f"解析结果:{dt1},类型:{type(dt1)}")# 解析结果:2026-07-01 00:00:00,类型:<class 'datetime.datetime'>s2 = "2026年07月01日 14时30分"dt2 = datetime.strptime(s2, "%Y年%m月%d日 %H时%M分")s3 = "01/07/2026 14:30:00"dt3 = datetime.strptime(s3, "%d/%m/%Y %H:%M:%S")# 关键规则:字符串格式和格式字符串必须完全匹配!# "2026-07-01" 配 "%Y-%m-%d" √# "2026/07/01" 配 "%Y-%m-%d" ✗(分隔符不匹配!)新手易踩坑:
坑:strftime vs strptime 傻傻分不清 → strftime = 格式化输出(f = format),strptime = 解析输入(p = parse)记忆口诀:f = 输出(format out),p = 输入(parse in)
timedelta 表示一段时间间隔,可以和 date、datetime 做加减运算。
from datetime import datetime, date, timedeltaone_day = timedelta(days=1)three_days = timedelta(days=3)one_week = timedelta(weeks=1)one_hour = timedelta(hours=1)thirty_minutes = timedelta(minutes=30)gap = timedelta(days=2, hours=5, minutes=30)print(f"明天:{today + timedelta(days=1)}")print(f"昨天:{today - timedelta(days=1)}")print(f"一周后:{today + one_week}")print(f"三天前:{today - three_days}")print(f"一小时前:{now - timedelta(hours=1)}")print(f"两小时三十分钟后:{now + timedelta(hours=2, minutes=30)}")birthday = date(2005, 8, 15)age_days = (today - birthday).daysprint(f"从 {birthday} 到 {today} 过了 {age_days} 天")# (today - birthday) 返回一个 timedelta 对象,用 .days 取其中的天数print(f"大约 {age_days // 365} 岁") # 整数除法,粗略估算from datetime import dateprint(d1 < d2) # True(7月1日早于12月25日)print(d1 == d3) # True(同一天)if date(2026, 9, 1) >= d1 and date(2026, 9, 1) <= d2:from datetime import date, datetimedefcalculate_age(birth_date): age = today.year - birth_date.yearif today.month < birth_date.month or \ (today.month == birth_date.month and today.day < birth_date.day):print(f"年龄:{calculate_age(date(2005, 8, 15))} 岁")exam_date = date(2026, 12, 20)remaining = (exam_date - today).daysprint(f"距离期末还有 {remaining} 天")days_in_month = calendar.monthrange(today.year, today.month)[1]print(f"本月有 {days_in_month} 天")练习 1:获取当前日期时间,用三种格式输出。(如 2026-07-01、2026年7月1日、July 01, 2026)
练习 2:写一个函数,输入出生日期(字符串如 "2005-08-15"),返回精确年龄。
练习 3:计算距离 2027 年元旦还有多少天。
练习 4:将 "2026/10/01 10:30:00" 解析成 datetime 对象,然后加 3 天 5 小时。
练习 5:判断今天是否为周末。
time 模块处理的是底层时间:时间戳(秒数)、休眠、性能计时等。它与 datetime 分工不同——datetime 处理"人类可读的日历时间",time 处理"计算机底层的时间值"。
生活类比:
time = 秒表(精确到毫秒微秒,看事情花了多久)datetime = 台历(看今天是几号、下个月几号放假)时间戳是指从1970年1月1日 00:00:00(UTC) 到现在经过的秒数。所有计算机都用同一个起点,所以时间戳是跨平台的统一时间表示。
from datetime import datetimeprint(f"当前时间戳:{timestamp}")print(f"整数部分(秒):{int(timestamp)}")print(f"小数部分(微秒):{timestamp - int(timestamp):.6f}")readable = datetime.fromtimestamp(timestamp)print(f"时间戳转日期:{readable}")dt = datetime(2026, 7, 1, 12, 0, 0)5.2 结构化时间:time.localtime() 与 time.gmtime()time.localtime() 把时间戳解析成一个结构化时间对象(struct_time),包含年月日时分秒等各个字段。
print(f"类型:{type(now)}") # <class 'time.struct_time'>print(f"年:{now.tm_year}") # 也可以用 now[0]print(f"月:{now.tm_mon}") # 也可以用 now[1]print(f"日:{now.tm_mday}") # 也可以用 now[2]print(f"时:{now.tm_hour}") # 也可以用 now[3]print(f"分:{now.tm_min}") # 也可以用 now[4]print(f"秒:{now.tm_sec}") # 也可以用 now[5]print(f"星期几(0=周一):{now.tm_wday}") # 也可以用 now[6]print(f"一年第几天:{now.tm_yday}") # 也可以用 now[7]formatted = time.strftime("%Y-%m-%d %H:%M:%S", now)# 注意:time.strftime 的第二个参数是 struct_timeprint(f"格式化:{formatted}")time.perf_counter() 是 Python 推荐用来精确计时的函数。它不受系统时间调整影响,精度高。
# === 方法1:perf_counter(推荐,精度最高)===start = time.perf_counter()for i inrange(10_000_000):end = time.perf_counter()print(f"计算耗时:{elapsed:.4f} 秒")# === 方法2:time.time() ===# 也可以用,但受系统时间调整影响(比如 NTP 校时)print(f"耗时(time):{end - start:.4f} 秒")# === 方法3:timeit 模块(用于小段代码的精确计时)===execution_time = timeit.timeit(code_to_test, number=10000)print(f"10000次执行总耗时:{execution_time:.4f} 秒")5.5 time 与 datetime 的区别与协作from datetime import datetime# datetime 关注:日历日期、格式化、日期加减dt = datetime.fromtimestamp(ts)print(f"时间戳 → datetime:{dt}")ts_from_dt = dt.timestamp()print(f"datetime → 时间戳:{ts_from_dt}")print(f"datetime → struct_time:{struct}")dt2 = datetime.fromtimestamp(time.mktime(struct))print(f"struct_time → datetime:{dt2}") | | |
|---|
| datetime | |
| datetime | |
| time.perf_counter() | |
| time.sleep(2) | |
| datetime | |
| int(time.time()) | |
练习 1:写一个"10 秒倒计时"程序,每秒打印一次剩余秒数。
练习 2:用 time.perf_counter() 计算 sum(range(10_000_000)) 的执行时间。
练习 3:获取当前时间戳,转成 datetime 对象,再转回时间戳。验证转换前后是否一致。
random 模块让你在程序中引入随机性。比如抽奖、随机排序、生成验证码、掷骰子游戏等。
生活类比:random 就像掷骰子、抽扑克牌、转幸运转盘——结果不确定,但公平随机。
重要说明:random 生成的是伪随机数——用算法算出来的,看起来随机但不是真正的随机。对于抽奖、游戏等场景足够用;如果需要密码学级别的真随机,请用 secrets 模块。
print(f"0 到 1 之间:{random.random()}") # [0.0, 1.0) 比如 0.723456print(f"a 到 b 之间:{random.uniform(1, 10)}") # [1.0, 10.0] 比如 5.23print(f"1 到 10(含10):{random.randint(1, 10)}") # 包含两端 [1, 10]print(f"1 到 10(不含10):{random.randrange(1, 10)}") # 不含右端 [1, 10)print(f"0-100 的偶数:{random.randrange(0, 101, 2)}") # 步长 2,取偶数# === 设置随机种子(固定随机结果,方便复现调试)===print(f"种子 42 的第一个随机数:{random.random()}")print(f"种子 42 的第二个(重新设置种子):{random.random()}")# 设置相同种子后,随机序列完全一样,这对调试和测试很有用prizes = ["一等奖", "二等奖", "三等奖", "参与奖", "参与奖"]winner = random.choice(prizes)sample_3 = random.sample(prizes, 3)print(f"抽 3 个:{sample_3}")choices_3 = random.choices(prizes, k=3)print(f"有放回抽 3 个:{choices_3}")prizes = ["iPhone", "iPad", "耳机", "谢谢参与"]weights = [1, 3, 10, 86] # 权重:iPhone最难抽到# iPhone 权重 1,iPad 权重 3,耳机权重 10,谢谢参与权重 86# iPhone 概率 ≈ 1/(1+3+10+86) = 1%winner = random.choices(prizes, weights=weights, k=1)[0]# === 模拟抽奖 10000 次,看各奖品出现次数 ===results = random.choices(prizes, weights=weights, k=10000) count = results.count(prize)print(f"{prize}:{count} 次 ({count/100:.1f}%)")cards = ["A♠", "K♠", "Q♠", "J♠", "10♠","A♥", "K♥", "Q♥", "J♥", "10♥"]random.shuffle(cards) # 原地打乱,直接修改原列表# 注意:shuffle 修改原列表!如果不想改原列表:original = [1, 2, 3, 4, 5]shuffled = random.sample(original, len(original)) # 返回新列表print(f"原列表(不变):{original}")print(f"打乱后的新列表:{shuffled}")案例 1:课堂随机点名器
students = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九"] name = random.choice(students)print(f"\n >> 点到:{name}!\n") group_size = len(students) // 3 groups = [students[i:i+group_size] for i inrange(0, len(students), group_size)]for i, group inenumerate(groups, 1):print(f"第 {i} 组:{', '.join(group)}") picked = random.sample(students, 3)print(f"被抽中的三位同学:{', '.join(picked)}")案例 2:生成随机验证码
defgenerate_code(length=6):"""生成指定长度的随机验证码(数字+字母)""" chars = string.ascii_letters + string.digits # a-z A-Z 0-9 code = ''.join(random.choices(chars, k=length))defgenerate_easy_code(length=4):"""生成易读验证码(无易混淆字符:0/O, 1/l/I, 2/Z)""" safe_chars = "3456789ABCDEFGHJKLMNPQRSTUVWXY"return''.join(random.choices(safe_chars, k=length))print(f"验证码:{generate_code()} 易读版:{generate_easy_code()}")案例 3:模拟骰子游戏
defroll_dice(sides=6, count=1): results = [random.randint(1, sides) for _ inrange(count)]print(roll_dice(), end=" ") a, b = roll_dice(count=2)print(f" [{a}] [{b}] → 合计 {a + b}")案例 4:幸运大转盘
prizes = list(wheel.keys())weights = list(wheel.values())for prize, weight inzip(prizes, weights): prob = weight / sum(weights) * 100print(f" {prize}:{prob:.1f}%")result = random.choices(prizes, weights=weights, k=1)[0]print(f"\n ✨ 恭喜获得:{result} ✨\n")练习 1:模拟抛硬币 1000 次,统计正面和反面的次数。
练习 2:班上有 30 人,随机分成 5 组,每组 6 人,打印分组结果。
练习 3:实现一个"猜数字"游戏:程序随机生成 1-100 的整数,用户猜,提示"大了"或"小了"直到猜对。
练习 4:用 random.choices() 配合权重模拟一个"抽 SSR 卡牌"的抽卡系统(SSR 概率 3%,SR 概率 15%,R 概率 82%),模拟抽 100 次的结果。
练习 5:自定义字母和数字池(去掉易混淆字符),生成 10 个长度为 8 的随机密码。
┌──────────┬────────────────────────────┬──────────────────────────────┐│ 模块 │ 一句话定位 │ 最常用的 3 个功能 │├──────────┼────────────────────────────┼──────────────────────────────┤│ os │ 操作系统的翻译官 │ listdir(), makedirs(), │├──────────┼────────────────────────────┼──────────────────────────────┤│ sys │ Python 解释器的仪表盘 │ argv, exit(), path │├──────────┼────────────────────────────┼──────────────────────────────┤│ math │ 科学计算器 │ sqrt(), pi, sin()/cos() │├──────────┼────────────────────────────┼──────────────────────────────┤│ datetime │ 电子台历 │ datetime.now(), timedelta(), ││ │ │ strftime()/strptime() │├──────────┼────────────────────────────┼──────────────────────────────┤│ time │ 秒表 │ time(), sleep(), │├──────────┼────────────────────────────┼──────────────────────────────┤│ random │ 骰子/抽奖转盘 │ choice(), shuffle(), │└──────────┴────────────────────────────┴──────────────────────────────┘学习建议:
先记住每个模块的"一句话定位",知道什么时候该用谁os.path 和 pathlib 二选一学习即可(推荐 pathlib,更现代)datetime 和 time 经常配合使用,理解它们的分工很重要