🟢 入门

Python 快速上手

从"装好 python3"到"写一个能处理你自己数据的脚本"——一条不绕路的最短路径。

📅 更新于 2026-09-13

本文校对于 Python @ 3.14.7 · 官方源:docs.python.org/3

3.14.7
本文校对时的当前稳定版
≈10 分钟
跑通你的第一个程序
5
入门只需要五样东西
0
需要的前置编程知识

0030 秒速览:三句话 + 按你的处境挑入口

读完这一篇,你能做到一件事:在终端里敲几行命令,让电脑读一个文件、算一算、把结果存成新文件——而不是只知道"Python 是一门很火的编程语言"。这一篇不教你成为工程师,只教你把脑子里的"要是电脑能替我做这个就好了"变成一段真能跑起来的代码。

🔑 先记住三句话(后面全是细节)

① 能跑比懂原理重要——先照抄跑通,再回头问"为什么",别卡在第一课;② 缩进是语法,报错是向导——每行开头的空格不是排版好看,是 Python 用来判断"这几行是一伙的";报错最后一行通常直接告诉你该改什么;③ 让 AI 帮你写,但你负责看懂——你要学的是"读得懂、跑得动、改得了",不是把键盘敲烂。

按你现在的处境,直接用这个

你现在的状态直接看这里为什么先看它
电脑上还没装 Python03 装好 → 04 最小例子不装好,后面每一节都只能干看
装好了,但不知道敲什么04 最小例子十分钟内你会亲手跑通两个程序
在别处抄了一段代码,跑不起来10 报错调试 → 14 七个坑九成的"跑不起来"是这两处的固定几个原因
想处理自己的 Excel / CSV / 一堆文本11 读写文件 → 12 项目二、三这是零基础最容易出成就感的方向
想让 AI 帮你写,但它给的代码看不懂13 与 AI 搭档 → 05 起的基础语法看懂 AI 的代码靠的是基础语法,不是靠提示词技巧
目的是写网站、做 AI先把 01–08 过一遍这些方向千变万化,底下的语法就这么多
只想快速查一条命令15 速查表那一节的每一段都能直接复制去跑

如果你只有半小时:这样走

1
确认电脑里有没有 Python(1 分钟)

打开"终端",敲 python3 --version。看到 Python 3.x.y 就跳过第 03 节;报 command not found 就去第 03 节装。

2
跑通"你好,世界"(5 分钟)

照着 04 最小例子 的第 1、2 步做。目标不是理解,是亲眼看到屏幕上出现你自己打出来的字。

3
把摄氏度换算器抄一遍(10 分钟)

同一个例子,你会第一次见到"从键盘拿一个数 → 算 → 打印结果"这个最小闭环。

4
跳到第 12 节挑一个项目(15 分钟)

三个项目都是完整可运行的整段代码。跑通一个,你对"Python 能替我干活"就有实感了。

读完你应该能

✅ 具体能做到

① 在自己的 Mac 上装好并用 python3 --version 验证;② 读懂一段 30 行以内的新手向 Python,说出每一行大概在干什么;③ 写一个"读 CSV → 算平均分 → 写报告"的脚本;④ 看到红色报错时知道先看最后一行、再往上找自己的代码行;⑤ 给 AI 提问时把"代码 + 完整报错 + 我要什么"一次说全。

🧭 诚实地说:这篇不负责什么

不教面向对象(class)、不教异步、不教装饰器,也不教怎么部署到服务器。这些等你先能用 Python 解决一个真实的小问题之后再学,顺序反了只会劝退。第 18 节有一条"什么时候该回头补 class"的判断标准。

几个你会反复看到的数字

1991Python 首次发布的年份,作者 Guido van Rossum
3.14.72026 年 8 月 5 日发布的稳定版(本文校对基准)
0 元解释器与标准库免费,Windows / macOS / Linux 都有
约 1~2 周每天一小时,能把这篇的内容练到会用的量级

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 源码)。它自己不会动,需要一个叫解释器的程序来读它。整条链路是这样的:

hello.py
你用英文式语法写的文本
(你自己写的部分)
→
解释器 python3
逐行读懂你的指令
(装 Python 时装的就是它)
→
操作系统
分配内存、真的去执行
→
结果
打印到屏幕 / 写进文件

因为"写一行、跑一行"这件事成立,你起步时可以只用一个入口:交互式模式——直接敲 python3 回车,屏幕上出现 >>>,你打一句它答一句,像聊天。这个 >>> 叫主提示符(primary prompt),是"解释器在等你说话"的记号;多行语句没写完时它会换成 ...,那是续行提示。[2]

它已经在替人做这些事

