Python 代码速读指南

这是笔者在教舍友期末速通python时想到的极速学习法,顺序和思路与市面上常见的有些差异。本文试图从解释器解释代码的角度教会你python的基础语法和应用。AI参与。

欢迎!这份指南将尝试在最短的时间内教会你读懂 Python 代码,甚至撰写简单的代码。

Python 代码速读指南 (零基础版)欢迎来到编程世界!别怕,读代码就像学一门新的语言,只不过你的交流对象是电脑。这份指南将教你这门语言最核心的语法规则。

我们的秘诀是:揭开"语法糖"的神秘面纱。

什么是"语法糖" (Syntactic Sugar)?

想象一下,你对朋友说"给我来杯咖啡",他立刻就明白了。你不需要说:"请你站起来,走到咖啡机前,拿起杯子,按下'意式浓缩'按钮,等待咖啡流出..."。

"给我来杯咖啡"就是语法糖,它是一种简洁、方便的说法。编程语言里的很多语法也是如此,它们是方便程序员书写的"简写",但电脑在执行时,会把它们翻译成最原始、最基础的一步步指令。

电脑执行代码时,就像一个严格遵循"指令清单"的电脑,一步一步往下走,绝不跳步,除非接到"跳转"指令。

所以,代码的核心本质是给电脑的"指令清单"

学习目标:理解这些"简写"背后,电脑究竟在做什么。这样,你就能读懂任何基础的 Python 代码了。

第一章:电脑如何存储信息?—— 变量与数据类型

电脑的大脑里有很多带标签的空盒子,这就是变量 (Variable) 。它用这些盒子来存放和处理信息。

当你看到这行代码:

age = 18
  • 电脑收到的指令清单

    1. 指令:准备一个叫 age​ 的标签。

    2. 指令:处理 =​ 右边的东西,得到一个数字 18​。

    3. 指令:找一个空盒子,把数字 18​ 放进去,然后贴上 age​ 标签。

从此,指令中提到 age​,电脑就会去这个盒子里找东西。=​ 的意思是"把右边的东西,存入左边标签的盒子"。

盒子的种类:数据类型

电脑很讲究,不同类型的东西要用不同类型的盒子装,这样它才知道该如何处理。

类型名称

Python写法

盒子的样子和用途

例子

整数int

18​,-5​,0

用来装没有小数点的数字,比如苹果的数量、人的年龄。电脑知道这种盒子里的东西可以互相加减乘除。

apple_count = 5

浮点数float

98.5​,3.14

用来装带小数点的数字,比如身高、体重、温度。电脑也知道它们可以做数学运算。

temperature = 36.5

布尔值bool

True​,False

里面只能放两个状态:"开 (True​)" 或 "关 (False​)"。通常是电脑做判断后得到的结果。

is_raining = True

字符串str

"你好"​,'小明'

