Python 快速上手
从"装好 python3"到"写一个能处理你自己数据的脚本"——一条不绕路的最短路径。
📅 更新于 2026-09-13
本文校对于 Python @ 3.14.7 · 官方源:docs.python.org/3
0030 秒速览:三句话 + 按你的处境挑入口
读完这一篇,你能做到一件事:在终端里敲几行命令,让电脑读一个文件、算一算、把结果存成新文件——而不是只知道"Python 是一门很火的编程语言"。这一篇不教你成为工程师,只教你把脑子里的"要是电脑能替我做这个就好了"变成一段真能跑起来的代码。
① 能跑比懂原理重要——先照抄跑通,再回头问"为什么",别卡在第一课;② 缩进是语法,报错是向导——每行开头的空格不是排版好看,是 Python 用来判断"这几行是一伙的";报错最后一行通常直接告诉你该改什么;③ 让 AI 帮你写,但你负责看懂——你要学的是"读得懂、跑得动、改得了",不是把键盘敲烂。
按你现在的处境,直接用这个
| 你现在的状态 | 直接看这里 | 为什么先看它 |
|---|---|---|
| 电脑上还没装 Python | 03 装好 → 04 最小例子 | 不装好,后面每一节都只能干看 |
| 装好了,但不知道敲什么 | 04 最小例子 | 十分钟内你会亲手跑通两个程序 |
| 在别处抄了一段代码,跑不起来 | 10 报错调试 → 14 七个坑 | 九成的"跑不起来"是这两处的固定几个原因 |
| 想处理自己的 Excel / CSV / 一堆文本 | 11 读写文件 → 12 项目二、三 | 这是零基础最容易出成就感的方向 |
| 想让 AI 帮你写,但它给的代码看不懂 | 13 与 AI 搭档 → 05 起的基础语法 | 看懂 AI 的代码靠的是基础语法,不是靠提示词技巧 |
| 目的是写网站、做 AI | 先把 01–08 过一遍 | 这些方向千变万化,底下的语法就这么多 |
| 只想快速查一条命令 | 15 速查表 | 那一节的每一段都能直接复制去跑 |
如果你只有半小时:这样走
打开"终端",敲 python3 --version。看到 Python 3.x.y 就跳过第 03 节;报 command not found 就去第 03 节装。
照着 04 最小例子 的第 1、2 步做。目标不是理解,是亲眼看到屏幕上出现你自己打出来的字。
同一个例子,你会第一次见到"从键盘拿一个数 → 算 → 打印结果"这个最小闭环。
三个项目都是完整可运行的整段代码。跑通一个,你对"Python 能替我干活"就有实感了。
读完你应该能
① 在自己的 Mac 上装好并用 python3 --version 验证;② 读懂一段 30 行以内的新手向 Python,说出每一行大概在干什么;③ 写一个"读 CSV → 算平均分 → 写报告"的脚本;④ 看到红色报错时知道先看最后一行、再往上找自己的代码行;⑤ 给 AI 提问时把"代码 + 完整报错 + 我要什么"一次说全。
不教面向对象(class)、不教异步、不教装饰器,也不教怎么部署到服务器。这些等你先能用 Python 解决一个真实的小问题之后再学,顺序反了只会劝退。第 18 节有一条"什么时候该回头补 class"的判断标准。
几个你会反复看到的数字
01Python 到底是什么:先破掉三个错想
你在网上一定见过"Python 是 AI 语言""Python 是做爬虫的"。这些说法不算错,但它们描述的是别人拿 Python 干的事,不是 Python 是什么。先确认一件更基本的事——它其实和你已经会用的东西很像。
它不是什么
| 你可能这么以为 | 实际是这样 | 为什么这个错想很诱人 |
|---|---|---|
| "它是给 AI 用的黑话 / 只有程序员才碰" | 它是一门普通语言,你的第一段代码会是 print("你好") 这种完整句子 | 新闻里 Python 总和 AI、大数据一起出现,容易让人以为门槛在语言本身 |
| "它像网页上的按钮,点一下就出结果" | 你写的是一份清单文件,交给一个叫解释器的程序去逐行执行 | 你平时用的软件都有界面,而 Python 脚本默认只在文字窗口里说话 |
| "它要先编译成机器码,错一个符号就整屏报错" | 它是解释型语言:写一行、跑一行,不通过时才报错 | C、Java 这些语言确实是先整体编译,很多老教程沿用了那套描述 |
那它是什么
Python 官方的入门教程第一句就是它的定义(原文):"Python is an easy to learn, powerful programming language."——一门易学、强大的编程语言。紧接着官方还给了三个关键词:elegant syntax(优雅语法)、dynamic typing(动态类型)、interpreted nature(解释型本质),并说这些让它"非常适合脚本与快速开发"。[3]
Python = 一门解释型(写好一份文本,由解释器逐行读懂并执行,不需要你手动编译)、语法接近英语、自带一大箱现成工具的通用编程语言。对新手最大的意义是:把"我想让电脑干什么"翻译成代码这一步最短。
动态类型这个词听着吓人,拆开就一句话:你写 age = 30 时不需要提前声明"age 是个整数"——存进去什么,它就是什么,Python 自己看。(代价是类型错了要到运行时才发现,第 10 节讲这个代价长什么样。)
一个你一定要知道的边界:官方教程不是给零基础看的
这点很少有人告诉你。官方教程开头有一句提醒(原文):"This tutorial is designed for programmers that are new to the Python language, not beginners who are new to programming."——它是写给"已经会编程、只是不熟 Python"的人,不是写给完全没写过代码的人。[3]
所以你直接去读官方教程会有一个很具体的卡点:它会突然开始讲"对象""可迭代""命名空间"这些词,而这些词本身就是它要解释的东西。本文的写法就是针对这个断层——凡是你没见过的词,第一次出现就当场用日常语言说明白。
你写的东西,到底是怎么跑起来的
你写好的是一份纯文本文件,习惯上以 .py 结尾(这个后缀就是给人的提示:这是一份 Python 源码)。它自己不会动,需要一个叫解释器的程序来读它。整条链路是这样的:
(你自己写的部分)
(装 Python 时装的就是它)
因为"写一行、跑一行"这件事成立,你起步时可以只用一个入口:交互式模式——直接敲 python3 回车,屏幕上出现 >>>,你打一句它答一句,像聊天。这个 >>> 叫主提示符(primary prompt),是"解释器在等你说话"的记号;多行语句没写完时它会换成 ...,那是续行提示。[2]
它已经在替人做这些事
requests 加 BeautifulSoup 是最经典的组合。这些方向你现在一个都不用碰。提一句只是让你知道:你学的不是玩具语言,它是 AI、数据、自动化三座大山的共同地基。
新手最容易先卡住的三处
02它替你解决哪一类问题:什么时候该用它
很多人第一门语言学 Python,不只是因为它简单,而是因为它从"入门"到"干正事"之间几乎没有断层:今天学的语法,明天就能用来处理你电脑里那张 Excel。
四个具体的理由
if score >= 60: print("及格") 你不用查字典就懂。降低的是"会编程"这件事的门槛。和别的选择比,它赢在哪
| 维度 | Python | JavaScript | C / Java |
|---|---|---|---|
| 学起来 | 语法接近自然语言 | 语法还行,但要先搞懂浏览器或 Node 这套环境 | 要先处理指针、类型声明、编译这些概念 |
| 写完怎么跑 | python3 文件.py 直接跑 | 放进网页,或用 Node 跑 | 先编译,还要链接一堆东西 |
| 能立刻干嘛 | 处理你电脑上的文件与数据 | 主要做网页前端与服务 | 偏系统底层、游戏、高性能后端 |
| 新手友好度 | 公认最友好之一 | 中等 | 较陡 |
那它的短处是什么
Python 不是万能:纯计算的执行速度偏慢(重性能的场景会换语言或把热点部分换成 C);手机上不能直接跑;桌面原生 App 不是它的主场。但如果你现在的目标是"零基础快速上手 + 让 AI 帮做脚本、网站、数据处理",它依然是最短路径。选语言看的是目标,不是排名。
"我就想自动化一件小事",该用 Python 还是别的
| 你想做的事 | 更合适的工具 | 为什么 / 什么时候 Python 反而绕 |
|---|---|---|
| 把十几个文件复制到某个文件夹、改个名 | 终端里的 shell 命令 | 一行 mv 就够,写脚本是杀鸡用牛刀;但规则一复杂、要判断条件,Python 立刻更清楚 |
| 把一堆 CSV 合并、算统计、生成报告 | Python | 标准库自带的 csv 就能干,不需要装任何东西 |
| 给网页加个交互按钮 | JavaScript | 浏览器只认 JavaScript,Python 进不去 |
| 处理超大 Excel、几十万行数据 | Python + pandas | 手工在 Excel 里拖公式会卡死;Python 一次跑完还能重复跑 |
| 一次性改一个文件里的一个词 | 编辑器自带的查找替换 | 为它写脚本,光想清楚需求的时间就超过手工改的时间 |
这件事以后还要重复做,或者规则已经复杂到你要在脑子里维护一张清单——就该写脚本。只做一次、规则又简单,手工更快。
03把 Python 装到你的 Mac 上,并用一条命令验证
本节目标:装好一个可用的 Python,并且能用一条命令确认它真的在。下面每一步都不需要 sudo,照着官方安装包点下去就行。
第 1 步:先看看你电脑里是不是已经有了
macOS 最近几个版本自带一个 python3,所以第一件事不是下载,是确认。打开"终端":按 Command + 空格,输入"终端"(Terminal)回车,会弹出一个能敲字的窗口。然后输入:
python3 --version
三种可能的结果,对应三种做法:
| 屏幕上出现 | 说明 | 接下来做什么 |
|---|---|---|
Python 3.14.7(或任何 3.9 以上) | 已经装好了 | 直接跳到第 3 步验证,然后去 04 最小例子 |
Python 3.9.x 之类偏旧的版本 | 能用,但少了新写法 | 能跑本文全部示例;想升级就做第 2 步 |
zsh: command not found: python3 | 没装,或者装过但没进搜索路径 | 做第 2 步 |
官方文档明确提醒:macOS 里的 /usr/bin/python3 是 Apple 给自家开发工具(Xcode / 命令行工具)用的,通常版本偏旧、功能不全,而且不要改动或删除它。你自己从 python.org 装的那份和它可以共存;按官方安装包的默认选项装完,你敲的 python3 会优先用你装的那份。[5]
第 2 步:装官方安装包(推荐路线)
打开官网下载页 python.org/downloads,页面正中的大按钮就是当时的稳定版(本文校对时是 Python 3.14.7,2026 年 8 月 5 日发布)。macOS 用户下载的是 .pkg 安装包,双击后一路"继续 / 安装",中途输一次开机密码即可。安装选项保持默认就好,不要去勾那些自己也不认识的组件。[1]
第 3 步:验证它真的装好了
python3 --version
# 期望输出:Python 3.14.7
看到 Python 3.x.y 这一行就成了。3.11 及以上都能跑本文的所有例子,不必和 3.14.7 一模一样。
另一种装法:Homebrew(可跳过)
如果你之前装过 brew(macOS 上常见的软件包管理器,用一行命令装软件的工具),也可以:
brew install python@3.14
两种方式都行。重点是:装完统一用 python3 验证,别把不同渠道装的 Python 混着用——两个版本抢着当"python3"是新手最难查的一类怪问题。本文以官方 .pkg 为准。
万一报 command not found,按这个顺序排查
$ python3 --version
zsh: command not found: python3
要么没装,要么装了但安装程序没把它的位置加进终端的搜索路径。
① 重开一个终端窗口再试(安装包改了路径,旧窗口不会重新读);② 试带精确版本号的 python3.14 --version,能通就直接用它;③ 都不行就 brew install python@3.14 重装一次,再验证。
第 4 步:知道这三个入口就够起步
| 入口 | 命令 | 什么时候用 |
|---|---|---|
| 交互式命令行(REPL) | python3 | 随手试一两行、想立刻看到结果 |
| 运行脚本文件 | python3 hello.py | 正式跑你写在文件里的一整段程序 |
| 跑某个模块自带的命令 | python3 -m pip install xxx | 官方推荐的装库姿势,见 09 |
REPL 是"读一句、算一句、印一句、再循环"的缩写,中文一般叫交互式解释器:你敲一行它立刻回应一行,像一个随时答话的助手。它不是缩写炫技——它的用处就是"我只想试一下这个写法行不行",不用为此新建文件。
写 Python 绕不开终端:先记四条命令
| 命令 | 作用 | 例子 / 什么时候敲 |
|---|---|---|
pwd | 打印你当前在哪个文件夹 | 迷路了先敲它 |
ls | 列出当前文件夹里的内容 | 确认你的 .py 文件在不在这里 |
cd 文件夹名 | 进入某个文件夹 | cd ~/Desktop/python-练习 |
python3 文件名.py | 运行那个 Python 文件 | python3 hello.py |
九成是你人站的目录不对。正确顺序是:先 pwd 看自己在哪 → 用 cd 进到 .py 所在文件夹 → 再 python3 运行。另外,脚本要读的数据文件最好和脚本放同一个文件夹,能省掉大量路径问题。
Windows 用户怎么办
本文以 Mac 为主,但内容同样适用于 Windows,只有两处不同:装 python.org 的 .exe 安装包时务必勾上 "Add Python to PATH",之后把本文所有的 python3 换成 py 即可,例如 py --version。
PATH 是什么?它是系统里一份"去哪些文件夹找命令"的清单。你敲一个命令名,系统就照着这份清单一个文件夹一个文件夹地去翻。不勾 "Add Python to PATH",就等于没把 Python 所在的文件夹写进清单——文件明明在硬盘上,命令行也找不到它。Mac 上那个 command not found 是同一回事,只是 Mac 的官方安装包会默认替你写进清单。
安装这一步的四个新手坑
python3 还是找不到python 没反应python3。python 这个名字在 Mac 上被刻意保留给旧版本,避免冲突,所以敲它常常什么都不发生。04最小例子:十分钟跑通你的第一个程序
理论先放一边。这一节跟着做,十分钟内你会亲手写出并跑通两个程序,而且第二个已经是在"算真东西"了。
第 1 步:进交互模式,说一句话
终端里输入 python3 回车。看到 >>> 就表示 Python 在等你发话。
print("你好,Python!")
屏幕上立刻出现 你好,Python!。print 就是"把括号里的东西显示到屏幕上",是编程里最经典的第一句话。
输入 exit() 回车,或按 Ctrl + D(官方文档说明:在 Unix 系统上按 Control-D,Windows 上是 Control-Z),回到正常终端。[2]
第 2 步:写进文件,让它能重复跑
交互模式里试完就忘;真正要保存下来、以后还能再跑的程序,写进 .py 文件。
# 在桌面建一个文件夹专门放练习,然后进去
mkdir -p ~/Desktop/python-练习
cd ~/Desktop/python-练习
接着把下面这段存成 hello.py。最省事的办法:把内容复制进"文本编辑",然后"文件 → 存储为",文件名填 hello.py。
# hello.py —— 你的第一个 Python 程序
# 以 # 开头的行是"注释",给人和 AI 看的,Python 会跳过它
print("你好,世界!")
# input() 让程序停下来问你一句,等你敲完回车
name = input("你叫什么名字?")
# f 字符串:把 {变量} 的值拼进一句话里
print(f"欢迎,{name}!你已经迈出第一步了。")
然后运行它:
python3 hello.py
看到输出就代表你的第一个 Python 程序跑通了。
运行后程序会停住等你输入——敲你的名字回车,它会回复"欢迎,xxx!"。如果你输入中文没有出现乱码,说明你的 Python 默认按 UTF-8(一种能表示中文的通用字符编码)处理文本,这一步对中文用户很重要。
第 3 步:一个有数学的最小例子
编程不只是打印文字。下面这个程序把摄氏度换算成华氏度,它演示了入门必备的四件事:从用户拿输入 → 把文字变成数字 → 算 → 格式化输出。
# temp.py —— 摄氏度 → 华氏度换算器
c = float(input("请输入摄氏温度,例如 25:")) # float() 把文字变成小数
f = c * 9 / 5 + 32 # 换算公式
print(f"{c} 摄氏度 = {f} 华氏度")
print(f"保留一位小数:{f:.1f}") # :.1f 表示保留 1 位小数
python3 temp.py
运行过程与输出(25 是你敲进去的):
请输入摄氏温度,例如 25:25
25.0 摄氏度 = 77.0 华氏度
保留一位小数:77.0
这段代码你该盯住什么
| 写法 | 它是什么 | 为什么这里必须这么写 |
|---|---|---|
input() | 从键盘读一行,等你按回车 | 它拿到的永远是文字,想当数字算必须转换——这是新手第一大坑 |
float() | 把文字变成小数 | 不转的话 "25" * 9 会变成把文字重复九遍,而不是乘法 |
f"..." | f 字符串,把 {} 里的变量值嵌进句子 | 比用 + 一段段拼字符串清楚得多 |
{f:.1f} | 格式说明:保留 1 位小数 | 不写它,77.0 这种数会带一长串小数位,报告里很难看 |
| 行首的缩进 | Python 用它划分代码块 | 这里还看不出来,第 05 节第 3 小节两分钟讲清 |
别急着装 pandas、Django 这类"高级库",也别去抄网上那些你看不懂的长代码。入门第一周,只围绕 print / input / 变量 / 四则运算 这四个词做小练习,先把"能跑"的感觉建立起来。
05变量、注释、缩进:Python 的三条书写规则
这一节把 Python 最核心的"书写规则"讲完——其实只有三件事。懂了这三件,你就能读懂大半 Python 代码。
变量:给数据贴一个名字标签
变量就像便利贴:把一个值存进电脑的内存,再给它起个名字,方便以后反复用。变量这个词的意思是"可以变的量"——你随时可以撕掉旧便利贴换一张新的。你不需要提前声明它装什么类型,直接赋值即可:
name = "小明" # 存一段文字(字符串)
age = 30 # 存一个整数
height = 1.75 # 存一个小数(浮点数)
is_ok = True # 存真/假(布尔值,True/False 首字母大写)
print(name, age, height, is_ok) # print 可以一次打印多个,用逗号分隔
print(age + 1) # 30 + 1 → 31
这里的 = 读作"把右边的值存进左边的名字",不是数学里的"等于"。判断相等要用 ==(两个等号),这是第 14 节的第一个坑。
命名规则:记住三条就够
| 规则 | 可以 | 不行 / 为什么 |
|---|---|---|
| 只能由字母、数字、下划线组成,且不能以数字开头 | my_grade | 1st_grade 不行——一开头是数字,Python 会以为你在写数字 |
| 惯例用小写加下划线分隔单词(这套风格叫 snake_case) | user_score、total_price | UserScore 虽然能跑,但 Python 圈子里那是"类"的写法,别人看了会误会 |
| 不能用 Python 自己的保留字 | score、items | if / for / class 是语法的一部分,编辑器会给你变色警告 |
保留字是 Python 自己留着用的词(if、for、class、True 等),你不能拿它当名字——就像你不能把自家门牌号写成"邮局"。snake_case 直译是"蛇形命名",指全小写、单词之间用下划线连起来,因为看起来像一条蛇。
x = 100
y = 12
z = x * y
print(z)
三天后回看:x、y、z 到底是什么?没人知道,包括你自己。
price = 100
count = 12
total = price * count
print(total)
变量名写清楚,代码自己会"说话",AI 帮你改的时候也不容易改错。
注释:写给人(和 AI)看的话
# 后面同一行的内容 Python 会跳过,用来解释"这段在干嘛":
# 把一小时的秒数算出来
seconds = 60 * 60
seconds = 60 * 60 # 也可以写在代码末尾
注释不参与运行,所以它唯一的价值是"给读代码的人留线索"。你和 AI 协作时,写得清楚的注释会显著提高它改对的概率(第 13 节会展开)。
缩进:Python 用它划分"哪几行是一伙的"
这是 Python 和其他语言最大的不同。别的语言用花括号 { } 表示"这些代码是一组",Python 用行首的缩进。凡是以冒号 : 结尾的行,下面缩进的代码都属于它:
score = 85
if score >= 60: # 冒号结尾,表示下面是一个块
print("及格啦") # 这一行缩进了 4 个空格,属于 if
print("继续加油")
print("这句没缩进,永远会执行")
① 同一个块里,缩进量必须一致;② 全篇只用空格或只用 Tab,绝对不要混用(推荐统一 4 个空格);③ 一旦报 IndentationError,就是缩进出事了——别慌,顺着它指的行号看,通常一眼就能看出哪行多敲或少敲了。
输入与输出的标准姿势
input() 收进来的永远是文字;print() 只管把东西显示出来。补一个"一次输入多个值"的技巧(先眼熟,用得到再回来看):
a, b = input("用空格隔开两个数:").split()
print("第一个数是", a, ",第二个是", b)
这一节的三个新手坑
NameError。九成是拼写前后不一致,例如定义时写 user_name,用的时候写成 username。= 是"等于"06文字、数字,与"能装东西的盒子"
数据在 Python 里有不同类型。类型这个词的意思是"这份数据是什么种类"——它决定了你能不能对它加减、能不能切片、该怎么一个个取出来。先记住四种基础类型和三种容器。
四种基础类型
| 类型 | 中文叫法 | 例子 | 典型操作 · 什么时候用 |
|---|---|---|---|
int | 整数 | 42 | + - * // % **;计数、人数、次数用它 |
float | 小数 / 浮点数 | 3.14 | 同上,但注意精度小坑(第 14 节坑 6);金额别用它 |
str | 字符串(一段文本) | "hello" | + 拼接、len()、upper()、切片;一切文字都是它 |
bool | 布尔值(真 / 假) | True / False | and / or / not;一切"是或否"的判断都用它 |
字符串:一串字符排在一起,用引号包起来告诉 Python"这是文字不是代码"。单引号双引号都行,'你好' 和 "你好" 完全等价(第 18 节有"该用哪个"的讨论)。浮点数:带小数点的数。"浮点"这个怪名字来自它的内部表示方式——小数点的位置是浮动的,你不用管,只要记住"它算出来的结果可能有极小的误差"。
想随时知道一个值是什么类型、有多长,有两个内置函数:
x = "你好"
print(type(x)) # <class 'str'>
print(len(x)) # 2(中文按字符数算)
print("Python" * 3) # 字符串也能乘:PythonPythonPython
列表 list:有序、可改的"购物车"
列表就是把一堆东西按顺序装在一起,用一个名字带着走。它是新手最常用的容器。
fruits = ["苹果", "香蕉", "橙子"]
print(fruits[0]) # 苹果 —— 下标从 0 开始!
print(fruits[-1]) # 橙子 —— -1 表示最后一个
fruits.append("葡萄") # 末尾追加
fruits.remove("香蕉") # 按值删除
print(len(fruits)) # 3
print(fruits[1:]) # ['橙子', '葡萄'] —— 切片:从下标 1 取到最后
第一个元素是 fruits[0] 而不是 fruits[1]。为什么?历史原因,几乎所有主流语言都这么定。报 IndexError: list index out of range 就是下标越界了("out of range"字面意思:超出范围)。切片是把列表切一段出来,写 [1:] 表示"从下标 1 到末尾",注意切片的结束位置不包含那个下标——[0:3] 取的是第 0、1、2 个。
字典 dict:按"名字"查值的通讯录
列表按下标(第几个)取,字典按键(key)取——适合存有名字的字段,比如一个人的资料。你可以把它想成通讯录:你说"给我小明的电话",不需要知道小明排在第几页。
person = {"name": "小明", "age": 30, "city": "上海"}
print(person["name"]) # 小明
person["age"] = 31 # 改一个已有的值
person["job"] = "工程师" # 加一个新键
print(person.get("salary")) # None —— .get 找不到不报错
print(person.get("salary", 0)) # 0 —— 找不到时给个默认值
这里的 None 是 Python 表示"什么都没有"的专用值(不是 0,也不是空字符串,就是"没有")。.get() 比 person["salary"] 安全:后者在键不存在时会直接报 KeyError 让程序崩掉。
网页接口(API)传数据用的 JSON 格式,长得和 Python 字典几乎一样。你以后从网上抓数据、调 AI 的接口,拿到的常常就是"一堆字典"。[6]
另外两种容器:元组与集合(眼熟即可)
t = (1, 2, 3) # 元组 tuple:和 list 类似,但创建后不可改
s = {1, 2, 2, 3} # 集合 set:自动去重,结果是 {1, 2, 3}
| 容器 | 一句话特征 | 什么时候选它 · 别拿它干什么 |
|---|---|---|
list | 有序、可增删 | 一堆同类数据首选;别用 = 复制它(第 14 节坑 4) |
dict | 按键取值 | 带字段的数据用它;取值优先用 .get() 防崩溃 |
tuple | 不可改的列表 | 固定不变的一组值、函数一次返回多个值时用;别想往里 append |
set | 自动去重、无序 | 只关心"有哪些、不重复"时用;别拿它当有序列表 |
字符串的常用方法:每天都用得上
text = " Hello, Python "
print(text.strip()) # 去掉首尾空格
print(text.lower()) # 全小写
print(text.replace("Python", "世界")) # 替换
print("a,b,c".split(",")) # ['a', 'b', 'c'] 按逗号切分 → 超常用
print(text.upper().strip().startswith("HELLO")) # True,方法可以连着用
最后一行展示了 Python 很讨喜的一点:方法可以串起来写。先 upper() 变大写,再 strip() 去空格,最后 startswith() 判断是不是以某段开头——从左往右依次生效,读起来像一句话。
f-string:把变量优雅地塞进句子
name = "小明"
score = 92.5
print(f"{name} 考了 {score:.1f} 分,班级排名第 1") # 小明 考了 92.5 分,班级排名第 1
print(f"得分率:{score / 100:.0%}") # 得分率:93%
f"..." 里的花括号 {} 会被里面表达式的值替换掉;冒号后面是格式说明,控制"怎么显示"。:.1f 是保留 1 位小数,:.0% 是显示成百分比、不保留小数。这是 Python 3.6 起就有的写法,本文的示例统一用它。
列表套字典:真实数据的"标准形状"
单个字典只描述"一个人";现实中通常是一整班人——于是就是列表里装着很多字典。这个形状你会在 CSV、JSON、数据库查询结果里反复遇到:
students = [
{"name": "小明", "score": 88},
{"name": "小红", "score": 95},
{"name": "小刚", "score": 72},
]
# 一个个取出每个人,再按下标取里面的字段
for s in students:
print(f"{s['name']} 考了 {s['score']} 分")
# 一行算出平均分
avg = sum(s["score"] for s in students) / len(students)
print(f"平均分:{avg:.1f}") # 平均分:85.0
读完这段你回头会惊讶:第 11 节用 csv.DictReader 读表格时,每一行恰好就是这样一个字典——CSV、JSON、dict 三者在这个"形状"上彻底打通了。
类型转换一张表:九成 TypeError 都在这里解决
| 我想从…变成… | 写法 | 结果 · 什么时候用 |
|---|---|---|
| 字符串 → 整数 | int("42") | 42;input() 拿到的数字要算,必须先转 |
| 字符串 → 小数 | float("3.14") | 3.14;只要可能带小数点就用它,别用 int |
| 数字 → 字符串 | str(42) | "42";要和别的文字拼在一起时用 |
| 字符串 → 字符列表 | list("ab") | ["a", "b"] |
| 元组 / 集合 → 列表 | list((1, 2)) | [1, 2];想对不可改的东西排序时先转过来 |
| 成对的列表 → 字典 | dict([("a", 1)]) | {"a": 1} |
| 任意值 → 真假 | bool("") | False;空字符串、0、空列表都变 False |
| 查看某值是什么类型 | type(x) | <class 'str'> 之类;不确定时先问一句 |
# 最经典的组合:input 来的都是文字,分别转好再参与运算
price = input("单价:") # 拿到的是 "10"
qty = input("数量:") # 拿到的是 "3"
total = float(price) * int(qty) # 10.0 * 3 = 30.0
print(f"共 {total:.2f} 元")
这一节的四个新手坑
"5" + 5 会报 TypeError。先 int("5") 或 str(5) 转成同一种类型再算。= 判断相等==。= 是"存入",放在判断里是语法错误。s[0:3] 取前 3 个,下标是 0、1、2)。b = a 复制了列表07让程序自己做决定、反复做
写代码大部分时间就在回答两件事:"如果……就……"(条件)和"对每一个……都做一遍"(循环)。这两样学会了,你的程序才开始"像程序"。
if / elif / else:让程序分岔
score = int(input("请输入分数:"))
if score >= 90:
print("优秀")
elif score >= 60: # elif = "否则如果",可以写很多个
print("及格")
else: # 上面都不满足,才走这里
print("不及格,加油")
读法就是按顺序从上往下问:第一个条件成立就走第一个分支,不成立再问 elif,全都不成立才走 else。只要有一个成立,后面的条件根本不会被检查——所以顺序很重要。
比较运算符与组合条件
| 写法 | 含义 | 什么时候用 · 容易记错的地方 |
|---|---|---|
> >= < <= | 大于、大于等于、小于、小于等于 | 数值比较;>= 是"包含等于" |
== | 等于吗? | 判断相等只能用它,不能用一个 = |
!= | 不等于 | 读作"not equal" |
and | 两边都为真才算真 | 中文"且";age >= 18 and age <= 60 |
or | 任一边为真就算真 | 中文"或" |
not | 取反 | not is_ok 就是"不成立时" |
age = 25
if age >= 18 and age <= 60:
print("成年人,且还年轻")
Python 里 0、""(空字符串)、[](空列表)、None 在 if 里都算"假"。所以 if fruits: 就是"列表非空才执行"的简洁写法。这个规则叫"真值测试",用顺手之后代码会短很多。
for 循环:对每个元素做一遍
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(f"我吃了 {fruit}")
# 想固定做 N 次,用 range(N)
for i in range(3): # range(3) → 0, 1, 2
print("第", i + 1, "次循环")
for ... in ... 读作"从右边的集合里,一个个取出元素放进左边的名字"。range(3) 生成 0、1、2 这三个整数(又一次从 0 开始)。遍历字典时,默认拿到的是"键";要同时拿键和值,用 .items():
person = {"name": "小明", "age": 30}
for key, value in person.items():
print(key, "=", value)
range 与 enumerate:两个最常配循环用的工具
| 写法 | 生成/返回什么 | 什么时候用它 |
|---|---|---|
range(5) | 0, 1, 2, 3, 4 | 重复做 N 次 |
range(2, 6) | 2, 3, 4, 5 | 从一个数到另一个数(结束值不含) |
range(0, 10, 2) | 0, 2, 4, 6, 8 | 第三个参数是步长 |
enumerate(fruits) | 同时给出"第几个"和"那个值" | 需要序号时用,比 range(len(...)) 干净 |
for idx, item in enumerate(fruits):
print(idx, item)
列表推导式:一行生成新列表
把"循环 + 收集结果"压缩成一行,读起来像英文句子:"对每个数,取它的平方,若它是偶数":
nums = [1, 2, 3, 4, 5]
squares = [n * n for n in nums] # [1, 4, 9, 16, 25]
evens = [n for n in nums if n % 2 == 0] # [2, 4],带条件的写法
方括号里的 n * n 是"要留下的东西",后面 for n in nums 是"从哪来",最后 if ... 是"哪些才留下"。它和写一个三行的 for 循环完全等价,只是更短。别为了短而硬用——嵌套两层以上的推导式就该拆成普通循环,否则你自己都读不懂。
while 与 break / continue:按条件反复做
count = 0
while count < 5: # 条件为真就一直循环
count += 1 # 等价于 count = count + 1
if count == 3:
continue # 跳过本次,直接进入下一轮
if count == 4:
break # 强制结束整个循环
print(count) # 只会打印 1 和 2
| 关键字 | 作用 | 什么时候用 · 别搞混 |
|---|---|---|
while | 条件为真就一直做 | 不知道要循环几次时用;必须保证条件最终会变假 |
break | 立刻结束整个循环 | 找到了、够了、要退出了 |
continue | 跳过本轮剩下的代码,进入下一轮 | 这一条数据不合法、跳过它继续 |
pass | 什么都不做,占位用 | 先搭好结构、内容回头再写 |
如果程序一直在刷屏停不下来,就是 while 的条件永远为真了。按 Ctrl + C 强制终止,然后检查循环里有没有那一行让条件"越来越接近不成立"的代码(上面例子里是 count += 1)。忘了写它,是死循环最常见的原因。
这一节的三个新手坑
if 忘写冒号:,漏了就是 SyntaxError。这是最高频的语法错误。= 写进判断里if score = 60: 必报错。判断相等是 ==。for x in list[:],然后删原列表里的。08把一段逻辑打包,反复用
函数就是给一段能干的代码起个名字,以后反复调用。它让你不用重复抄代码,也让程序读起来像"步骤清单"。这是你从"写几行"到"写一个程序"的分界线。
定义一个函数并调用它
def greet(name):
"""向某人打招呼(这是 docstring,说明函数用途)"""
message = f"你好,{name}!"
return message # return 把结果交回给调用处
result = greet("小明") # 调用,把返回值存进变量
print(result) # 你好,小明!
三个新词:def 是"定义"(define)的缩写;name 是参数,就是"调用时你传进来的东西";return 是"把结果交回去"。没有 return 的函数,调用后拿到的是 None——想拿到结果就务必写 return,别指望 print 能传值。
参数:默认值与关键字参数
def greet(name, greeting="你好"): # greeting 有默认值,可以省略
return f"{greeting},{name}!"
print(greet("小明")) # 你好,小明!
print(greet("小明", "晚上好")) # 晚上好,小明!(按位置传)
print(greet(greeting="Hi", name="Tom")) # 用"名字="传参,顺序无关,可读性好
最后一行那种写法叫关键字参数:写清楚"哪个值给哪个参数",顺序就不重要了。参数一多,它比按位置传参清楚得多。
把函数当积木:一个完整小例子
下面这段把 BMI(身体质量指数,用体重和身高算出来的一个健康参考值)拆成两个小函数,再由主流程调用。请留意它有多短、多好读:
def bmi(weight_kg, height_m):
return weight_kg / height_m ** 2
def category(bmi_value):
if bmi_value < 18.5:
return "偏瘦"
elif bmi_value < 24:
return "正常"
elif bmi_value < 28:
return "偏胖"
return "肥胖"
w = float(input("体重(公斤):"))
h = float(input("身高(米):"))
value = bmi(w, h)
print(f"你的 BMI 是 {value:.1f},属于 {category(value)}")
** 是"乘方",height_m ** 2 就是身高乘以身高。注意 category 里最后那行 return "肥胖" 没有跟 elif:前面三种情况都被拦掉了,能走到这里的只剩第四种。
① 一个函数只做一件事,名字说明它干什么(category 就是"判断属于哪一类");② 超过 20 行的函数就该想想能不能拆。这样写出来的代码,AI 也更容易帮你改对——因为它一眼能看出你要改哪一块。
变量作用域:函数内和外是两个世界
函数里新建的变量(叫局部变量)在函数外面看不见。想用函数算出来的东西,得用 return 把它交出来:
def double(n):
n = n * 2 # 这里改的是一个"副本"
return n
x = 10
double(x)
print(x) # 仍是 10!函数里改不动外面的 x
x = double(x) # 把返回值"接"回来才生效
print(x) # 20
这个规则听起来绕,其实是保护你的:函数不会偷偷改掉外面的东西,出错时你只需要看函数的返回了什么。作用域这个词的意思就是"一个名字在哪些地方看得见"。
给函数写说明书:docstring 与类型注解
代码是写给人(和 AI)读的。Python 里有标准写法给函数配"说明书":
def bmi(weight_kg: float, height_m: float) -> float:
"""根据体重(公斤)和身高(米)计算 BMI。"""
return weight_kg / height_m ** 2
# 冒号后的 float 只是"给读者的提示",不强制;-> float 表示"返回小数"
print(bmi(70, 1.75)) # 22.86...
| 写法 | 叫什么 | 为什么值得写 · 什么时候可以省 |
|---|---|---|
| 函数体第一行的三引号字符串 | docstring(文档字符串) | 说明"这函数干什么",VS Code 悬停时能直接看到;公共函数值得写,临时代码可省 |
参数后的 : float | 类型注解 | 让"该传什么"一目了然;Python 不强制检查,写错不会报错,但 AI 和编辑器会拿它做提示 |
括号后的 -> float | 返回值注解 | 说明"返回什么";同样不强制 |
入门阶段注解可写可不写。一旦函数多起来,它帮你少翻代码——而且你会发现,给 AI 的代码加上注解之后,它改出来的东西明显更准。
这一节的三个新手坑
greet 是"函数本体",greet() 才是"执行它"。忘写括号,拿到的是"这是一个函数"这类怪文字,不是结果。print 当返回值return。09模块、第三方库与虚拟环境:站在别人肩膀上
Python 强大的一大原因是"别人已经写好了大多数功能,你 import 一下就能用"。但要先分清两个词:标准库是装 Python 就自带的;第三方库是别人写好、要用 pip 另外装的。
import:把现成的工具拿进来
import math
import random
from datetime import date # 只拿 date 这一样
print(math.sqrt(16)) # 4.0 平方根
print(random.randint(1, 100)) # 1~100 之间的随机整数
print("今天是", date.today())
print(math.pi) # 3.141592653589793
import 的意思是"把那个工具箱搬进来"。import math 之后,用 math.sqrt 这种"工具箱.工具"的形式调用。from ... import ... 是"只拿工具箱里的某一件"。
标准库 = 买电脑时自带的应用
文件处理、CSV 表格、网络请求、JSON、随机数、日期,全都在标准库里,零安装。下面这八个是新手最值得先记住的:
| 模块 | 干什么用 | 一分钟上手 · 什么时候该想起它 |
|---|---|---|
pathlib | 文件与文件夹路径(本文主力) | Path("a/b.txt");凡是"读文件、写文件"都先想到它 |
csv | 读写 CSV 表格 | csv.DictReader(...);处理 Excel 导出的表格 |
json | 解析 / 生成 JSON | json.loads(字符串);调到任何网络接口都会遇到 |
datetime | 今天几号、当前时间、格式化 | datetime.date.today();给文件加时间戳、算间隔天数 |
random | 随机数、随机挑一个 | random.randint(1, 6);抽奖、游戏、抽样 |
math | 数学函数:开方、π、取整 | math.floor(2.7);别自己手写这些公式 |
re | 正则匹配,从文本里抠出符合模式的内容 | re.findall(r"\d+", text);从一堆文字里抽数字、抽邮箱 |
os | 操作系统接口(环境变量、系统命令) | os.getenv("HOME");读环境里配置的值 |
模块就是一个 .py 文件,里面的函数可以被别人 import 走——它是拆分代码的最小单位。正则(regular expression)是一串描述"文本模式"的符号,比如 \d+ 表示"连续的一串数字",用它可以在一大段文字里把数字挑出来,不用自己写一堆判断。JSON 是一种通用的数据交换文本格式,长得像 Python 字典,几乎所有网站接口都用它。
"文件 pathlib、表格 csv、交换 json、看时间 datetime"——这四个覆盖了新手日常的八成场景,先记住它们就够。
用 pip 装第三方库
pip 是 Python 官方的包安装工具("package installer for Python")。官方文档建议在 POSIX 系统(包括 macOS)上用带版本号的 python 命令配合 -m 参数来运行它,这样能保证装到你想装的那个 Python 里:[4]
python3 -m pip install requests # 例:requests —— 发 HTTP 请求,用代码去网上取数据
python3 -m pip list # 看看当前装了哪些库
-m 的意思是"把这个 Python 自己的某个模块当命令来跑"。装完在代码里照常 import requests 就能用。新手常用的第三方库,按"你想干什么"对应:
| 你想干什么 | 装它 | 一句话说明 · 什么时候还不用装 |
|---|---|---|
| 抓网页 / 调网络接口 | requests | 用代码发网络请求、拿 JSON 回来 |
| 解析网页里的内容 | beautifulsoup4 | 把网页信息抠出来;注意安装名和 import 名不一样(写 bs4) |
| 数据分析 / 处理大表格 | pandas | 像用 Excel 一样处理十万行数据;小表格用标准库 csv 就够 |
| 画图表 | matplotlib | 数据变折线图、柱状图 |
| 做网站后端 | flask | 几十行代码起一个本地网站 |
"这个功能标准库有没有?"——读写 CSV、JSON、文件根本不用装库。少装一个依赖就少一处版本坑,出问题时也少一个怀疑对象。
别把库装进"系统 Python":先建虚拟环境
进阶之前先立一条规矩:给每个项目建一个虚拟环境,也就是一个独立的小房间,房间里的库互不干扰。这样 A 项目要 requests 的 1.x、B 项目要 2.x,也不会打起来。三步:
python3 -m venv .venv
会在当前目录生成一个隐藏的 .venv 文件夹。venv 是 Python 标准库自带的虚拟环境工具,装 Python 就有,不用另外装。[7]
source .venv/bin/activate
官方文档给出的 POSIX(macOS / Linux)bash、zsh 激活命令就是这个形式:source <环境目录>/bin/activate。执行后命令提示符前面会出现 (.venv),表示你已经在环境里了。Windows 的命令行是 .venv\Scripts\activate.bat,PowerShell 是 .venv\Scripts\Activate.ps1。[7]
python3 -m pip install requests
python3 -m pip freeze > requirements.txt # 把依赖清单存下来,换电脑一键还原
requirements.txt 是一份"我装过哪些库、什么版本"的清单。换一台电脑时,python3 -m pip install -r requirements.txt 就能把环境一模一样还原出来。
激活环境后敲 which python3。如果输出的路径里含有 .venv,就说明此刻装库会进小房间,不会弄脏系统里那个 Python——这是每个 Python 项目的卫生习惯。which 是终端命令,作用是"告诉我这个名字实际指向哪个文件"。
这一节的三个新手坑
pip install 装到了另一个 Pythonimport 却说找不到"。始终用 python3 -m pip install 这个前缀,让 pip 跟着你正在用的那个 python 走。import 报 ModuleNotFoundErrorpython3 -m pip list)?装在当前这个环境里了吗?拼写对吗?import 名不一致beautifulsoup4,代码里却要写 import bs4。以库的官方文档为准,别凭安装名猜。10报错与调试:把红字当向导
写代码报错是日常,不是意外。会读报错、会处理能预见的错误,你就已经超过大多数刚起步的人了。Python 的报错分成两大类,处理方式完全不同,先分清这一点。
语法错误 vs 运行时错误
| 类型 | 什么时候发生 | 长什么样 | 怎么办 |
|---|---|---|---|
语法错误 SyntaxError | 代码还没开始跑,Python 就发现你写得不合规矩 | 漏冒号、括号不配对、缩进乱 | 看它指的行号,问题通常就在那一行或上一行,缺个符号 |
运行时错误 Exception | 跑起来之后才踩到雷 | 除 0、下标越界、把文字当数字转 | 读最后一行"错误类型 + 说明",再往上找你的代码行 |
Exception 这个词的意思是"异常"——指程序跑到一半遇到的不正常情况。它不是崩溃的同义词:异常可以被捕获,捕获住程序就能继续往下走(下面第 3 小节讲)。
怎么读一长串报错(traceback)
那一大串红字有个正式名字叫 traceback(回溯),意思是"从出错的地方一路往回追,都经过了哪些调用"。别被长度吓到,读法只有两条:
Traceback (most recent call last):
File "temp.py", line 3, in <module>
f = c * 9 / 5 + 32
TypeError: can't multiply sequence by non-int of type 'float'
TypeError: can't multiply sequence by non-int of type 'float'——类型错了:你拿一段"文字"去乘一个小数。"sequence"在这里指字符串。八成是在哪里忘了 float() 转换。
它告诉你"出问题的是我自己的代码第 3 行"。打开那个文件看那一行,问题九成就出在这里。
ValueError 是值不对(比如把 "abc" 转成数字);IndexError 是下标越界;NameError 是变量没定义或拼错了。
try / except:处理"能预见到的意外"
凡是用户输入、读文件、网络请求这类"外面来的数据",都可能出意外。用 try / except 兜住,程序就不会直接崩掉:
while True:
raw = input("请输入一个整数:")
try:
n = int(raw) # 可能失败的"危险操作"放 try 里
break # 成功就跳出循环
except ValueError: # 只抓这一种错
print("那不是整数,请重来") # 出错了不崩,回头再问一次
print(f"你输入了整数 {n},它翻倍是 {n * 2}")
n = int(input("请输入整数:"))
print(10 / n)
输入 "abc" → 报 ValueError 崩溃;输入 0 → 报 ZeroDivisionError 崩溃。
try:
n = int(input("请输入整数:"))
print(10 / n)
except (ValueError, ZeroDivisionError) as e:
print("输入不对,或除数不能为 0:", e)
几种错误一起抓,告诉用户哪里不对,程序不崩。as e 把错误对象接住,方便打印出具体原因。
调试三板斧:新手最实用的三个动作
| 招数 | 怎么做 | 什么时候用 · 为什么有效 |
|---|---|---|
| print 大法 | 在可疑的地方打印变量:print("到这儿了,x =", x) | 看哪一步的结果和预期不符。这也是你向 AI 求助时要提供的关键信息 |
| 把报错整段发给 AI | 红色错误信息 + "哪一行是我写的" | AI 能秒级定位。前提是你把"哪段代码 + 完整报错"说清楚 |
| 只改一处、跑一次 | 别一次猜三个原因同时改三处 | 改一处验证一次,才能真正知道是哪一个原因导致的 |
第三个招数听起来慢,其实是最快的。同时改三处然后跑通了,你并不知道是哪一处起了作用——下次遇到同样的问题,你还是不会。还有一种公认有效的技巧叫橡皮鸭调试法:把问题对着一个不会回话的东西(传统上是一只橡皮鸭)复述一遍。很多时候说着说着答案自己就出来了,因为"讲出来"逼你把模糊的直觉变成具体的句子。
让 AI 帮你排错的正确姿势
同一句报错,信息给全和不给全,得到的答案天差地别。这两种问法的对比值得记住:
我代码报错了,帮我看看:
Traceback (most recent call last):
File ...
TypeError ...
只贴最后两行,AI 不知道是哪段代码、你想干什么,只能给你"可能是类型问题"这种泛泛的猜测。
我这段 Python 报错了(新手,只懂基础语法):
[粘贴 temp.py 的完整代码]
运行后报错是:
[粘贴完整红色报错]
请告诉我:1) 哪一行、为什么错;
2) 用最简单写法修好并加中文注释;
3) 怎么验证修好了。
代码 + 完整报错 + 你的水平 + 你要什么,四样给全,AI 能直接给你能跑的版本。
这一节的三个新手坑
except:except Exception as e: 并把 e 打印出来。11读写文件:让程序处理你的真实数据
到这里你开始做"真事"了:读电脑里的文本或 CSV 文件,算一算,再把结果存回去。本文统一用标准库里的 pathlib,它让路径处理在 macOS 和 Windows 上都正常。
读和写一个文本文件
from pathlib import Path
# 写:把内容存进 data.txt(文件不存在会自动创建)
Path("data.txt").write_text(
"第一行内容\n第二行内容\n", encoding="utf-8"
)
# 读:整份读进来
content = Path("data.txt").read_text(encoding="utf-8")
print(content)
# 逐行处理
for line in Path("data.txt").read_text(encoding="utf-8").splitlines():
print("读到一行:", line)
这里的 \n 是"换行符",一个写在代码里的记号,代表"这里换一行"。encoding="utf-8" 是告诉 Python"这份文件里的文字按 UTF-8 编码来读"。
在 Windows 上不指定编码去读中文,会乱码或直接报 UnicodeDecodeError。macOS 默认就是 utf-8,但同样建议写上——你的脚本总有可能被别人在别的电脑上跑。顺带回答一个常见疑问:Python 3 的源码本身默认就是 UTF-8(PEP 3120 定下的规则)[8],所以网上老教程里那句 # -*- coding: utf-8 -*- 在 Python 3 里一般不用写。
读 CSV(Excel 的"朴素版")算平均分
CSV 就是"用逗号分隔的纯文本表格"——Excel 可以另存为它,它也能被 Excel 打开。先用文本编辑器存一个 grades.csv(第一行是表头,也就是每一列叫什么):
姓名,分数
小明,88
小红,95
小刚,72
再写 average.py:
import csv
from pathlib import Path
rows = list(csv.DictReader(Path("grades.csv").read_text(encoding="utf-8-sig").splitlines()))
# utf-8-sig:吃掉 Excel 留下的 BOM 头,中文表头才读得对
scores = [float(row["分数"]) for row in rows]
avg = sum(scores) / len(scores)
print(f"共 {len(scores)} 人,最高 {max(scores)},平均 {avg:.1f}")
# 把结论写进一个新文件,方便存档
Path("report.txt").write_text(
f"平均分:{avg:.1f}", encoding="utf-8"
)
python3 average.py
共 3 人,最高 95.0,平均 85.0
BOM 是文件开头几个看不见的字节,Windows 上的 Excel 存 CSV 时会偷偷加上,用来标记"这是 UTF-8"。读的时候按 utf-8-sig 解码,就会把它吃掉,否则你的第一列列名会变成一个奇怪的 \ufeff姓名。表头就是第一行"每列叫什么",csv.DictReader 会拿它当键,把每一行变成第 06 节那个"字典"形状。
看,你已经会用一整套组合了
上面这个脚本同时用到了四样东西:读文件、CSV 解析、列表推导式(第 07 节)、f-string 格式化(第 06 节),最后还写了文件。能独立跑通它,你就具备了"用 Python 处理小数据"的核心能力——这也是第 12 节三个项目的地基。
异常处理 + 文件 = 防崩组合
读文件最常见的事故是"文件不在那儿"。用 try / except 兜住,程序就能给你一句人话,而不是一屏红字:
from pathlib import Path
def read_grade(path):
try:
return Path(path).read_text(encoding="utf-8")
except FileNotFoundError:
print(f"找不到文件 {path},请检查路径")
return None # 返回 None,调用方就知道"没读到"
text = read_grade("grades.csv")
if text is not None:
print("读到了", len(text), "个字符")
注意判断写法是 if text is not None:,不是 == None。判断"是不是 None"要用 is,这是 Python 圈子的固定习惯(第 18 节有解释)。
覆盖、追加、逐行读:三个常用姿势
| 想做什么 | 写法 | 说明 · 什么时候用 |
|---|---|---|
| 覆盖写入(从文件开头重写) | Path("f.txt").write_text("内容", encoding="utf-8") | 原内容会被替换;生成报告、输出结果用它 |
| 追加写入(接在末尾) | with open("log.txt", "a", encoding="utf-8") as f: f.write("新一行\n") | "a" 是 append(追加);记日志、累积记录用它 |
| 逐行读取 | for line in Path("f.txt").read_text(encoding="utf-8").splitlines(): ... | 处理每一行时用,比一次性全读进内存更省 |
# 一个小日志器:程序每次运行都记一行时间
import datetime
from pathlib import Path
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open("runs.log", "a", encoding="utf-8") as f:
f.write(f"运行于 {now}\n") # \n 是换行符
print("已在 runs.log 追加一条记录")
with ... as f: 这个写法叫"上下文管理器",它的作用是用完之后自动帮你把文件关好,哪怕中途出错了也关。你不需要手动写关闭文件的代码——这也是为什么现在推荐 pathlib:多数场景它连 with 都省了。
这一节的三个新手坑
pwd 看一眼,或者把脚本和它要读的文件放同一个文件夹,再 cd 进去跑。+ 拼路径/,Windows 用 \)。用 Path("a") / "b.csv" 这种写法,让 pathlib 去处理。open 完必须手动 closewith open(...) as f: 只要带了 with 也一样安全——两套写法都对,别被吓到。12三个能今晚做完的小项目
知识要到"能独立做出东西"才算学会。下面三个项目从易到难,每个都是完整可运行、自带容错的整段代码。今晚挑一个做完,你对"Python 能替我干活"就会有实感。
项目一:猜数字游戏(练循环 + 条件 + 随机数)
# guess.py —— 猜 1~100 的随机数,带次数统计
import random
secret = random.randint(1, 100)
tries = 0
print("我心中想了一个 1~100 的数字,来猜猜看!")
while True:
raw = input("你猜是几?")
try:
guess = int(raw)
except ValueError:
print("请输入整数哦")
continue
tries += 1
if guess < secret:
print("太小了,再大点")
elif guess > secret:
print("太大了,再小点")
else:
print(f"恭喜!你用了 {tries} 次猜中。")
break
它把第 07 节的 while / if / break / continue 全用上了,还顺手演示了"用户乱输入也不会崩"。
项目二:文本文件词频统计(练文件 + 字典 + 排序)
# wordcount.py —— 数一数一段文字里哪些词出现最多
from pathlib import Path
import re
text = Path("essay.txt").read_text(encoding="utf-8")
words = re.findall(r"[一-龥]|[a-zA-Z]+", text) # 拆出中文单字或英文单词
counter = {}
for w in words:
counter[w] = counter.get(w, 0) + 1 # 见过的词 +1
top = sorted(counter.items(), key=lambda item: item[1], reverse=True)[:10]
print("出现最多的前 10 个:")
for word, count in top:
print(word, count)
sorted(..., key=..., reverse=True) 是按指定依据倒序排;lambda item: item[1] 是一个"匿名小函数"——没有名字、当场用一次,意思是"按每个元素的第 2 个位置(也就是次数)来排";最后的 [:10] 是切片,只取前十个。看不懂完全没关系,先跑通,再逐个去查。
还要准备一个 essay.txt:随便贴一段中文或英文文章进去就行。这个项目的输出会让你直观看到"哪种写法出现的次数最多"。
项目三:给 CSV 数据自动生成"一句话汇报"
# report.py —— 读多列成绩,输出每个字段的小结,全自动
import csv
from pathlib import Path
path = Path("scores.csv")
if not path.exists():
print("请先准备 scores.csv(表头:姓名,语文,数学,英语)")
raise SystemExit
rows = list(csv.DictReader(path.read_text(encoding="utf-8-sig").splitlines()))
subjects = ["语文", "数学", "英语"]
lines = [f"本次共 {len(rows)} 名同学参加。"]
for sub in subjects:
scores = [float(row[sub]) for row in rows]
lines.append(
f"{sub} 平均 {sum(scores) / len(scores):.1f},最高 {max(scores):.0f},最低 {min(scores):.0f}"
)
Path("报告.txt").write_text("\n".join(lines), encoding="utf-8")
print("\n".join(lines))
print("已保存到 报告.txt")
配套的 scores.csv 长这样(表头三个科目名要和代码里的 subjects 对上):
姓名,语文,数学,英语
小明,88,92,79
小红,95,86,91
小刚,72,68,80
raise SystemExit 是"主动结束程序"——文件都没准备好,继续跑下去只会报更难懂的错。"\n".join(lines) 是把一串文字用换行符连成一段多行文本,是写多行报告最常用的写法。
项目四(选做挑战):批量改文件名
把某个文件夹里所有 .txt 的名字加上日期前缀——这个练习最能让你体会"脚本替我做重复劳动"的感觉。这里只给需求和骨架,答案在你已经学过的知识里:
# rename.py —— 给当前文件夹所有 .txt 加上前缀"备份_",未实现,交给你
from pathlib import Path
import datetime
today = datetime.date.today().isoformat() # 例:2026-09-13
folder = Path(".")
# 提示:用 for f in folder.glob("*.txt") 拿到所有 .txt,再 f.rename(新名字)
# 挑战:先打印"要改哪些",确认无误再真改,避免误伤
凡是"批量改动真实文件"的操作,第一版都要只打印清单、不真执行(这种做法叫 dry-run,"空跑一遍")。确认打印出来的清单和你想要的一模一样,再把打印那行改成真正的重命名。这是对数据的敬畏,也是职业习惯。改错了,文件可能就找不回来了。
做完之后,这条路往哪走
| 方向 | 下一步学什么 | 为什么适合从零基础走这条路 |
|---|---|---|
| 自动化办公 / 数据处理 | pandas 处理 Excel、openpyxl 读写 .xlsx | 最容易出成就感:让电脑替你整理表格,立刻能看到成果 |
| 做网站 | flask 或 fastapi,用你已会的语法写一个本地网站 | 你已经有全部前置语法了;配 AI 助手能很快搭起前后端 |
| 让 AI 帮你写 | 把项目描述给 AI:"用 Python 写一个程序,读 CSV 统计平均分,要容错处理,分文件放" | 你负责读得懂、会跑、会改;AI 负责生成——这是第 13 节的核心分工 |
13四个一开始就该养成的习惯,和怎么跟 AI 搭档
作为新手,你不需要背 PEP 8 那类完整的代码风格规范,但下面四条能帮你少踩很多坑,也让 AI 更容易接手你的代码。
四个习惯
给 AI 的提问模板(直接复制去用)
把下面这段复制给 AI,它就能产出符合你当前水平的代码:
我是 Python 零基础新手,只会变量 / if / for / 函数 / 文件读写这些。
请用最简单、我读得懂的写法帮我写一个程序,功能是:
【一句话描述需求,例如:读取 scores.csv 求每科平均分】
要求:
1. 只依赖标准库,别引入第三方库
2. 用户输入和读文件要 try/except 容错,别让程序崩溃
3. 关键行加中文注释
4. 告诉我运行它要在终端敲什么命令、怎么验证结果
下面是我的报错(如有):【粘贴红色报错】
这份模板有效的道理很简单:它把 AI 最缺的三样信息一次补齐了——你的水平(决定代码复杂度)、约束(不用第三方库、要有容错)、验收方式(怎么跑、怎么验证)。缺了这些,AI 只能给你一份"通用答案"。
交代码之前的 30 秒自检清单
| 问题 | 检查什么 | 不过关的样子 |
|---|---|---|
| ① 在本地能跑通吗? | 我在终端 python3 跑过,结果正确 | "我猜应该能跑"——猜的都不算 |
| ② 别人能看懂吗? | 变量命名清楚、关键处有中文注释 | 满屏 a / b / c,没有一句解释 |
| ③ 出意外会崩吗? | 输入、读文件、网络都用 try 兜住了 | 输个字母就白屏报错 |
先问它一句"这代码用了哪些我不懂的语法",让它挑出来讲给你听。学 Python 的价值恰恰在于——你看得懂 AI 写的代码,而不是盲信它。看不懂的代码跑通了,那个成果不属于你:下次需求稍变一点,你就只能再问一次。
14新手必踩的七个坑
下面这些坑基本所有人都踩过。先读一遍,真遇到时能少慌很多——因为你会立刻认出"哦,是那个"。
坑 1:判断相等用了一个 =
if score = 60:
print("刚好及格")
= 是"存入",放在判断条件里 Python 看不懂你要干什么。
== 才是"等于吗?"if score == 60:
print("刚好及格")
两个等号。这条规则没有例外,记住就行。
坑 2:把 input 回来的文字直接当数字算
age = input("几岁?") # 得到的是 "25"(字符串)
print(age + 1) # ❌ TypeError:字符串和整数不能相加
age = int(input("几岁?")) # ✅ 用 int() 转换后再算
这是新手第一大坑,因为它不报"你错了",而是报一个看不懂的 TypeError。记住一句话:input() 拿到的永远是文字。
坑 3:下标从 1 开始数
fruits = ["苹果", "香蕉", "橙子"]
print(fruits[1]) # 你以为第一个 → 其实是"香蕉"
print(fruits[0]) # 苹果(第 0 个才是第一个)
坑 4:忘记"列表是共享的引用"
a = [1, 2, 3]
b = a # ❌ 这不是复制!a 和 b 指向同一个列表
b.append(4)
print(a) # [1, 2, 3, 4] —— a 也被改了!
c = a.copy() # ✅ 这才是真正复制一份
c.append(5)
print(a) # [1, 2, 3, 4] 不受影响
为什么会这样?因为 b = a 复制的不是那串数字,而是"那个列表放在内存哪里"这个地址。给同一个东西起两个名字,改一个当然两边都变。这个概念叫引用——变量名是指向数据的标签,不是装着数据的盒子。
坑 5:用可变对象当函数默认参数
def add_item(item, bag=[]): # ❌ 默认的 [] 只创建一次,会被反复污染
bag.append(item)
return bag
print(add_item("苹果")) # ['苹果']
print(add_item("香蕉")) # ['苹果', '香蕉'] —— 咦?不是应该只有香蕉吗?
改成 def add_item(item, bag=None):,然后在函数里写 if bag is None: bag = [] 就好了。这个坑的解释要牵扯到"默认值只在定义时求值一次",有点绕,先记住"别用可变默认参数"这句话,等以后想深究再看官方文档的函数定义一节。
坑 6:浮点数算出来"不精确"
print(0.1 + 0.2) # 0.30000000000000004 —— 不是 0.3!
这不是 Python 的 bug。官方教程专门有一章讲它:计算机用二进制表示小数,而大多数十进制小数无法用二进制精确表示,于是产生了极小的误差——所有用浮点数的语言都有这个问题。[9]
存金额要么用整数(以"分"为单位,比如 19.99 元存 1999),要么用 decimal 模块。一般计算里只是想显示得好看,用 round(x, 2) 或 f-string 的 :.2f 就够了。
坑 7:Tab 和空格混用缩进
if True:
print("a") # 4 个空格
if True:
print("b") # 用了 Tab → IndentationError
两者看起来一样宽,计算机看起来完全不同。解决方式只有一条:让编辑器统一成"用空格",并打开"显示空白字符"这个选项,这样混用一眼就能看出来。
终极排查口诀
① 报错先看最后一行判断类型,再往上找 File ..., line N 定位你自己的代码行;② 改一处 → 跑一次 → 再改,别一次猜三个原因;③ 实在没头绪,把代码片段 + 完整报错原样发给 AI。
15速查表:写代码卡住时回来翻
这一节是给你"用第二遍"的:每一段都能直接复制去跑。不用背,知道去哪找就行。
输入输出与类型转换
print("你好", 42, "一次打多个") # 逗号分隔
name = input("输入:") # 永远是字符串
n = int("25") # 字符串 → 整数
f = float("2.5") # 字符串 → 小数
s = str(42) # 数字 → 字符串
print(f"结果:{n * 2}") # f-string 拼值
字符串
s = "a,b,c"
print(s.split(",")) # ['a','b','c'] 切分
print("-".join(["a", "b"])) # 'a-b' 合并
print("hello".upper()) # HELLO
print(s.strip()) # 去掉首尾空格
print(len("你好")) # 2
print("苹果" in ["苹果", "梨"]) # True(判断在不在)
列表与字典
nums = [3, 1, 2]
nums.append(4) # 末尾加一个
nums.sort() # 原地排序 → [1,2,3,4]
print(max(nums), min(nums), sum(nums)) # 4 1 10
print([x * 2 for x in nums]) # 推导式
d = {"a": 1}
d["b"] = 2 # 新增 / 改键
print(d.get("c", "没有")) # '没有'(安全取值)
print("a" in d) # True 判断键是否存在
print(d.keys(), d.values()) # 所有键 / 所有值
条件、循环、range
if x > 0:
pass # pass = 占位,先不写内容也能过
for i in range(5): # 0,1,2,3,4
pass
for i in range(2, 6): # 2,3,4,5
pass
for i in range(0, 10, 2): # 0,2,4,6,8(步长 2)
pass
# range 配合下标,或直接用 enumerate 同时拿下标和值:
for idx, item in enumerate(fruits):
pass
函数与异常
def f(a, b=1, *args, **kwargs): # 默认值 / 不定数量参数(进阶,先眼熟)
return a + b
try:
risky() # 可能出错的代码
except Exception as e:
print("出错:", e) # 兜底打印,别让程序裸奔崩掉
*args 和 **kwargs 是"接收不定数量的参数"的写法,前者收位置参数、后者收关键字参数。现在看不懂没关系,眼熟即可——你在别人的代码里一定会碰到它。
文件与最常用的标准库
from pathlib import Path
Path("out.txt").write_text("内容", encoding="utf-8")
print(Path("out.txt").read_text(encoding="utf-8"))
import random, math, json
random.choice(["剪刀", "石头", "布"]) # 随机挑一个
math.floor(2.7) # 2(向下取整)
json.loads('{"a": 1}') # 字符串 → 字典
json.dumps({"a": 1}, ensure_ascii=False) # 字典 → 字符串(中文不乱码)
高频内置函数速查
| 函数 | 作用 | 例子 → 结果 · 什么时候用 |
|---|---|---|
print() / input() | 输出 / 接收输入 | input("问:") → 用户敲进来的文字(记得转类型) |
len() | 长度 | len("你好") → 2 |
type() | 看类型 | type(1) → int;不确定时先问一句 |
range() | 生成整数序列 | range(3) → 0,1,2 |
enumerate() | 遍历时同时拿序号 | for i, v in enumerate(xs) |
sorted() | 排序(不改原列表) | sorted([3,1,2]) → [1,2,3] |
sum() / max() / min() | 求和 / 最大 / 最小 | sum([1,2,3]) → 6 |
round() / abs() | 四舍五入 / 绝对值 | round(3.1415, 2) → 3.14 |
zip() | 把两个列表逐对合并 | list(zip("ab",[1,2])) → [('a',1),('b',2)] |
help() / dir() | 看帮助 / 看有哪些方法 | help(str)、dir("abc") |
VS Code 里把鼠标悬停在函数名上会显示提示;终端里敲 help(len) 也行;实在卡住就按第 13 节的模板问 AI"这个函数怎么用来着"。别背函数,会查就行。
最常报的 6 个错误对照表
| 报错 | 含义 | 修复方向 |
|---|---|---|
SyntaxError | 代码格式不合规 | 看行号附近:漏冒号 / 括号 / 引号,或缩进错 |
IndentationError | 缩进有问题 | 统一 4 个空格,别混 Tab |
NameError: name 'x' is not defined | 用了没定义的变量 | 检查拼写,以及是不是在函数外面想用函数里的变量 |
TypeError | 类型不对(比如字符串加数字) | 看要不要 int() / float() / str() 转换 |
ValueError | 值不对(比如转数字失败) | 检查输入是不是合法数字,或先用 try 兜住 |
IndexError / KeyError | 下标 / 键不存在 | 下标从 0 数起;字典用 .get() 安全取值 |
16四周练习路线:把 Python 变成习惯
光看不练一定会忘。下面是一条每天约 40 分钟的四周路线:每周都有明确的"出口测试",做完再进下一周,不赶进度。
四周的目标与出口测试
| 周次 | 目标 | 出口测试(不查资料能独立做出来才算过) |
|---|---|---|
| 第 1 周 跑起来(对应 03–05) | 装好环境,每天敲 3~5 个 print / input / 变量小练习 | 不查资料写出"输入两个数,输出它们的和与平均值" |
| 第 2 周 玩转数据(对应 06–07) | 会用列表、字典、f-string、for / if 处理"一班人"的数据 | 把第 06 节那个学生列表自己敲出来,并算出高于平均分的有几个人 |
| 第 3 周 学会复用与防崩(对应 08–11) | 写函数、读文件、用 try / except | 独立把第 11 节的"CSV 平均分"脚本写出来,并加上"文件不存在"的提示 |
| 第 4 周 做真项目(对应 12) | 挑一个你真正想解决的重复劳动,让 AI 帮你写成脚本,你负责读、跑、改、验收 | 这个脚本你连续用了 3 次以上 |
每周一道必做练习(先自己写,卡住再翻前文)
# 第 1 周:输入两个数,输出和、差、积、平均(提示:int / float 转换)
a = int(input("第一个整数:"))
b = int(input("第二个整数:"))
# 接下来交给你:print 出四则运算的结果
# 第 2 周:给一份分数列表,输出"高于平均分"的人(提示:第 06 节的结构)
scores = [85, 92, 58, 77, 69, 90]
avg = sum(scores) / len(scores)
# 交给你:遍历 scores,把 > avg 的都打印出来
# 第 3 周:写一个函数,输入秒数,返回"几小时几分几秒"
def fmt(seconds):
# 交给你:h = seconds // 3600,m = ...,s = ...
pass
# 第 4 周:读 notes.txt,统计它有多少行、多少字,写回 summary.txt
from pathlib import Path
text = Path("notes.txt").read_text(encoding="utf-8")
# 交给你:算行数、字数(提示 len(text.split())),写回 summary.txt
每个周末的自测清单(全勾上再进下一周)
| 能力 | 自测问题 | 不过关时回去看 |
|---|---|---|
| 能跑 | 我能不能 5 分钟内写好并跑通一个 .py? | 03 / 04 |
| 能读 | 见到报错,我能说出错误类型并指出大致原因吗? | 10 / 15 的错误对照表 |
| 能改 | AI 给的代码里,我认识的语法超过 80% 吗? | 05–08 |
| 能查 | 卡住时,我知道先查官方文档还是问 AI、该怎么问吗? | 13 的提问模板 |
第 2 周"能看懂但写不出"是完全正常的阶段,几乎每个人都会经历。解法只有一个:照着抄 → 盖上重写 → 改点花样。同一个例子抄三遍,手感就出来了。别追求一次理解所有,先让手熟。这不是作弊,这叫刻意练习。
新手处理脚本和数据时,暂时不需要主动学 class。等你发现 AI 给你的代码里 class 出现得越来越频繁、你已经看不懂了,再回头补官方教程的 Classes 那一章。顺序别反。
17术语表:什么时候用、别当什么用
遇到看不懂的词回来查。这一节不只是翻译,第三列回答的是"在这套东西里它为什么重要、什么时候该想起它、别把它当成什么"。
| 术语 | 定义 | 为什么重要 / 何时用 · 别当什么用 |
|---|---|---|
| 解释器 interpreter | 逐行读懂并执行 Python 代码的程序 | 装 Python 其实装的就是它;别把它当编译器——它是"读一行跑一行",所以类型错误要到那一行才暴露 |
| 脚本 script | 一段可独立运行、通常从上往下执行的代码文件 | 处理数据、自动化任务就用它;别把脚本当"常驻后台的服务",那是 Web 框架的活 |
| REPL / 交互模式 | 敲一行、立刻回应一行的对话式环境 | 试一行写法好不好用时用它;别在里面写长程序——退出就没了,不会保存 |
| 变量 variable | 给数据起的可复用名字 | 命名清楚代码就读得懂;别用 a / b / c,也别和函数重名 |
| 字符串 str | 文本类型,用引号包起来 | input 和 print 打交道的都是它;别忘转 int() / float() 才能做数学 |
| 列表 list | 有序、可增删的容器 | 一堆同类数据的首选;下标从 0 数,复制要用 .copy() |
| 字典 dict | 键值对容器,按"名字"取 | 带字段的数据(尤其 JSON)用它;取值优先用 .get() 防 KeyError |
| 元组 tuple | 不可改的"列表" | 固定不变的一组值、函数返回多个值时用它;别想往里 append |
| 布尔 bool | True / False 两个值 | 一切 if 和 while 的判断依据;记住"空和 0 都算假" |
| f-string | 把变量嵌进字符串的写法 | 拼输出优先用它,比用 + 一段段拼清楚;别在花括号里塞超长表达式 |
| 缩进 indentation | 行首的空格,Python 用它划分代码块 | 它是语法不是排版;统一 4 个空格,绝不混用 Tab |
| 函数 function | 打包一段逻辑、可反复调用的代码块 | 逻辑复用的最小单位;要拿结果必须 return,别靠 print 传值 |
| 参数 / 关键字参数 | 调用函数时传给它的值;写明名字再传就是关键字参数 | 参数多时用关键字传参,顺序无关、可读性好;别把可变对象当默认值 |
| 标准库 standard library | 装 Python 就自带的一整套模块 | 文件 / CSV / JSON / 日期先翻它,零安装;别一上来就装第三方库 |
| 模块 module | 一个 .py 文件,可以被 import | 拆代码的最小单元;import 名字拼错会报 ModuleNotFoundError |
| 第三方库 package | 别人发布、用 pip 安装的代码包 | requests / pandas 这些;务必装进虚拟环境,别污染系统 Python |
| 虚拟环境 venv | 每个项目独立隔离的 Python 小房间 | 每个项目建一个,装库先进它;别把不同项目的依赖混装在一起 |
| pip | Python 官方的包安装工具 | 装库用它;固定写 python3 -m pip 前缀,避免装到另一个解释器里 |
| 异常 exception | 运行时出错时抛出的信号,可以被捕获 | 用 try / except 接住程序就不崩;别写空 except 把错误吞掉 |
| traceback | 一长串报错回溯信息 | 读法:最后一行定类型,向上找 File ..., line N;别只贴第一行去问人 |
| 调试 debug | 找出代码哪里和预期不符并修好 | 打印中间变量是新手最快的办法;改一处验证一处,别一次改三处 |
| 编码 encoding / UTF-8 | 把文字变成电脑能存的字节的规则 | 读写中文文件时带上 encoding="utf-8";别在不同编码之间来回猜 |
| BOM | 文件开头几个看不见的字节,标记"这是 UTF-8" | Excel 存 CSV 时会加,读的时候用 utf-8-sig 吃掉它;别让它混进你的列名里 |
| CSV | 用逗号分隔的纯文本表格 | Excel 能存、也能打开;小表格用标准库 csv 就够,别急着装库 |
| JSON | 一种通用的数据交换文本格式,长得像 Python 字典 | 调网络接口几乎必遇;用 json 模块转换即可,别手工去拼这段文本 |
18常见问题
python 没反应?python3。python 这个名字在 macOS 上被刻意保留,避免和旧的 Python 2 冲突,所以敲它常常什么都不发生。还是找不到就先试 python3.14 --version,再不行重开终端或重装。>>> 和 $ 也要一起复制吗?>>> 表示"Python 的交互模式在等你",$ 表示"这是终端提示符"——都是系统显示的,不是你该输入的内容。复制正文即可。print 要不要括号)。以本文和官方 docs.python.org 3.x 为准。encoding="utf-8";脚本本身存成 UTF-8(编辑器右下角可以设置编码)。另外顺带澄清一句:Python 3 的源码默认就是 UTF-8(PEP 3120),网上老教程里那句 # -*- coding: utf-8 -*- 一般不用再写。'你好' 和 "你好" 是同一个东西。挑一个固定用即可。实用规则是"哪边省事用哪边":字符串里本来就有单引号(比如 f"{s['name']}")时,外层用双引号就不用转义了。None,是什么意思?None 表示"什么都没有 / 没值",是 Python 专用的"空"。函数不写 return、字典 .get() 找不到键,都会得到它。判断它要写 if x is None:,别用 ==——这是 Python 圈子的固定习惯。pathlib 和网上教程常见的 open(),哪个好?pathlib.Path 是因为它更现代、更省事(自动管文件关闭、跨平台路径、编码提醒写起来更自然)。老教程里的 with open(...) as f: 只要带了 with 也同样安全——别被两套写法吓到。.py 运行吗?99一句话总结
Python 入门 = 装好 python3 能跑起来 + 记住"变量、数据类型、if / for、函数、try / except"这五样 + 用 f-string 输出、用 pathlib 读写文件;顺着"跑 hello → 抄小例子 → 做小项目"走,两周内你就能让电脑替你干活。
下一步动作(现在就能做):打开终端敲 python3 --version,然后建一个 hello.py,把第 04 节第一段代码敲进去跑一遍。遇到红色报错,把整段错误加上那一行代码发给你的 AI 助手——读得懂报错,你就已经入门了。
① 能跑比懂原理重要——先照抄跑通,再回头问为什么;② 缩进是语法,报错是向导——4 个空格别乱,红字最后一行就是答案;③ 让 AI 帮你,但你负责看懂——你能读、能验、能改的代码,才是你会的代码。
附:速成练习三连(今晚就能做完)
# ① 打印 1~100 里所有能被 3 整除的数
for i in range(1, 101):
if i % 3 == 0:
print(i)
# ② 把"苹果,香蕉,橙子"拆成列表,再逐行打印
fruits = "苹果,香蕉,橙子".split(",")
for fruit in fruits:
print(f"我喜欢 {fruit}")
# ③ 把 26 摄氏度的华氏度结果保留 1 位打印
c = 26
print(f"华氏度:{c * 9 / 5 + 32:.1f}") # 华氏度:78.8
98参考来源与证据边界
本文的关键事实均经下列来源核对(2026-09-13 访问)。基础语法部分属于长期稳定的内容,版本号与安装细节属于会变化的内容——两者的处理方式不同,见下方的证据边界说明。
| # | 来源 | 本文用它验证了什么 |
|---|---|---|
| [1] | Python 3.14.7 发布页 / 官方下载页 | 当前稳定版 3.14.7,2026 年 8 月 5 日发布;macOS 提供官方安装包(.pkg),支持 macOS 10.15 及更高 |
| [2] | 官方教程 2. Using the Python Interpreter | 解释器通常安装为 python3.14;交互模式的主提示符 >>> 与续行提示符 ...;退出方式(Unix 上 Control-D、Windows 上 Control-Z,或 quit()) |
| [3] | 官方教程总览 | 官方定位原话 "an easy to learn, powerful programming language" 与 elegant syntax / dynamic typing / interpreted nature;官方教程面向"会编程但不熟 Python 的人"这句提醒 |
| [4] | 官方 Installing Python Modules | 官方推荐 python -m pip install SomePackage;POSIX 系统上建议用带版本号的 python3 -m pip 以保证装到对应解释器;venv 是标准库自带的虚拟环境工具 |
| [5] | 官方 5. Using Python on macOS | macOS 自带的 /usr/bin/python3 由 Apple 提供、通常较旧且不完整,不要修改或删除;与 python.org 安装的版本可以共存 |
| [6] | 官方 json 模块文档 | JSON 与 Python 字典/列表的对应关系;json.loads / json.dumps 的用法 |
| [7] | 官方 venv 文档 | python -m venv 创建环境;POSIX bash/zsh 激活命令为 source <环境>/bin/activate,Windows 为 Scripts\activate.bat / Activate.ps1;库装进隔离的 site-packages;官方建议保留一份 requirements.txt 以便还原环境 |
| [8] | PEP 3120 – Using UTF-8 as the default source encoding | Python 3 源码默认编码为 UTF-8,因此源码里那句 coding: utf-8 声明一般不需要写 |
| [9] | 官方教程 15. Floating-Point Arithmetic: Issues and Limitations | 十进制小数无法用二进制精确表示导致浮点误差(0.1 + 0.2 那类现象),这是所有使用浮点数的语言共有的问题 |
| [10] | 官方 csv 模块文档 / pathlib 文档 | csv.DictReader 把每一行读成字典;pathlib.Path.read_text / write_text 的 encoding 参数用法 |
本文校对于 Python @ 3.14.7(2026-09-13 可访问的官方文档状态)。其中基础语法、数据结构、函数、异常处理、文件读写自 Python 3 起长期稳定,你本地装的是别的 3.x 版本,结果也基本一致;版本号、下载页的大按钮、安装器细节会变化,应以官网当前状态为准。第三方库(requests / pandas 等)本文只作为"往哪走"的路线提及,安装与用法请以各库当前官方文档为准,本文不背书任何具体版本。
这几个链接建议收藏
| 链接 | 是什么 | 什么时候打开它 |
|---|---|---|
| docs.python.org/zh-cn/3/tutorial/ | 官方教程的简体中文版 | 学完本文后顺着它系统过一遍 |
| docs.python.org/zh-cn/3/library/ | 标准库文档(中文) | 写代码卡壳时先查"有没有现成的",用 Ctrl+F 搜英文关键词 |
| python.org/downloads | 官方下载页 | 升级、重装都来这,认准页面上的大按钮 |
| pypi.org | PyPI,第三方库的官方仓库 | 装库之前来这查准确的库名和用法 |