🤖
AI 与机器学习
PyTorch、TensorFlow 这类主流框架,最常用的语言就是 Python。
📊
网站后端
你每天刷的推荐流背后,有大量 Python 在算"接下来给你看什么"。
🗂️
运维自动化
服务器批量处理日志、定时任务、部署脚本,遍地是 Python。
🧪
科学计算
分析实验数据、画图、跑模型,学术界几乎默认用它。
🐍
系统小工具
很多命令行工具和"胶水脚本"用 Python 写,把别的程序粘起来。
🕷️
网页信息采集
抓网页内容做分析,requests 加 BeautifulSoup 是最经典的组合。

这些方向你现在一个都不用碰。提一句只是让你知道:你学的不是玩具语言,它是 AI、数据、自动化三座大山的共同地基。

新手最容易先卡住的三处

把报错当失败,一看到红字就关窗口
Python 的报错会明确告诉你"哪一行、什么类型、怎么改"。它是向导,不是骂你。第 10 节专门教怎么读它,读完你会发现大部分报错其实在替你干活。
死磕每条语法"为什么这么设计"
入门阶段先记住"这样写能跑、那样写报错",原理等你用得上时再深挖,效率高得多。你不需要理解汽车发动机才能学会开车。
跳过缩进,觉得那是排版问题
这是 Python 和你可能见过的其他语言最大的差别:行首的空格是语法的一部分,用错了程序直接不跑。第 05 节的第 3 小节会把这件事讲透。

02它替你解决哪一类问题:什么时候该用它

很多人第一门语言学 Python,不只是因为它简单,而是因为它从"入门"到"干正事"之间几乎没有断层:今天学的语法,明天就能用来处理你电脑里那张 Excel。

四个具体的理由

🐍
语法接近英语
读到 if score >= 60: print("及格") 你不用查字典就懂。降低的是"会编程"这件事的门槛。
🧰
标准库够用
文件、日期、网络、CSV、JSON 全都"开箱即用"——装 Python 就自带一大箱工具,不急着学框架。
🤖
AI 最会写它
公开的训练语料里 Python 代码量巨大,AI 写的 Python 质量普遍很高。你的门槛正好落在"看得懂、会验证、改得动"。
🚀
干什么都行
脚本自动化、数据分析、网站后端、AI,同一门语言一路用到底,不用反复换语言重学。

和别的选择比,它赢在哪

维度PythonJavaScriptC / 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 步
📖 一个 Mac 特有的坑:系统那个 python3 是谁

官方文档明确提醒: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 是什么

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 打架比没装更难查。
以为还要装"编译器"
不需要。Python 是解释型语言,装好解释器(就是这份安装包里的东西)就能跑。
版本太老,只有 3.8 / 3.9
建议升级。本文示例以 3.11+ 为基准写(用到了 f-string 等新写法),越新越省心。
敲 python 没反应
Mac 上要用 python3。python 这个名字在 Mac 上被刻意保留给旧版本,避免冲突,所以敲它常常什么都不发生。

04最小例子:十分钟跑通你的第一个程序

理论先放一边。这一节跟着做,十分钟内你会亲手写出并跑通两个程序,而且第二个已经是在"算真东西"了。

第 1 步:进交互模式,说一句话

1
进入交互模式

终端里输入 python3 回车。看到 >>> 就表示 Python 在等你发话。

2
敲这一行,回车
print("你好,Python!")

屏幕上立刻出现 你好,Python!。print 就是"把括号里的东西显示到屏幕上",是编程里最经典的第一句话。

3
退出交互模式

输入 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_grade1st_grade 不行——一开头是数字,Python 会以为你在写数字
惯例用小写加下划线分隔单词(这套风格叫 snake_case)user_score、total_priceUserScore 虽然能跑,但 Python 圈子里那是"类"的写法,别人看了会误会
不能用 Python 自己的保留字score、itemsif / for / class 是语法的一部分,编辑器会给你变色警告
📖 名词解释:保留字和 snake_case

保留字是 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。
以为 = 是"等于"
= 是"存入",判断相等要用 ==。这是新手最高频的错误,第 14 节有完整对照。
用中文当变量名
Python 支持,能跑,但不建议。通用代码几乎都用英文,方便别人和 AI 读;你自己写练习时混着用,两周后回看会很痛苦。

06文字、数字,与"能装东西的盒子"

数据在 Python 里有不同类型。类型这个词的意思是"这份数据是什么种类"——它决定了你能不能对它加减、能不能切片、该怎么一个个取出来。先记住四种基础类型和三种容器。

四种基础类型

