从第一行 print 开始,
把 Python 学到能自己写小工具
这门课假设你完全没写过代码。每节的核心代码不是一次性丢给你,而是一行一行“长”出来的——左边多一行,右边立刻说明它在干什么、写错会报什么错。写完直接运行,看见真实输出才算真懂。
跟着写,不是照着抄
点「写下一行」,代码逐步出现。每一行都告诉你:它在做什么、为什么放在这里、漏了会怎样。
写完立刻能跑
不需要装 Python。浏览器里就是真的解释器,点一下就能看到输出和报错。
提交就知道对不对
每节末尾有编程题,系统会真的运行你的代码,结果不对会并排显示「要求」和「你的输出」。
闯关串联知识点
12 关由易到难,过了才解锁下一关。学过的东西不复习会忘,闯关就是用来逼自己回忆的。
一节怎么学
- 读 — 先看讲解,弄明白“为什么需要它”
- 写 — 点「写下一行」,把代码跟着敲出来
- 跑 — 点「运行整段」,对照输出和预期
- 练 — 做节尾编程题,再点「标记完成」
纯看课程不需要任何配置;想跑代码需要联网(首次加载约 10 MB)。写代码的工具在左侧「工具箱」。
工具箱:自己写、存文件、看它怎么跑
四个工具:左边随便写代码并运行;「文件工具」在虚拟磁盘里存取文件;「挑错」帮你找出错误代码错在哪、怎么改;「执行追踪」逐行回放,看见每一行执行时变量变成了什么。
点「运行 ▶」执行左边代码,输出会出现在这里。
还没有文件。写一个试试,比如 notes.txt。
open() 看到的是同一个目录(根目录 /)。刷新页面就没了,要长期保存请下载到本机。贴代码 → 点「检查」,会告诉你错在第几行、为什么错、怎么改。
点「开始追踪」,这里会逐行高亮执行过程。
| 变量 | 当前值 |
|---|---|
| 暂无 | |
AI 小助手
学的时候卡住,直接把问题丢过来。它按「零基础能听懂」的方式回答,给可运行的例子,但不会替你写完整作业。
可以这样问:
提示:本站只使用智谱 GLM。在线版已内置,无需填 Key;本地版填自己的智谱 Key 即可。
启动.bat 起一个本地代理(自动带上 Key),再从 http://127.0.0.1:8787 打开本页。第一个程序:让电脑说句话
本节目标:逐行写出第一段 Python 代码,搞清 print、引号、注释各起什么作用。
下面这个「跟着写」区域,每次点「写下一行」,代码就多一行,右边同时告诉你这行在干什么。不着急一次看完,跟着点一遍最快。
(启用脚本后,这里会变成逐行演示)
把这段代码读懂
print是名字,必须小写;Print、PRINT都不认。- 括号和引号必须成对出现,缺一个就是
SyntaxError。 - 一行写一条指令,不需要分号结尾。
“ ” 或中文括号;② 把 print 打成 Print;③ 漏了右括号。看到 SyntaxError,先检查这三样。下面哪一行能正确输出 Hi?
创建变量 name,存入文字「爱丽丝」,然后把它打印出来。
变量与数据类型:给数据起名字
本节目标:一行一行看变量怎么被创建、怎么被改,以及 int / float / str / bool 怎么区分。
变量就是贴了标签的盒子。等号不是数学里的「等于」,而是「把右边的值放进左边的名字里」。下面每加一行,都注意右边新出现的那个盒子。
(启用脚本后,这里会变成逐行演示)
四种类型对照
- int 整数:
18、-3、1000 - float 浮点:
1.75、3.14 - str 字符串:
'小明'、'123'(加引号的数字也是字符串) - bool 布尔:
True/False
user_name、total_price。type('18') 的结果是什么?
填空:把整数 7 存进变量 n。
把整数 7 存进变量 n,再让 n 加上 3(结果写回 n),最后打印 n。
字符串:把文字拼起来、拆开来
本节目标:搞清楚为什么有 + 还要用 f-string,以及下标和切片是怎么数位置的。
先看最笨的拼接方式,再看它踩了什么坑——这样你才会明白 f-string 为什么存在。
(启用脚本后,这里会变成逐行演示)
方法不是「改」,而是「返回新的」
upper()、strip()、replace() 都不会改动原字符串,而是返回一个新字符串。必须用变量接住,否则结果直接丢掉。
s = ' hi '
s.strip() # 第 2 行:结果被丢掉,s 没变
print(f'[{s}]')
s = s.strip() # 第 5 行:把新值接住,s 才真的变了
print(f'[{s}]')
IndexError。这两者的差别很关键。'Python'[1:4] 的结果是?
定义 name = '小明'、age = 18,用 f-string 打印出:我叫小明,今年18岁
输入与类型转换:程序第一次听你说话
本节目标:亲眼看 input 拿到的到底是什么类型,以及 int() 为什么必须存在。
这一步开始代码会「停下来等你」。运行后浏览器会弹输入框——那正是 input() 在工作。
(启用脚本后,这里会变成逐行演示)
转换失败会怎样
# 第 2 行:'abc' 不是数字,int() 转不了
try:
print(int('abc'))
except ValueError as e:
print('转换失败:', e)
# 但能转的一定要转
print(int('18') + 1)
print(float('3.14') * 2)
int('18') → 18,float('3.14') → 3.14,str(99) → '99'。用户输入 18 后执行 a = input(),此时 a + 1 会怎样?
把字符串 '3.5' 转成数字,乘以 2 后打印结果。
运算符与条件:让程序自己做判断
本节目标:看清 if / elif / else 三兄弟的缩进结构,理解「从上往下、命中即止」。
条件语句是 Python 里第一次出现缩进的地方。注意每次缩进 4 个空格——它表示「这几行属于上面那个条件」。
(启用脚本后,这里会变成逐行演示)
条件里能写什么
- 比较:
==相等、!=不等、>、<、>=、<= - 逻辑:
and(都真才真)、or(一真就真)、not(取反) - 真值:
0、''、[]、None算假,其他基本算真
if x = 1 直接报 SyntaxError;要写 if x == 1。下面代码会输出什么?
x = 15
if x > 10:
print('A')
if x > 12:
print('B')
else:
print('C')
设 score = 75,用 if / elif / else 判断:90 分及以上打印「优秀」,60 分及以上打印「及格」,否则打印「不及格」。最终只应输出一个词。
循环:让电脑替你重复
本节目标:用「累加器」这个套路理解 for,再理解 while 为什么容易死循环。
先写一个小目标:把 1 到 5 加起来。人一眼能算出 15,但我们要让程序学会这个动作。
(启用脚本后,这里会变成逐行演示)
break 和 continue
for i in range(1, 10):
if i == 5:
break # 到 5 就整体结束,后面的 6~9 不再执行
if i % 2 == 0:
continue # 偶数跳过本轮,直接进入下一轮
print(i)
# 输出 1、3:2 和 4 被 continue 跳过,5 触发 break 结束
上面 break 的例子会输出哪些数字?
用 for 循环算出 1 到 10 之间所有偶数的和,只打印这个和。
列表:一次装一串数据
本节目标:从空列表开始,看清「下标」和「修改」这两件事。
列表的核心只有两个问题:第几个(下标)和能不能改(能)。
(启用脚本后,这里会变成逐行演示)
常用操作速查
append(x)末尾追加 /insert(2, x)指定位置插入remove(x)删第一个等于 x 的 /pop()弹出末尾x in scores判断存在 /scores[1:3]切片for s in scores:直接遍历元素;enumerate(scores)同时拿下标
a = [1, 2, 3] 执行 a.append(4) 后,a 是多少?
先建一个空列表,依次加入 88、92、79,排序后打印第一个元素。
字典与集合:按名字找东西
本节目标:从空字典开始,看清「键」和「值」怎么配对,以及 get 为什么比中括号安全。
列表靠位置找,字典靠名字找。描述「一个对象的多个属性」时,字典比列表清楚得多。
(启用脚本后,这里会变成逐行演示)
集合:只关心「有没有」
nums = [1, 2, 2, 3, 3, 3]
unique = set(nums) # 转成集合,自动去重
print(unique) # 顺序不保证,但一定是 {1, 2, 3}
print(len(unique)) # 3
tags = {'python', '入门'}
print('python' in tags) # 判断存在,比列表快很多
d = {'a': 1},访问 d['b'] 会发生什么?
建一个字典,存两个键:name 的值是「小明」,age 的值是 18。然后打印 name 对应的值。
函数:把一段逻辑打包命名
本节目标:分清 def 定义和调用,彻底搞懂 print 与 return 不是一回事。
函数最容易被误解的地方是:定义 ≠ 执行。写了 def 之后,里面的代码一行都不会跑,直到你调用它。
(启用脚本后,这里会变成逐行演示)
默认参数与关键字参数
def power(base, exp=2): # exp 有默认值,调用时可省略
return base ** exp
print(power(3)) # 3 的 2 次方
print(power(2, 10)) # 2 的 10 次方
print(power(exp=3, base=2)) # 关键字传参,顺序随意
# 作用域:函数里的变量外面看不见
def calc():
temp = 100 # temp 是局部变量
return temp
print(calc())
# print(temp) # 取消注释会报 NameError
greet 只是拿到这个函数对象,写 greet('小明') 才是执行。下面调用后,x 的值是?
def f(n):
n = n * 2
print(n)
x = f(5)
定义函数 add(a, b),返回两个数的和;然后调用 add(3, 5),打印返回值。
文件读写:让数据活过今天
本节目标:看清 with 的作用、w 和 a 的区别、以及为什么必须写 encoding。
文件操作有个前提:开了必须关。with 就是自动帮你关的那层保险。
(启用脚本后,这里会变成逐行演示)
四种模式
'r'只读(默认),文件不存在报FileNotFoundError'w'写入,会清空原内容'a'追加,写在末尾'x'独占创建,文件已存在会报错
encoding='utf-8',很可能抛 UnicodeDecodeError。养成习惯:只要涉及中文,永远显式写 utf-8。要往已有文件末尾添加一行、不破坏原内容,应该用哪个模式?
用 with open 往文件 note.txt 里写入「你好」,再把它读出来打印。
异常处理:看懂报错,别让它崩
本节目标:会读 Traceback,会用 try / except / finally 兜住可预期的错误。
报错不是失败,是 Python 在告诉你哪一行、出了什么类型的问题。先学会读,再学会处理。
(启用脚本后,这里会变成逐行演示)
五个高频报错
SyntaxError语法错:括号、引号、冒号漏了NameError名字没定义过(拼错变量名最常见)TypeError类型不对,比如'1' + 1ValueError类型对但值不对,比如int('abc')IndexError/KeyError下标或键不存在
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(10 / 0)
ZeroDivisionError: division by zero
# 从下往上读:
# 最后一行 = 错误类型 + 原因
# 上面几行 = 出错位置(文件、行号、代码)
print(undefined_var) 会引发哪种错误?
用 try / except 捕获 int('abc') 引发的错误,捕获到就打印「转换失败」。
小项目:把学过的一行行拼起来
本节目标:不看答案,先自己想到「大概要哪几行」,再对照着写一遍猜数字。
写程序不是从第一行往下编,而是先想清楚要哪些零件:一个答案、一个计数器、一个反复询问的循环、三种判断。下面按这个顺序一行行搭。
(启用脚本后,这里会变成逐行演示)
项目二:简易记账本
思路:用一个字典存「分类 → 金额」,循环读入,最后排序输出。先看注释,再运行试试(输入 吃饭 35 这样的一行)。
records = {} # 分类 -> 总金额
count = 0
while True:
line = input('输入『分类 金额』,直接回车结束:')
if line == '': # 空输入 = 结束
break
parts = line.split() # 按空格拆成两部分
if len(parts) != 2:
print('格式不对,要写成:吃饭 35')
continue # 跳过本轮,重新问
category, amount_text = parts
try:
amount = float(amount_text)
except ValueError:
print('金额必须是数字')
continue
# get(键, 0):没有这个分类时当 0 处理,避免 KeyError
records[category] = records.get(category, 0) + amount
count = count + 1
print(f'共记录 {count} 笔')
for name, total in sorted(records.items(), key=lambda kv: kv[1], reverse=True):
print(f'{name}: {total:.2f} 元')
print('合计:', sum(records.values()))
为什么用 get(category, 0)
某个分类可能是第一次出现,此时 records[category] 还不存在,直接取会抛 KeyError。用 get(category, 0) 表示「有就取,没有就当 0」,新分类自然从 0 开始累加。
打印 1 到 5 每个数字的平方,每行一个。也就是依次输出 1、4、9、16、25。
闯关模式:12 关,从易到难
每一关给一个明确要求,写出代码让屏幕输出和要求一致:大小写要对,但空格、空行不计较,前面多打印一句说明也放过。通过即解锁下一关,进度保存在本机。
综合小测
10 道题,覆盖全部章节。做完点「交卷」看分数,错的题会指回对应章节。
1. print("1" + "2") 输出什么?
2. type(3.0) 的结果是?
3. s = "hello",想让结果变成 "HELLO",哪句有效?
4. x = input(),用户输入 5,x * 2 是?
5. 7 // 2 和 7 % 2 分别是?
6. for i in range(3): print(i) 会输出几行?
7. a = [10, 20, 30],a[-1] 是?
8. d = {"a": 1},d.get("b", 0) 返回?
9. 函数体内只写了 print(x),没有 return,调用它的结果是?
10. 读一个可能不存在的中文文本文件,最稳的写法是?