Python runs your code one line at a time. Each line is a statement 语句. A program 程序 is just a list of statements that run from top to bottom.
The print() function shows text on the screen. This is called output 输出. Text inside quotes is a string 字符串.
print("Hello, world!")
print("I am learning Python")
Each print() starts a new line.
Quotes can be "double" or 'single' — both make a string.
A program does nothing until you run it.
Source code runs through the interpreter to produce output
Vocabulary
English
Chinese
Pinyin
statement
语句
yǔ jù
program
程序
chéng xù
output
输出
shū chū
string
字符串
zì fú chuàn
1.2
Comments & code style
A comment 注释 starts with #. Python ignores everything after the # on that line. Comments explain your code to people; they do not change what the code does.
# This line is a note for humans
print("Hi") # you can also comment at the end of a line
Good style makes code easy to read:
Use clear names that say what a value means.
Put one statement on each line.
Do not add spaces at the start of a normal line. In Python, spacing at the start (indentation 缩进) has a special meaning, so a wrong space gives an error 错误.
Vocabulary
English
Chinese
Pinyin
comment
注释
zhù shì
indentation
缩进
suō jìn
error
错误
cuò wù
1.3
Input, process, output
Many programs follow a simple plan: input 输入 → process → output. You get some data, do something with it, then show a result.
The input() function reads text that the user types. It always gives back a string.
name = input("What is your name? ")
print("Hello, " + name)
input() waits for the user to type and press Enter.
Store the typed text in a variable 变量 so you can use it later.
Because input() returns a string, change it with int(...) first if you need a number.
Common mistakes
Forgetting the quotes: print(Hello) looks for a variable named Hello and raises a NameError. Text needs quotes: print("Hello").
A stray space at the start of a line: Python reads indentation as structure, so it raises an IndentationError.
Assuming input() returns a number. It always returns a string, so wrap it in int(...) before doing any maths.
A variable 变量 is a name for a value 值. You make one with =, which is called assignment 赋值. The name goes on the left; the value goes on the right.
age = 17
name = "Mei"
price = 9.99
print(age, name, price)
Now age holds 17. Use the name anywhere you need the value, and change it later:
age = 17
age = age + 1 # age is now 18
print(age)
Each variable name points to a value in memory
The = sign does not mean "equal". It means "store the right side under the left name".
To test if two values are equal, use == (see below).
Vocabulary
English
Chinese
Pinyin
variable
变量
biàn liàng
value
值
zhí
assignment
赋值
fù zhí
2.2
Numbers: int & float
Python has two main number types. An integer 整数 (int) is a whole number like 17. A float 浮点数 (float) has a decimal point like 9.99.
These operators 运算符 work on numbers:
Operator
Meaning
Example
Result
+
add
3 + 2
5
-
subtract
3 - 2
1
*
multiply
3 * 2
6
/
divide (always float)
7 / 2
3.5
//
integer divide
7 // 2
3
%
remainder (modulo)
7 % 2
1
**
power
2 ** 3
8
/ always gives a float, so 4 / 2 is 2.0.
// and % go together: 17 // 5 is 3, and 17 % 5 is 2.
Vocabulary
English
Chinese
Pinyin
integer
整数
zhěng shù
float
浮点数
fú diǎn shù
operator
运算符
yùn suàn fú
2.3
Expressions & type conversion
An expression 表达式 is anything that has a value, like 3 + 4 * 2. Python uses normal maths order (* and / before + and -); add brackets to make the order clear.
input() gives a string, so convert it before doing maths. Changing a value from one type to another is type conversion 类型转换:
age = int("17") # text "17" -> number 17
price = float("9.99") # text -> 9.99
label = str(17) # number -> text "17"
print(age, price, label)
int("abc") fails, so only convert text that looks like a number.
Mixing types fails too: "age: " + 17 is an error; write "age: " + str(17).
Vocabulary
English
Chinese
Pinyin
expression
表达式
biǎo dá shì
type conversion
类型转换
lèi xíng zhuǎn huàn
2.4
Booleans & comparison
A Boolean 布尔值 is one of just two values: True or False. A comparison 比较 gives back a Boolean.
grid = [[1, 2], [3, 4]]
for row in grid:
for value in row:
print(value, end=" ")
print() # 1 2 3 4
Vocabulary
English
Chinese
Pinyin
2-D list
二维列表
èr wéi liè biǎo
grid
网格
wǎng gé
nested loop
嵌套循环
qiàn tào xún huán
6.4
List comprehensions
A list comprehension 列表推导式 builds a new list in one line: [expression for item in sequence].
squares = [x * x for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
Add if to keep only some items.
evens = [n for n in range(10) if n % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
Vocabulary
English
Chinese
Pinyin
list comprehension
列表推导式
liè biǎo tuī dǎo shì
6.5
Tuples & sets
A tuple 元组 is a fixed sequence in round brackets. It cannot be changed after it is made — use one for values that belong together, and unpack 解包 it into names.
point = (3, 4)
x, y = point # unpacking
print(x, y) # 3 4
A function that needs to hand back two results returns a tuple:
Assign to a key to add it, or to change an existing one.
student = {"name": "Mei"}
student["score"] = 88 # add a new key
student["score"] = 90 # update the value
print(student) # {'name': 'Mei', 'score': 90}
Check and loop
Use in to test for a key. Loop over the keys, or over .items() to get both key and value.
student = {"name": "Mei", "score": 90}
print("score" in student) # True
for key, value in student.items():
print(key, "=", value)
# name = Mei
# score = 90
.get(key, default) returns a default 默认值 when the key is missing — no error.
Code can fail in three ways. A syntax error 语法错误 breaks Python's rules, so it never runs. A runtime error 运行时错误 happens while running, like dividing by zero. A logic error 逻辑错误 runs but gives the wrong answer.
# A runtime error, caught so this block still finishes:
try:
print(10 / 0)
except ZeroDivisionError:
print("cannot divide by zero")
# cannot divide by zero
Python prints a traceback 回溯 showing where it failed. Read it from the bottom up.
Common Python errors: Syntax, Name, Type, Index
Vocabulary
English
Chinese
Pinyin
syntax error
语法错误
yǔ fǎ cuò wù
runtime error
运行时错误
yùn xíng shí cuò wù
logic error
逻辑错误
luó jí cuò wù
traceback
回溯
huí sù
9.2
try / except / raise
Wrap risky code in try. If it fails, except catches the exception 异常 and handles 处理 it, instead of crashing.
Catch a specific type (ValueError, ZeroDivisionError, …).
raise makes your own error on purpose.
def set_age(age):
if age < 0:
raise ValueError("age cannot be negative")
return age
try:
set_age(-1)
except ValueError as err:
print("error:", err)
# error: age cannot be negative
Vocabulary
English
Chinese
Pinyin
exception
异常
yì cháng
handle
处理
chǔ lǐ
9.3
Testing & robustness
A test 测试 checks that code gives the right answer. Try normal cases and edge cases 边界情形 — empty input, zero, very large values.
A text file 文本文件 stores text on disk. Open it with open(name, mode) where mode 模式 says read or write. Always use with, which closes the file for you.
Writing
Mode "w" writes a new file and erases any old one.
with open("notes.txt", "w") as f:
f.write("first line\n")
f.write("second line\n")
print("saved") # saved
Reading
Mode "r" (the default) reads. .read() returns the whole file as one string.
with open("notes.txt", "w") as f:
f.write("hello\nworld\n")
with open("notes.txt") as f:
print(f.read().strip()) # hello / world
Line by line
Loop over the file to get one line at a time. .strip() removes 去除 the newline 换行符 at the end.
with open("data.txt", "w") as f:
f.write("Mei,88\nSam,71\n")
with open("data.txt") as f:
for line in f:
name, score = line.strip().split(",")
print(name, "scored", score)
# Mei scored 88
# Sam scored 71
Appending
Mode "a" appends 追加 — it adds to the end without erasing.
with open("log.txt", "w") as f:
f.write("line 1\n")
with open("log.txt", "a") as f:
f.write("line 2\n")
with open("log.txt") as f:
print(f.read().strip()) # line 1 / line 2
Mode
Meaning
"r"
read (default)
"w"
write (erases first)
"a"
append (add to the end)
Common mistakes
Always close a file, or use with open(...) as f: which closes it for you.
read() gives the whole file as one string, and each line still ends with \n.
Opening with "w" erases the file first; use "a" to add to the end.
An algorithm 算法 is a clear list of steps that solves a problem. Decomposition 分解 means breaking a big problem into smaller parts you can solve one at a time.
# Algorithm: find the largest number in a list
def largest(nums):
best = nums[0]
for n in nums:
if n > best:
best = n
return best
print(largest([3, 9, 2, 7])) # 9
Abstraction 抽象 means ignoring detail: you use largest(...) without re-reading how it works.
Vocabulary
English
Chinese
Pinyin
algorithm
算法
suàn fǎ
decomposition
分解
fēn jiě
abstraction
抽象
chōu xiàng
11.2
Pseudocode & flowcharts
Pseudocode 伪代码 is plain, structured English for an algorithm, written before the real code. It is not run.
SET best TO first number
FOR each number n
IF n > best THEN
SET best TO n
OUTPUT best
A flowchart 流程图 draws the same plan: a box for each step, a diamond for each decision 判断, and arrows for the order.
Vocabulary
English
Chinese
Pinyin
pseudocode
伪代码
wěi dài mǎ
flowchart
流程图
liú chéng tú
decision
判断
pàn duàn
11.3
Recursion & the call stack
Recursion 递归 is when a function calls itself. It needs a base case 基准情形 (a simple input that returns at once) and a recursive case 递归情形 (it calls itself on a smaller input).
The call stack for factorial(3): each call waits, then returns in reverse order
def fact(n):
return 1 if n <= 1 else n * fact(n - 1)
print(fact(5)) # 120
Each paused call sits on the call stack 调用栈 until the call above it returns.
Common mistakes
Recursion needs a base case, or it calls itself forever and crashes the call stack.
Pseudocode is for planning — it need not run, but every step must be unambiguous.
Break a big problem into small named steps before you write any code.
An abstract data type 抽象数据类型 (ADT) describes some data plus the operations on it, separate from how it is built. You use it through its operations, not through its inner storage.
# A stack ADT, built on a list
s = []
s.append(1) # add
s.append(2)
print(s.pop()) # 2 (remove the most recent)
Vocabulary
English
Chinese
Pinyin
abstract data type
抽象数据类型
chōu xiàng shù jù lèi xíng
12.2
Stacks
A stack 栈 is last-in, first-out (LIFO 后进先出). You push 压入 onto the top and pop 弹出 from the top.
A stack removes from the top (LIFO); a queue removes from the front (FIFO)
stack = []
stack.append("a")
stack.append("b")
print(stack.pop()) # b
print(stack.pop()) # a
Vocabulary
English
Chinese
Pinyin
stack
栈
zhàn
LIFO
后进先出
hòu jìn xiān chū
push
压入
yā rù
pop
弹出
dàn chū
12.3
Queues
A queue 队列 is first-in, first-out (FIFO 先进先出). You enqueue 入队 at the back and dequeue 出队 from the front.
queue = []
queue.append("a") # enqueue
queue.append("b")
print(queue.pop(0)) # a (dequeue the front)
print(queue.pop(0)) # b
Vocabulary
English
Chinese
Pinyin
queue
队列
duì liè
FIFO
先进先出
xiān jìn xiān chū
enqueue
入队
rù duì
dequeue
出队
chū duì
12.4
Linked lists
A linked list 链表 is a chain of nodes 节点. Each node holds data and a pointer 指针 to the next node; the last points to None.
A linked list: each node holds data and a pointer to the next node, ending at None
n3 = {"data": 3, "next": None}
n2 = {"data": 2, "next": n3}
n1 = {"data": 1, "next": n2}
node = n1
while node is not None: # traverse to the end
print(node["data"])
node = node["next"]
# 1 2 3
Vocabulary
English
Chinese
Pinyin
linked list
链表
liàn biǎo
node
节点
jié diǎn
pointer
指针
zhǐ zhēn
12.5
Hash tables
A hash table 哈希表 maps a key to a slot with a hash function 哈希函数. Two keys can land in the same slot — a collision 冲突. Python's dict is a hash table, so lookup is fast.
A hash function maps each key to a slot; two keys can collide in one slot
A search 查找 finds where a value is. Linear search 线性查找 checks each item in turn, so it works on any list.
def linear_search(items, target):
for i in range(len(items)):
if items[i] == target:
return i
return -1 # not found
print(linear_search([4, 8, 2, 9], 2)) # 2
Binary search 二分查找 is much faster but needs a sorted list. It halves the range each step.
def binary_search(items, target):
lo, hi = 0, len(items) - 1
while lo <= hi:
mid = (lo + hi) // 2
if items[mid] == target:
return mid
elif items[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
print(binary_search([1, 3, 5, 7, 9], 7)) # 3
Binary search halves the range each step — O(log n) on a sorted list
Vocabulary
English
Chinese
Pinyin
search
查找
chá zhǎo
linear search
线性查找
xiàn xìng chá zhǎo
binary search
二分查找
èr fēn chá zhǎo
13.2
Sorting (bubble & insertion)
To sort 排序 is to put items in order. Bubble sort 冒泡排序 repeatedly swaps 交换 neighbours that are in the wrong order.
def bubble_sort(a):
a = a[:] # work on a copy
for i in range(len(a)):
for j in range(len(a) - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
return a
print(bubble_sort([5, 2, 4, 1])) # [1, 2, 4, 5]
Insertion sort 插入排序 builds a sorted part one item at a time, sliding each new item back into its place:
def insertion_sort(a):
a = a[:] # work on a copy
for i in range(1, len(a)):
key = a[i]
j = i - 1
while j >= 0 and a[j] > key: # shift bigger values right
a[j + 1] = a[j]
j -= 1
a[j + 1] = key # drop key into the gap
return a
print(insertion_sort([5, 2, 4, 1])) # [1, 2, 4, 5]
In real code, use Python's built-in sorted():
print(sorted([5, 2, 4, 1])) # [1, 2, 4, 5]
Vocabulary
English
Chinese
Pinyin
sort
排序
pái xù
bubble sort
冒泡排序
mào pào pái xù
swap
交换
jiāo huàn
insertion sort
插入排序
chā rù pái xù
13.3
Algorithmic efficiency
Efficiency 效率 asks how the work grows as the input grows. We describe it with Big-O 大O记号.
How the number of steps grows with input size for common complexities
Big-O
Name
Example
$O(1)$
constant
look up a dict key
$O(\log n)$
logarithmic
binary search
$O(n)$
linear
linear search
$O(n^2)$
quadratic
bubble sort
def steps(n): # how many steps a linear scan takes
count = 0
for i in range(n):
count = count + 1
return count
print(steps(100)) # 100 -> O(n)
Vocabulary
English
Chinese
Pinyin
efficiency
效率
xiào lǜ
Big-O
大O记号
dà O jì hào
13.4
Randomness & simulation
The random module makes random numbers. Use a seed 种子 to make results repeatable. A simulation 模拟 runs many random trials to estimate an answer.
import random
random.seed(0)
rolls = [random.randint(1, 6) for _ in range(1000)]
print(rolls.count(6)) # about 1/6 of 1000
Common mistakes
Binary search only works on a sorted list.
Big-O tells you how the time GROWS, not the exact time; an O(n²) method beats O(n) only for tiny inputs.
Bubble sort is O(n²) — fine for learning, but slow on large lists.
A class 类 is a blueprint. An object 对象 is one thing built from it (an instance 实例). __init__ is the constructor 构造方法 that sets up each object; self is the object itself.
class Dog:
def __init__(self, name):
self.name = name # an attribute
def speak(self):
return self.name + " says woof"
d = Dog("Rex")
print(d.speak()) # Rex says woof
name is an attribute 属性 (data on the object); speak is a method 方法 (an action).
Add __str__ to control what print(obj) shows:
class Dog:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Dog named {self.name}"
print(Dog("Rex")) # Dog named Rex
A class is a blueprint; calling it creates an object
Vocabulary
English
Chinese
Pinyin
class
类
lèi
object
对象
duì xiàng
instance
实例
shí lì
constructor
构造方法
gòu zào fāng fǎ
attribute
属性
shǔ xìng
method
方法
fāng fǎ
14.2
Inheritance, encapsulation & polymorphism
Inheritance 继承 lets a subclass 子类 reuse a superclass 父类. Use super() to call the parent; override 重写 a method to change it.
class Animal:
def speak(self):
return "some sound"
class Cat(Animal):
def speak(self): # override
return "meow"
print(Cat().speak()) # meow
Encapsulation 封装 hides data behind methods; a leading underscore marks it private 私有.
class Account:
def __init__(self):
self._balance = 0 # private
def deposit(self, n):
self._balance += n
def balance(self):
return self._balance
a = Account()
a.deposit(50)
print(a.balance()) # 50
Polymorphism 多态 means one name, many behaviours — the right speak runs for each object.
class Cat:
def speak(self):
return "meow"
class Cow:
def speak(self):
return "moo"
for animal in [Cat(), Cow()]:
print(animal.speak()) # meow, then moo
Vocabulary
English
Chinese
Pinyin
inheritance
继承
jì chéng
subclass
子类
zi lèi
superclass
父类
fù lèi
override
重写
zhòng xiě
encapsulation
封装
fēng zhuāng
private
私有
sī yǒu
polymorphism
多态
duō tài
14.3
Programming paradigms
A paradigm 范式 is a style of writing programs. Procedural 过程式 code is a sequence of steps and functions. Object-oriented 面向对象 code groups data and methods into objects. Declarative 声明式 code says what you want, not how (a list comprehension or SQL).
def total(nums): # procedural
t = 0
for n in nums:
t += n
return t
print(total([1, 2, 3])) # 6
print(sum([1, 2, 3])) # 6 (declarative: same result)
Common mistakes
Every method needs self as its first parameter.
__init__ sets up a new object and runs automatically when you create one.
Two objects of the same class have separate attributes; changing one does not change the other.
A bit 比特 is a single 0 or 1. Binary 二进制 is the base-2 number system: each place is worth twice the one to its right (1, 2, 4, 8, …). Denary 十进制 (base-10) is our normal numbers.
Compression 压缩 makes data smaller. Lossless 无损 compression keeps every bit, so you rebuild the original exactly. Lossy 有损 compression throws away detail — smaller but not exact — and is used for photos and music.
Run-length encoding 游程编码 is a simple lossless method: store a run 游程 (a repeat) as a count plus the value.
def rle(text):
out = ""
i = 0
while i < len(text):
run = 1
while i + run < len(text) and text[i + run] == text[i]:
run += 1
out += str(run) + text[i]
i += run
return out
print(rle("AAAABBBCCD")) # 4A3B2C1D
Common mistakes
n bits store 2**n different values, from 0 up to 2**n - 1.
Lossy compression throws away detail and cannot be undone; lossless can be reversed exactly.
Computing 计算 means solving problems with computers: input, process, output. Good software is built in a design cycle 设计循环 — plan, write, test, improve — repeated many times.
Break a problem down, build a small part, test it, then add more.
Programmers work in teams and reuse each other's code.
Vocabulary
English
Chinese
Pinyin
computing
计算
jì suàn
design cycle
设计循环
shè jì xún huán
16.2
The Internet
The Internet 互联网 is a network 网络 of networks. Data is split into packets 数据包 that travel separately and are put back together at the other end. Shared rules called protocols 协议 (such as TCP/IP) make this work. If one path breaks, packets take another route — this is redundancy 冗余, which gives fault tolerance 容错.
A map of the Internet: each line is a path between two networks
Layer
Job
HTTP
request and send web pages
TCP
reliable delivery, in order
IP
addressing and routing
Vocabulary
English
Chinese
Pinyin
Internet
互联网
hù lián wǎng
network
网络
wǎng luò
packet
数据包
shù jù bāo
protocol
协议
xié yì
redundancy
冗余
rǒng yú
fault tolerance
容错
róng cuò
16.3
Parallel & distributed computing
Sequential 顺序 code does one step at a time. Parallel 并行 computing does several steps at once on many cores 核心, which can give a speedup 加速. Distributed 分布式 computing spreads the work across many computers, such as a cloud.
Not everything can run in parallel: some steps must wait for an earlier result.
Vocabulary
English
Chinese
Pinyin
sequential
顺序
shùn xù
parallel
并行
bìng xíng
core
核心
hé xīn
speedup
加速
jiā sù
distributed
分布式
fēn bù shì
16.4
Impact of computing
Computing brings both benefits and harms. The digital divide 数字鸿沟 means not everyone has equal access to it. Software can carry bias 偏见 from the data it learns from. Respect intellectual property 知识产权 (licences), and protect people's personal data 个人数据 and privacy 隐私.
Common mistakes
The Internet and the World Wide Web are not the same: the Web is one service that runs on top of the Internet.
More processor cores help only if the work can be split into parts that run at the same time.
A mini-project 小项目 combines earlier ideas: data in a list, a function with selection inside a loop, and printed output. This is also the shape of the AP Create Performance Task.
def count_passes(marks, pass_mark=60):
passes = 0
for m in marks: # iteration
if m >= pass_mark: # selection
passes += 1
return passes
print(count_passes([88, 50, 95, 60])) # 3
Project: filter to a new list
def merit(marks):
return [m for m in marks if m >= 80]
print(merit([88, 71, 95, 60])) # [88, 95]
The AP Create Task wants a list, a parameterised procedure 过程 that uses selection 选择 and iteration 迭代, and some input/output. Each project above is exactly that shape — build small pieces, then join them.
Common mistakes
Build in small steps and test each part before moving on — do not write it all at once.
Read the whole task first, then plan the input → process → output before you code.