类型中文叫法例子典型操作 · 什么时候用
int整数42+ - * // % **;计数、人数、次数用它
float小数 / 浮点数3.14同上,但注意精度小坑(第 14 节坑 6);金额别用它
str字符串(一段文本)"hello"+ 拼接、len()、upper()、切片;一切文字都是它
bool布尔值(真 / 假)True / Falseand / 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 取到最后
🚫 下标从 0 开始,从 0 开始,从 0 开始

第一个元素是 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) 转成同一种类型再算。
用 = 判断相等
判断要用 ==。= 是"存入",放在判断里是语法错误。
下标从 1 开始数
Python 一切从 0 数起;切片的结束下标还不包含在内(s[0:3] 取前 3 个,下标是 0、1、2)。
以为 b = a 复制了列表
没有。它只是给同一个列表起了第二个名字,改 b 会连带改 a。要真复制得写 c = a.copy()。第 14 节坑 4 有完整的演示。

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。
默认参数写成可变对象
def f(items=[]): 有坑——这个空列表只创建一次,会被后面的调用反复污染。改成 def f(items=None): 更稳。第 14 节坑 5 有完整演示。

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解析 / 生成 JSONjson.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,也不会打起来。三步:

1
在项目文件夹里创建环境(只做一次)
python3 -m venv .venv

会在当前目录生成一个隐藏的 .venv 文件夹。venv 是 Python 标准库自带的虚拟环境工具,装 Python 就有,不用另外装。[7]

2
"进入"这个环境(每次开新终端都要做)
source .venv/bin/activate

官方文档给出的 POSIX(macOS / Linux)bash、zsh 激活命令就是这个形式:source <环境目录>/bin/activate。执行后命令提示符前面会出现 (.venv),表示你已经在环境里了。Windows 的命令行是 .venv\Scripts\activate.bat,PowerShell 是 .venv\Scripts\Activate.ps1。[7]

3
此刻再装库,它只进这个小房间
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 装到了另一个 Python
症状是"明明装了,import 却说找不到"。始终用 python3 -m pip install 这个前缀,让 pip 跟着你正在用的那个 python 走。
import 报 ModuleNotFoundError
按顺序查三件事:装了吗(python3 -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'
1
先看最后一行

TypeError: can't multiply sequence by non-int of type 'float'——类型错了:你拿一段"文字"去乘一个小数。"sequence"在这里指字符串。八成是在哪里忘了 float() 转换。

2
再往上找 File "...", line N

它告诉你"出问题的是我自己的代码第 3 行"。打开那个文件看那一行,问题九成就出在这里。

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 帮你排错的正确姿势

同一句报错,信息给全和不给全,得到的答案天差地别。这两种问法的对比值得记住:

❌ 这样问,AI 只能猜
我代码报错了,帮我看看:
Traceback (most recent call last):
  File ...
TypeError ...

只贴最后两行,AI 不知道是哪段代码、你想干什么,只能给你"可能是类型问题"这种泛泛的猜测。

✅ 这样问,AI 秒定位
我这段 Python 报错了(新手,只懂基础语法):
[粘贴 temp.py 的完整代码]

运行后报错是:
[粘贴完整红色报错]

请告诉我:1) 哪一行、为什么错;
2) 用最简单写法修好并加中文注释;
3) 怎么验证修好了。

代码 + 完整报错 + 你的水平 + 你要什么,四样给全,AI 能直接给你能跑的版本。

这一节的三个新手坑

写空的 except:
它会把所有错误都吞掉,出问题完全没有提示,等于掩耳盗铃。至少写成 except Exception as e: 并把 e 打印出来。
看到报错就慌
先深呼吸,读最后一行。大部分报错其实是在告诉你"往哪改"。
只贴报错不给上下文
给 AI 排错时,报错和相关代码行一起给,它才判断得准。这也是为什么第 13 节要给你一份提问模板。

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 编码来读"。

🚫 读写中文,记得带上 encoding="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 进去跑。
用 + 拼路径
跨平台会踩分隔符的坑(Mac 用 /,Windows 用 \)。用 Path("a") / "b.csv" 这种写法,让 pathlib 去处理。
以为 open 完必须手动 close
本文这些写法都不用。网上老教程里的 with 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 更容易接手你的代码。

四个习惯

🧹
命名说人话
变量和函数用小写加下划线的英文,别用 a、b、c。读代码的人(包括三个月后的你)会谢谢你。
📐
统一 4 个空格缩进
别 Tab 和空格混用。VS Code 这类编辑器默认会帮你处理,别去关掉它的自动缩进。
🧯
读写外部数据就 try
凡是 input、读文件、网络请求,一律先想"用户乱输入 / 文件不存在 / 断网了"怎么办。
🤝
把 AI 当结对搭档
让它生成你读得懂的代码,每段都要你跑过、看懂、能改。它负责快,你负责把关。