用来装任何用引号(单引号'​或双引号"​)括起来的文字。电脑知道这些是文本,不能拿来做数学加减。

my_name = "小明"

列表list

[ ]

火车车厢:一个大容器,里面可以按顺序装很多其他盒子(任何类型都可以)。电脑可以随时添加、删除或查看任何一节车厢里的东西。

shopping_list = ["鸡蛋", "牛奶", 3]

第二章:代码的骨架 —— 关键字(电脑指令集)

关键字是给电脑的特殊指令,它们会改变电脑"一步一步往下走"的默认行为,告诉它何时需要跳转、重复或绕道

我们把整个代码看作一个从上到下编号的指令清单。电脑有一个"程序指针",默认情况下,执行完第1行,指针就移到第2行,再移到第3行...

print​ (输出函数)

为了方便讲解,我们预先介绍一个知识点:print​函数。这个函数不是关键字

print("xxx")

电脑读到这行指令后,会在控制台中输出括号中的东西。如果括号中时变量,就输出值。

至于为什么,见下文函数调用。

if​, elif​, else​ (条件跳转指令)

这组指令告诉电脑:"先做个检查,根据结果决定要不要跳过一些指令。"

# --- 指令清单 ---
temperature = 40
if temperature > 30:
    print("太热了!")
    print("30多度了!")
else:
    print("天气不错。")
print("检查完毕。")

电脑的执行过程

  1. 指针在行 1:执行 temperature = 40​。temperature​ 盒子里现在是 40​。指针移到行 2。

  2. 指针在行 2 (​​if) :这是一个检查指令

    • 检查 temperature​ 盒里的 40​ 是否大于 30​。

    • 检查结果为 "是" (True​)。

    • if​ 指令说:"如果结果为'是',继续往下走到行 3;如果为'否',直接跳转到 else if结束之后的地方。"

    • 结果是"是",所以指针正常移到行 3。

  3. 指针在行 3:执行 print("太热了!")​。屏幕上显示"太热了!"。

  4. 指针在行 4:执行 print("30多度了!")​。屏幕上显示"30多度了!"。

  5. 重要! if​ 代码块执行完毕后,有一个隐藏指令:"跳转到整个 if-else结构结束之后的地方"。所以,指针直接跳过行 4 和行 5,来到行 6。

  6. 指针在行 7:执行 print("检查完毕。")​。

如果 temperature 20会怎样?

  1. 指针在行 2 (​​if) :检查 20 > 30​。结果为 "否" (False​)。

  2. if​ 指令说:"结果为'否',立即跳转到 else所在的位置(行 4)。"

  3. 指针直接跳到行 4。行 3 被完全忽略。

  4. 指针在行 4 (​​else) :这是一个标签,表示 if​ 检查为"否"时的入口。指针移到行 5。

  5. 指针在行 5:执行 print("天气不错。")​。

  6. 指针在行 6:执行 print("检查完毕。")​。

那电脑怎么知道if代码块有没有执行完毕呢?

答案是缩进。注意到if​下的内容都有一个缩进吗,每出现一个if​下方就至少有一行缩进,缩进相同的内容就是同一代码块(缩进块)。

例如:

i = 0
j = 1
if i == 0:
    if j == 0:
        print("i和j都是0")
    print("i是0")

第4~7行都在一个代码块中,他们都是第3行if的代码块。

而第3行的print("i和j都是0")​同时在第3行的if​和第4行的if​的代码块中,也就是说只有两个if​都说"是"时才会执行。

所以电脑的执行过程:赋值部分略

  1. 指针在行 3:(​​if) :这是一个检查指令

    • 检查 i​ 盒里的 0​ 是否等于 0​。

    • 检查结果为 "是" (True​)。

    • if​ 指令说:"如果结果为'是',继续往下走到行 4;如果为'否',直接跳转到 if结束之后的地方。"

    • 结果是"是",所以指针正常移到行 4。

  2. 指针在行 4:(​​if) :这是一个检查指令

    • 检查 j​ 盒里的 1​ 是否等于 0​。

    • 结果是"否",所以指针直接跳转到 if​ 结束之后的地方,也就是 行6.

  3. 指针在行 6:执行 print("i是0")​。屏幕上显示"i是0"。

思考,如果把第1行改为i=1会发生什么。

答案:赋值部分略

  1. 指针在行 3:(​​if) :这是一个检查指令

    • 检查 i​ 盒里的 1​ 是否等于 0​。

    • 结果是"否",所以指针直接跳转到 if​ 结束之后的地方,也就是 程序最后

  2. 程序执行完毕

for​, in​ (计数循环指令)

这个指令告诉电脑:"针对一个'火车车厢'(列表),对它的每一节车厢都重复执行一段指令。"

# --- 指令清单 ---
fruits = ["苹果", "香蕉"]
for fruit in fruits:
    print("我喜欢吃" + fruit)
print("吃完了。")

电脑的执行过程

  1. 指针在行 1:执行 fruits = ["苹果", "香蕉"]​。

  2. 指针在行 2 (​​for) :这是一个循环设置指令

    • 电脑拿出 fruits​ 这列火车。

    • 准备一个临时的空盒子,叫 fruit​。

    • 设置一个"车厢指针",指向第一节车厢"苹果"。

    • 循环规则:"只要'车厢指针'没有越过最后一节车厢,就重复执行行 3。每次重复完,就把'车厢指针'移到下一节。"

  3. 第一次循环

    • 检查"车厢指针":指向"苹果",没问题。

    • 执行:把"苹果"放进 fruit​ 盒子里。

    • 指针移到循环内部,即行 3。

    • 指针在行 3:执行 print("我喜欢吃" + fruit)​。打印出"我喜欢吃苹果"。

    • 循环体结束,指针跳回行 2,准备下一次循环。

  4. 第二次循环

    • 在行 2,电脑更新"车厢指针",让它指向下一节车厢"香蕉"。

    • 检查"车厢指针":指向"香蕉",没问题。

    • 执行:把"香蕉"放进 fruit​ 盒子里(覆盖掉原来的"苹果")。

    • 指针再次移到行 3。

    • 指针在行 3:执行 print("我喜欢吃" + fruit)​。打印出"我喜欢吃香蕉"。

    • 循环体结束,指针跳回行 2。

  5. 结束循环

    • 在行 2,电脑更新"车厢指针",发现已经没有下一节车厢了。

    • 循环规则说:"车厢指针越界,循环结束,跳转到整个 for结构之后的地方。"

    • 指针跳过行 3,直接来到行 4。

  6. 指针在行 4:执行 print("吃完了。")​。

while​ (条件循环指令)

这个指令告诉电脑:"只要某个条件一直满足,就重复执行一段指令,别停!"

# --- 指令清单 ---
count = 0
while count < 3:
    print("你好")
    count = count + 1
print("结束。")

电脑的执行过程

  1. 指针在行 1count​ 盒子里放入 0​。指针移到行 2。

  2. 指针在行 2 (​​while) :这是一个循环检查指令

    • 检查 count​ 盒里的 0​ 是否小于 3​。结果为"是"。

    • while​ 指令说:"如果结果为'是',就继续往下执行;如果为'否',立即跳转到 while结构结束之后的地方(行 5)。"

    • 结果是"是",指针正常移到行 3。

  3. 指针在行 3:执行 print("你好")​。

  4. 指针在行 4:执行 count = count + 1​。count​ 盒子里的值变为 1​。

  5. 重要! while​ 代码块结尾有一个隐藏指令:"无条件跳转回 while的检查行(行 2)"。

  6. 指针跳回行 2:再次执行检查。count​ 盒里的 1​ 是否小于 3​?是。指针移到行 3。

  7. ...重复执行行 3 和行 4,count​ 变为 2​。

  8. 指针再次跳回行 2:再次检查。count​ 盒里的 2​ 是否小于 3​?是。指针移到行 3。

  9. ...重复执行行 3 和行 4,count​ 变为 3​。

  10. 指针再次跳回行 2:再次检查。count​ 盒里的 3​ 是否小于 3​?

  11. while​ 指令说:"结果为'否',立即跳转到 while结构结束之后的地方"。

  12. 指针跳过行 3 和行 4,直接来到行 5。

  13. 指针在行 5:执行 print("结束。")​。

def​, return​ (定义与执行"子程序"指令)

def​ 就像是你在指令清单上写下了一套"备用方案"(子程序),但先不执行。return​ 是这个备用方案的出口。

# --- 主指令清单 ---
def say_hello(name):
    greeting = "你好, " + name
    return greeting

message = say_hello("张三")
print(message)

电脑的执行过程

  1. 指针在行 1 (​​def) :这是一个定义指令

    • 电脑看到 def​,知道这只是一个"备用方案"的定义,现在不执行

    • 它记下:"有一个叫 say_hello​ 的备用方案,它需要一个叫 name​ 的输入。它的具体步骤在行 2 和行 3。"

    • 然后,电脑直接跳转到 def结构结束之后的地方,即行 4。

  2. 指针在行 4message = say_hello("张三")​。

    • 电脑看到 say_hello()​,意识到需要启动那个叫 say_hello​ 的备用方案。

    • 暂停当前的主清单,并记住自己停在了行 4。

    • 开始执行备用方案

      • 创建一个临时的 name​ 盒子,把输入"张三"放进去。

      • 执行备用方案的第一步 (行 2)greeting​ 盒子里被放入 "你好, 张三"。

      • 执行备用方案的第二步 (行 3, return)return​ 指令说:"备用方案结束。把 greeting​ 盒子里的东西("你好, 张三")带出去,作为本次任务的结果。"

    • 备用方案执行完毕。电脑销毁所有临时盒子(如name​, greeting​)。

    • 返回主清单行 4:电脑带着结果 "你好, 张三" 回来了。现在行 4 的指令变成了 message = "你好, 张三"​。电脑执行它。

  3. 指针在行 5:执行 print(message)​。

值得说明的是,Python中给我们定义好了很多函数,像是print​等。这些函数被称为内建函数,我们无需定义就能使用。

不止函数可以被这么调用,部分 类(Class) 也可以被这么调用。但本文不涉及类,暂不做过多解释。

第三章:做决定与使用工具

我们已经知道电脑会按照指令清单一步步往下走,并且会根据关键字进行跳转。但 if​ 和 while​ 这种跳转指令的依据是什么呢?这就是本章的第一个重点。

做决定的依据 —— 条件表达式 (Condition Expression)

条件表达式是一句电脑能判断"对"或"错"的话。它的结果永远是两种之一:True​ (真/对) 或 False​ (假/错)。

你可以把它看作电脑在执行 if​ 或 while​ 前,先自问自答的一个问题。

1. 比较问题 (Comparison Operators)

这是最常见的提问方式,用来比较两个盒子里的东西。

操作符

含义

电脑的提问

示例 (age​盒子里是18)

==

等于吗?

"左边的东西和右边的东西相等吗?"

age == 18​->True

!=

不等于吗?

"左边的东西和右边的东西不相等吗?"

age != 20​->True

>

大于吗?

"左边的东西比右边的大吗?"

age > 17​->True

<

小于吗?

"左边的东西比右边的小吗?"

age < 18​->False

>=

大于或等于吗?

"左边的大于或等于右边的吗?"

age >= 18​->True

<=

小于或等于吗?

"左边的小于或等于右边的吗?"

age <= 17​->False

⚠️ 重要提醒:

  • =​ 是赋值指令 ("把东西放进盒子")。

  • ==​ 是提问 ("这两个东西相等吗?")。初学者最容易混淆!

2. 组合问题 (Logical Operators)

有时候,一个问题不够,需要把多个问题组合起来。

操作符

含义

电脑的思考方式

示例

and

并且

"两个问题都必须是True​,最终结果才是True​。"

age > 12 and gender == "男"

or

或者

"只要其中一个问题是True​,最终结果就是True​。"

day == "周六" or day == "周日"

not

不是/取反

"把问题的答案反过来。True​变False​,False​变True​。"

not is_raining

随手可用的公共工具 —— 常用全局函数

这些是 Python 自带的、无需导入就能直接使用的公共工具。

函数

作用

示例与解释

print()

打印/显示:在屏幕上显示括号里的内容。

print("Hello")​-> 在屏幕上显示Hello​。

input()

获取用户输入:显示提示,等待用户输入,并返回文本

name = input("请输入名字: ")

len()

计算长度:计算文本或列表的长度。

len("你好")​-> 结果是2​。

int(),​​str(),​​float()

类型转换:把一个东西从一种格式转换成另一种。

age = int("25")​-> 把文本"25"​变成数字25​。

range()

生成数字序列:常和for​循环搭配使用。

for i in range(3):​-> 依次提供0​,1​,2​。

ord()

获取字符编码:查询一个字符在电脑世界里的"身份证号"。

ord('A')​-> 结果是65​。ord('a')​-> 结果是97​。

chr()

获取编码对应字符:根据"身份证号"找到对应的字符。

chr(65)​-> 结果是'A'​。chr(97)​-> 结果是'a'​。

round()

四舍五入:计算参数四舍五入到整数(或n位小数)的结果。

round(1.6)​-> 结果是2round(1.3632,2)​-> 结果是1.36

盒子的"自带工具" —— 常用方法 (Methods)

除了公共工具,每种类型的盒子(数据类型)还附带了一套自己的专用小工具,我们称之为方法 (method)

使用方法时,格式是 盒子变量.方法名()​,这个 .​ 的意思是"对这个盒子,使用它自带的XX工具"。

1. 文本盒 (​​str) 的自带工具

这些工具专门用来处理文本。

方法

作用

示例

.lower()

把所有字母变成小写

text = "Hello"lower_text = text.lower()​->lower_text​是"hello"

.upper()

把所有字母变成大写

text = "Hello"upper_text = text.upper()​->upper_text​是"HELLO"

.strip()

去掉文本首尾的空格或换行符。

text = " 你好 "clean_text = text.strip()​->clean_text​是"你好"

.replace(旧, 新)

替换文本中的一部分。

text = "我喜欢苹果"new_text = text.replace("苹果", "香蕉")​->new_text​是"我喜欢香蕉"

.split(分隔符)

按指定的分隔符,把一个文本切成一个列表

words = "你好 世界".split(" ")​->words​是["你好", "世界"]

文本 (​​str) 的比较规则

当你看到 if "apple" < "banana":​ 这样的代码时,电脑如何判断大小?

它会逐个比较两个文本中每个字符的"身份证号"(ord()​值)。

  1. 比较第一个字符:'a'​ vs 'b'​。ord('a')​ 是97,ord('b')​ 是98。因为 97 < 98​,所以电脑立刻得出结论 "apple" < "banana"​ 是 True​,后面的字符就不再比较了。

  2. 如果第一个字符相同,就比较第二个,以此类推。

  3. 注意:大写字母的"身份证号"比小写字母小(ord('A')​是65,ord('a')​是97),所以 "Apple"​ < "apple"​。

2. 火车车厢 (​​list) 的自带工具

这些工具专门用来管理一连串的数据。

方法

作用

示例

.append(东西)

在列表的末尾追加一个新东西。

fruits = ["苹果"]fruits.append("香蕉")​->fruits​现在是["苹果", "香蕉"]

.pop()

取出并删除列表末尾的最后一个东西。

fruits = ["苹果", "香蕉"]last_fruit = fruits.pop()​->last_fruit​是"香蕉"​,fruits​变回["苹果"]

.sort()

直接在原地对列表进行排序。

nums = [3, 1, 2]nums.sort()​->nums​本身变成了[1, 2, 3]

.index(东西)

查找某个东西在列表中的位置(从0开始数)。

fruits = ["苹果", "香蕉"]pos = fruits.index("香蕉")​->pos​是1

关于 int float​:数字类型的盒子(int​, float​)很少使用.​方法,它们主要的"工具"是数学运算符(+​, -​, *​, /​)。

第四章:整理与归纳 —— 使用数据容器

我们已经知道,变量是电脑用来存放单个东西的"盒子"。但如果我们要处理一大堆东西,比如一个班所有学生的名字,或者购物清单上的所有商品,一个一个地创建盒子就太麻烦了。

这时,我们就需要容器 (Container) 。容器就像一个大储物柜,里面可以整齐地存放很多小盒子。电脑可以通过 for​ 循环指令,轻松地遍历储物柜里的每一个物品。这些可以被 for​ 循环遍历的容器,我们统称为可迭代对象 (Iterable)

1. 列表 (list​):万能的储物柜

列表是我们最常用、最灵活的储物柜。它有两大特点:

  1. 有序:你放进去的东西会按照你存放的顺序排好。

  2. 可变:你可以随时往里面添加、删除或更换物品。

存取物品:使用索引和切片

想象一个列表就是一个从 0 开始编号的储物柜。

#         编号 0      编号 1     编号 2
fruits = ["apple", "banana", "cherry"]
  • 获取单个物品 (Indexing) : fruits[0]​ 会得到 "apple"​。fruits[-1]​ 会得到 "cherry"​。

  • 修改单个物品: fruits[1] = "orange"​,列表会变成 ["apple", "orange", "cherry"]​。

  • 获取一批物品 (Slicing) : fruits[0:2]​ 会得到 ["apple", "orange"]​ (不包含编号2)。

列表的常用工具 (常用方法)

这些是列表储物柜自带的、用于整理物品的工具。

方法

作用

示例

.append(东西)

在列表的末尾追加一个新东西。

fruits.append("mango")​->fruits​变成["apple", "orange", "cherry", "mango"]

.pop()

取出并删除列表末尾的最后一个东西。

last = fruits.pop()​->last​是"mango"​,fruits​变回["apple", "orange", "cherry"]

.index(东西)

查找某个东西第一次出现的编号。

pos = fruits.index("orange")​->pos​是1

.sort()

直接在原地对列表进行排序(永久改变)。

nums = [3, 1, 2]nums.sort()​->nums​本身变成了[1, 2, 3]

.insert(编号, 东西)

在指定编号位置插入一个东西。

fruits.insert(1, "grape")​->fruits​变成["apple", "grape", "orange", "cherry"]

2. 元组 (tuple​):一次性封装的"真空包"

元组和列表非常像,也是有序的。但它有一个核心区别:不可变。一旦创建,就不能再修改。它就像一个被"真空密封"的包裹,保证内容物不会被更改。

# 创建一个元组,使用小括号 ()
coordinates = (100, 200) 

你可以像列表一样用 coordinates[0]​ 来读取数据,但任何修改操作(如 coordinates[0] = 50​)都会导致电脑报错。

3. 字典 (dict​):带标签的档案柜

列表和元组都靠数字编号来存取东西。但字典不靠编号,而是靠我们自定义的键 (key)值 (value) 的配对来组织数据。

student = {"name": "小明", "age": 18}
  • 存取student["name"]​ 会得到 "小明"​。

  • 修改/添加student["age"] = 19​ 会修改年龄;student["city"] = "北京"​ 会添加一个新的键值对。

关于"无序"的重要说明

你可能会发现,当你打印一个字典时,里面的项目好像是按照你添加的顺序排列的。这是现代 Python 为了效率做的一个内部优化。

但是,你绝对不能依赖这个顺序!

把字典想象成一个图书管理员。他可能为了自己方便,把新来的书都放在架子最右边。但他的工作承诺是:你给他书名(键),他能快速找到书(值)。他没有承诺书在书架上的物理位置是固定的。也许明天他为了整理,会把所有书按大小重新排列。

结论:永远通过键来访问字典,绝不要假设它的第 N 个元素是什么。

字典的常用工具 (常用方法)

方法

作用

示例

.get(键, 默认值)

安全地获取一个键的值。如果键不存在,它不会报错,而是返回你指定的默认值(如果不指定,则返回None​)。

name = student.get("name")​->name​是"小明"score = student.get("score", 0)​->score​是0​,因为"score"键不存在。

.keys()

获取一个包含所有的列表式视图。

all_keys = student.keys()​->all_keys​看起来像['name', 'age', 'city']

.values()

获取一个包含所有的列表式视图。

all_values = student.values()​->all_values​看起来像['小明', 19, '北京']

.items()

获取一个包含所有 (键, 值)对的列表式视图。这在循环中特别有用!

for key, value in student.items(): print(f"{key}: {value}")

4. 集合 (set​):不含重复元素的"魔法袋"

集合是一种非常特殊的容器,它有两大特点:

  1. 无序:和字典一样,你不能依赖它的顺序。

  2. 唯一:它不允许有重复的元素,会自动帮你去重。

# 集合会自动去除重复的 'banana'
unique_fruits = {"apple", "banana", "cherry", "banana"}
# unique_fruits 的内容是 {"apple", "banana", "cherry"}

集合的常用工具 (常用方法)

集合的主要威力在于进行数学上的关系运算。

方法/操作符

作用

示例

.add(东西)

向集合中添加一个元素。

unique_fruits.add("orange")

.remove(东西)

从集合中移除一个元素。如果元素不存在会报错。

unique_fruits.remove("apple")

& ​(交集)

获取两个集合中都存在的元素。

set1 = {1, 2, 3}set2 = {2, 3, 4}set1 & set2​-> 结果是{2, 3}

| ​(并集)

获取两个集合中所有的元素(去重后)。

set1 | set2​-> 结果是{1, 2, 3, 4}

- ​(差集)

获取在第一个集合中,但不在第二个集合中的元素。

set1 - set2​-> 结果是{1}

容器类型

语法

有序性

可变性

访问方式

关键特点

List

[1, "a"]

有序

可变

数字编号[0]

万能,什么都能放,可随时修改

Tuple

(1, "a")

有序

不可变

数字编号[0]

一旦创建,无法修改

Dict

{"k": "v"}

无序

可变

["k"]

键-值配对,靠键快速查找

Set

{1, "a"}

无序

可变

(不支持)

元素唯一,用于去重和关系运算

拓展阅读:更专业的工具箱

当你成为更熟练的程序员后,会发现 Python 还提供了更专业的容器来解决特定问题。现在你不需要学习如何使用它们,但知道它们的存在很有帮助:

  • collections.Counter​:一个特化的字典,专门用来计数。比如 Counter(['a', 'b', 'a'])​ 会直接得到 {'a': 2, 'b': 1}​。

  • collections.deque​:一个"双端队列",它在列表的两头添加和删除元素都非常快。

    • 用它来实现队列 (Queue) (先进先出,像排队买票)非常高效。

    • 用它来实现栈 (Stack) (后进先出,像叠盘子)也非常高效。

第五章:扩展你的工具箱 —— 模块与标准库

想象一下,如果一个工匠需要把所有的工具(锤子、锯子、扳手、电钻、焊枪...)都随时带在身上,那他会寸步难行。编程也是如此。

Python 把不那么基础、但非常有用的功能分门别类地装进了不同的"工具箱"里,这些工具箱就叫做 模块 (Module)

  • 模块 (Module) : 一个包含了预先写好的函数和变量的 Python 文件。它是一个专门解决某一类问题的工具箱。例如,有一个 math​ 模块(数学工具箱),里面有计算平方根、三角函数等工具。

  • 预定义的函数 (Pre-defined Functions) :

    1. 全局函数: 像 print()​, len()​ 这样,是你随身携带、无需任何准备就能使用的基础工具。

    2. 模块内的函数: 像电钻、焊枪这样的专业工具,你必须先去仓库里把对应的工具箱 (import​) 拿出来,才能使用。例如 math.sqrt()​。

  • 标准库 (Standard Library) : 这是 Python 自带的"官方五金店"。当你安装 Python 时,一大批高质量、经过官方认证的模块(工具箱)就已经一起安装好了。你不需要额外下载,只需 import​ 就能使用。我们接下来要讲的 random​ 和 turtle​ 就是标准库里非常有用的两个模块。

第六章:有趣的工具箱 —— random​ 和 turtle​ 模块

使用前,你必须先告诉电脑你要用这个工具箱:import random​ 或 import turtle​。

1. random​ (随机数工具箱)

  • random.seed(a)

    • 作用:设置随机数种子。如果种子 a​ 一样,后续生成的"随机数"序列也完全一样。这在需要"可复现的随机"时很有用。不设置则每次都不同。

  • random.randint(a, b)

    • 作用:生成一个随机整数,范围是 a​ 到 b​ (包括 a​ 和 b​)。

    • 示例dice_roll = random.randint(1, 6)

2. turtle​ (小海龟绘图工具箱)

这是一个绘图工具,你通过指令控制一只"小海龟"在屏幕上移动,留下轨迹。

  • 常见指令

    • turtle.forward(distance)​: 前进。

    • turtle.backward(distance)​: 后退。

    • turtle.left(angle)​: 左转 angle​ 度。

    • turtle.right(angle)​: 右转 angle​ 度。

    • turtle.penup()​: 抬笔,移动不画图。

    • turtle.pendown()​: 落笔,移动画图。

    • turtle.pencolor(color_name)​: 设置画笔颜色,如 "red"​。

    • turtle.done()​: 程序执行完后,保持窗口不关闭。

第七章:实战演练 —— 让我们一起读代码

下面是一段完整的猜数字游戏代码。让我们用"电脑的思考方式"来逐行阅读它。

# 1. 导入工具箱
import random

# 2. 设置游戏
secret_number = random.randint(1, 20)
print("我心里想了一个1到20之间的数字。")

# 3. 开始游戏循环
for i in range(5):
    print("你还有 " + str(5 - i) + " 次机会。")
    guess_str = input("猜猜看: ")
    guess = int(guess_str)

    if guess < secret_number:
        print("太小了!")
    elif guess > secret_number:
        print("太大了!")
    else:
        break  # 猜对了,跳出循环

# 4. 游戏结束
if guess == secret_number:
    print("恭喜你,猜对了!")
else:
    print("很遗憾,你没猜对。我心里想的数字是 " + str(secret_number))

电脑的思考过程

  1. import random​:好的,random​ 工具箱准备就绪。

  2. secret_number = random.randint(1, 20)​:使用 random​ 的 randint​ 工具,在1到20之间选一个数,存入 secret_number​ 盒子。

  3. print(...)​:在屏幕上显示提示文字。

  4. for i in range(5)​:要开始一个5次的循环。range(5)​ 会提供 0, 1, 2, 3, 4​。

    • 第一次循环 (i=0)

      • print(...)​: 显示"你还有 5 次机会。"

      • input(...)​: 等待用户输入。假设用户输入了 10​。

      • guess_str​ 盒子里存入文本 "10"​。

      • guess = int(guess_str)​:把文本 "10"​ 转换成数字 10​,存入 guess​ 盒子。

      • if ... elif ... else​: 电脑进行比较,根据结果打印"太小了!"或"太大了!"。

    • 后续循环:重复上述过程。如果用户猜对,else​ 里的 break​ 指令会让电脑立即终止 for​ 循环,直接跳到循环外面的代码。

  5. if guess == secret_number​:循环结束后,最后再做一次判断,guess​ 盒里的值和 secret_number​ 盒里的值是否相等。

  6. 根据判断结果,打印最终的祝贺或遗憾信息。

  7. 程序结束。

总结

恭喜你!现在你已经掌握了阅读 Python 基础代码的核心技巧。记住,万变不离其宗:

  1. =是赋值,从右到左。

  2. 关键字决定了代码的结构和流程 (判断、循环、定义)。

  3. 函数 ()是在请求执行一个特定的任务。

  4. 从上到下,逐行理解,把自己想象成一台只会一步一步执行指令的笨电脑。

多看、多读、多用这种"电脑视角"去分析代码,你很快就能对 Python 代码了如指掌!