给 AI 的提问模板(直接复制去用)

把下面这段复制给 AI,它就能产出符合你当前水平的代码:

我是 Python 零基础新手,只会变量 / if / for / 函数 / 文件读写这些。
请用最简单、我读得懂的写法帮我写一个程序,功能是:
【一句话描述需求,例如:读取 scores.csv 求每科平均分】

要求:
1. 只依赖标准库,别引入第三方库
2. 用户输入和读文件要 try/except 容错,别让程序崩溃
3. 关键行加中文注释
4. 告诉我运行它要在终端敲什么命令、怎么验证结果

下面是我的报错(如有):【粘贴红色报错】

这份模板有效的道理很简单:它把 AI 最缺的三样信息一次补齐了——你的水平(决定代码复杂度)、约束(不用第三方库、要有容错)、验收方式(怎么跑、怎么验证)。缺了这些,AI 只能给你一份"通用答案"。

交代码之前的 30 秒自检清单

问题检查什么不过关的样子
① 在本地能跑通吗?我在终端 python3 跑过,结果正确"我猜应该能跑"——猜的都不算
② 别人能看懂吗?变量命名清楚、关键处有中文注释满屏 a / b / c,没有一句解释
③ 出意外会崩吗?输入、读文件、网络都用 try 兜住了输个字母就白屏报错
⚠️ 反向提醒:AI 给的长代码别无脑复制

先问它一句"这代码用了哪些我不懂的语法",让它挑出来讲给你听。学 Python 的价值恰恰在于——你看得懂 AI 写的代码,而不是盲信它。看不懂的代码跑通了,那个成果不属于你:下次需求稍变一点,你就只能再问一次。

14新手必踩的七个坑

下面这些坑基本所有人都踩过。先读一遍,真遇到时能少慌很多——因为你会立刻认出"哦,是那个"。

坑 1:判断相等用了一个 =

❌ 报 SyntaxError
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]

⚠️ 所以金额千万别用 float

存金额要么用整数(以"分"为单位,比如 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 的提问模板
💡 学 Python 最常见的放弃点在第 2 周

第 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
布尔 boolTrue / 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 小房间每个项目建一个,装库先进它;别把不同项目的依赖混装在一起
pipPython 官方的包安装工具装库用它;固定写 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常见问题

完全没有编程基础,真的能学会吗?要多久?
能。这篇就是按零起点写的:跑通前 4 节约 1~2 小时,掌握全篇内容约 1~2 周(每天一小时)。别求快,把每个例子亲手跑通就赢了。
为什么终端敲 python 没反应?
Mac 上要用 python3。python 这个名字在 macOS 上被刻意保留,避免和旧的 Python 2 冲突,所以敲它常常什么都不发生。还是找不到就先试 python3.14 --version,再不行重开终端或重装。
该用哪个编辑器写代码?
新手推荐 VS Code(免费),装官方的 "Python" 扩展。它能帮你自动缩进、给语法上色、一键运行。别再用"文本编辑 / 记事本"写长代码——它们不会提醒你缩进错了。
代码块里的 >>> 和 $ 也要一起复制吗?
不要。>>> 表示"Python 的交互模式在等你",$ 表示"这是终端提示符"——都是系统显示的,不是你该输入的内容。复制正文即可。
我要学 Python 2 吗?网上很多老教程都是 2.x。
不学。Python 2 已于 2020 年停止维护。凡是 2020 年以前的教程,语法大概率过时(最明显的是 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 运行吗?
能双击,但脚本常常要"读哪个文件、带什么参数、出错时看报错",这些都要在终端里控制。双击运行一旦出错,窗口会瞬间闪退,你根本看不到红色错误信息;而在终端里它会停住,把事情告诉你。所以养成在终端跑的习惯。
学完这篇该做什么巩固?
顺序建议:① 把第 12 节的三个项目每个都亲手重敲一遍,再改改功能;② 找一个你真想解决的重复劳动(合并文件、统计表格),按第 13 节的模板让 AI 帮你写成脚本;③ 需要时再学 pandas 或 flask。
Python 版本更新快,这篇会不会很快过时?
基础语法从 Python 3 诞生至今几乎没变,这部分可以放心学。会变的是版本号——本文校对时是 3.14.7,你读到的时候可能已经是 3.15 或更高。所以别把"3.14.7"记成知识点,只要知道"用官网当前的大按钮版本"就行。

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 macOSmacOS 自带的 /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 encodingPython 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.orgPyPI,第三方库的官方仓库装库之前来这查准确的库名和用法
⌂