01 · 基础语法(Basics)

📅 预计 60 分钟 | ⭐ = 高频考点 | 📌 中英术语见文末
✍️ 配套练习:本地 python grader.py 01,或网页练习 shengxia.dev/python?module=01


1.1 Python 是什么

一个能"边读边跑"的语言

把 Python 想成一个同声传译:你一句一句说中文,它一句一句翻给电脑听,翻译完立刻执行。所以它叫解释型语言(interpreted)——不需要像 C/Java 那样先整体"编译"(compile)成机器码再运行。你写代码、保存、python 文件.py,结果马上出来,改一行立刻见效。这就是为什么大家用 Python 写脚本、做数据分析——

💡 记忆口诀:解释型 = 同声传译(边说边翻);编译型 = 先翻译成书(编完再跑)。

三大特征(前两个高频出现):

# 这是注释(comment),用 # 开头,Python 直接跳过不执行
print("Hello, Python!")   # 输出语句,自带换行
# 输出: Hello, Python!
  • 动态类型(dynamically typed):变量不用声明类型,类型由"值"决定。今天装整数、明天装字符串,Python 都接受。
  • 缩进即语法(indentation)⭐:用缩进(通常 4 空格)表示"这段代码属于哪一块",不用 C/Java 的 {}。缩进错了,程序直接报错。
  • 运行方式:交互式环境(IDLE、Jupyter)适合一行行试;脚本方式 python 文件名.py 一次性跑完整份。

⚠️ 常见错误

  1. 缩进混用 Tab 和空格:同一块代码里一会儿 Tab 一会儿空格,报 IndentationError。全项目统一 4 空格。
  2. 中文标点:写成 print("hi")(全角括号)或中文引号,报 SyntaxError。只有字符串内容里才能用中文标点。
  3. 漏掉括号print "hi" 是 C 的写法,Python 必须 print("hi")
  4. 运行前忘保存:改完代码没 Ctrl+S 就运行,看到的还是旧结果。

1.2 变量与赋值 ⭐

变量 = 给值贴个名字标签

变量(variable)像给东西贴标签name = "国睿" 就是给字符串 "国睿" 贴上 name 这个标签,以后要它就叫它名字,不用每次都重复写。

name = "国睿"      # 字符串 string
age = 20           # 整数 int
height = 1.75      # 浮点数 float
is_student = True  # 布尔 bool(首字母大写!)
print(name, age, height, is_student)
# 输出: 国睿 20 1.75 True

命名规则 ⭐:

  • 只能由字母、数字、下划线 _ 组成,不能以数字开头2name ❌,name2 ✅。
  • 不能是 Python 关键字:ifforclassdef…(可执行 import keyword; print(keyword.kwlist) 查全表)。
  • 大小写敏感:Namename 是两个不同变量。
  • 约定俗成:小写字母 + 下划线连接,叫 snake_case(蛇形命名),如 user_nametotal_score

变量可以被重新赋值,类型也可以变(动态类型的直接体现):

x = 10
x = "现在变成字符串了"   # 合法!类型从 int 变成 str
print(x)
# 输出: 现在变成字符串了

交换两个变量(考试常考,配套练习 ex06):

a, b = 1, 2
temp = a       # 先把 a 存进中间变量,否则 a 被覆盖后 1 就找不回来了
a = b          # a 变成 2
b = temp       # b 变成原来的 1
print(a, b)
# 输出: 2 1

⚠️ 常见错误

  1. = 当成"等于"if x = 5 是赋值、不是判断,Python 直接报语法错误。判断相等要用 ==
  2. 变量名数字开头1st_name 直接 SyntaxError
  3. 没赋值就使用print(score) 但之前从没写过 score = ...,报 NameError: name 'score' is not defined
  4. 关键字当变量名class = 1for = 2 都会报错。
  5. 忘了中间变量a = b; b = a 是经典错误——第二步的 a 已经是 b 的值,b 永远拿不回原值。

1.3 基本数据类型 ⭐

五个基础类型 + 一个"没有"

类型 英文 例子 说明
整数 int 42-3 任意大小,Python 不会溢出
浮点数 float 3.142.0 带小数
字符串 str "abc"'你好' 单双引号都行
布尔 bool TrueFalse 逻辑判断,首字母大写
空值 None None 表示"啥都没有"

一个隐蔽的坑:True / False 首字母必须大写。写 truefalse 会被当成普通变量名,直接 NameError

查类型用 type()(配套练习 ex11):

print(type(3))        # 输出: <class 'int'>
print(type(3.14))     # 输出: <class 'float'>
print(type("hi"))     # 输出: <class 'str'>
print(type(True))     # 输出: <class 'bool'>
print(type(None))     # 输出: <class 'NoneType'>

想拿到类型的字符串名字type(3).__name__'int'。注意 None 的类型名是 NoneType

⚠️ 常见错误

  1. 布尔首字母小写truefalseNameError
  2. None 不等于 FalseNone 是"没有值",False 是"值为假",两回事。
  3. 浮点不能直接比相等0.1 + 0.2 == 0.3False(实际是 0.30000000000000004)。这是二进制的锅,判分/比较时用容差,别用 ==
  4. True 其实就是 1True + 12,考试偶尔挖这个坑。

1.4 运算符

算术运算符:五兄弟 + 两个好兄弟

算术运算符(arithmetic):+ - * / // % **

print(7 / 2)    # 输出: 3.5   除法,结果一定是 float
print(7 // 2)   # 输出: 3     整除,向下取整
print(7 % 2)    # 输出: 1     取余数
print(2 ** 3)   # 输出: 8     幂运算,2 的 3 次方
print(7 / 2 == 3.5)   # 输出: True

💡 记忆口诀// 是"去尾",% 是"剩下的";//% 永远是兄弟——(a // b) * b + a % b == a 恒成立,可以用来互相验证算没算错。

⚠️ 本讲最大陷阱:// 是"向下取整"不是"向零取整"-7 // 2 不是 -3 而是 -4——Python 往更小的方向取整(配套练习 ex07 会亲自踩一次)。

比较运算符(comparison):== != > < >= <=,结果一定是 bool

逻辑运算符(logical):and(且)、or(或)、not(非)

print(3 > 1 and 4 > 2)   # 输出: True   两边都真才真
print(3 > 1 or 4 < 2)    # 输出: True   一边真就真
print(not True)          # 输出: False  取反

运算符优先级(从高到低粗略):** > * / // % > + - > 比较运算符 > not > and > or。记不住没关系,加括号永远合法且更清晰,考试不扣分。

print(2 + 3 * 4)    # 输出: 14  先乘后加
print((2 + 3) * 4)  # 输出: 20  括号优先

⚠️ 常见错误

  1. === 混用:赋值 vs 比较,本讲第一大坑。
  2. 拿 C/Java 的习惯算除法7 / 2 在 C 里是 3,Python 是 3.5。要整数结果用 //
  3. && / || 搬进 Python:那是 C/Java 的逻辑写法,Python 必须写 and / or,否则语法错误。
  4. 除数为 05 / 05 // 05 % 0 都报 ZeroDivisionError
  5. 负数的 % 结果-7 % 21 不是 -1,因为 Python 的余数符号跟除数一致。

1.5 输入与输出 ⭐

让程序"长耳朵"和"长嘴巴"

input() 让程序停下来等键盘输入,print() 把结果显示出来。

name = input("请输入名字:")     # 永远返回字符串!
print("你好,", name)
# 运行示例:
# 请输入名字:国睿
# 你好, 国睿

age = int(input("年龄:"))       # 要当数字用,必须手动转换
print(f"你好,{name},你 {age} 岁")
# 输出: 你好,国睿,你 20 岁

input() 两大特点 ⭐:

  1. 参数是提示语,可以留空。
  2. 永远返回 str!输入 20,拿到的也是字符串 "20"。要做加减乘除,必须 int() / float() 先转(配套练习 ex08)。

print() 特点 ⭐:

  • 默认结尾换行;print(x, end="") 结尾不换行。
  • 多个值用逗号隔开,中间自动加一个空格print(1, 2)1 2

f-string(格式化字符串)是高频考点:

num = 3.14159
print(f"{num:.2f}")          # 输出: 3.14        保留两位小数
print(f"{num:>10}")          # 输出:     3.14159  右对齐,占 10 位
print(f"价格 {num:.2f} 元")   # 输出: 价格 3.14 元

f-string 的通用写法是 f"{变量:格式}",最常用的格式符号::.2f(两位小数,配套练习 ex10)、:<n(左对齐占 n 位)、:>n(右对齐占 n 位)。

⚠️ 常见错误

  1. 忘了转换就运算age = input("年龄:") 后直接 age + 1TypeError:字符串不能加整数。
  2. f-string 漏了 f 前缀:写 "{name}"原样输出 {name} 而不是变量值。
  3. 格式化符号写反:是 :.2f 不是 :.2;是 >5 不是 5>
  4. 以为 input 返回数字input() 的返回值永远是字符串,转数字是一等大事。

1.6 类型转换 ⭐

给数据"换件外套"

函数 作用 注意
int(x) 转整数 int("12") ✅;int("12.5") ❌ 报错
float(x) 转浮点数 float("12.5") ✅;float("12")12.0
str(x) 转字符串 str(123)"123"
bool(x) 转布尔 空字符串/0/None → False,其余 → True
print(int(3.99))          # 输出: 3     直接截断,不四舍五入!
print(int("12") + 3)      # 输出: 15    字符串变整数才能相加
print(float("12.5"))      # 输出: 12.5
print(str(100) + "分")    # 输出: 100分  字符串拼接(配套练习 ex09)
print(bool(0), bool(1))   # 输出: False True

三个大坑

  1. int("12.5")报错——字符串里带小数点,int() 不认,得先 float("12.5") 再取整。
  2. int(3.99)3,是直接砍掉小数,不是四舍五入。要四舍五入用 round(3.99)
  3. bool() 的规则:0、空字符串、None、空列表 → False;其余所有值 → True。注意 bool("0")True(字符串 "0" 非空!)。

💡 记忆口诀int 只认"整数长相"的字符串;带小数点的字符串先 float 再处理。

⚠️ 常见错误

  1. int("3.5") 报错:字符串转 int 必须是纯整数格式。
  2. str 和数字直接 +"总分" + 95TypeError。要么 "总分" + str(95),要么用 f-string。
  3. 以为 int() 会四舍五入int(3.99)3,不是 4
  4. 转换结果忘接收int(s) 不改原变量,必须 s = int(s) 才算数。

1.7 常量与命名规范

Python 没有"真常量",但有约定

很多语言有常量(constant)——定义了就不能改的变量。Python 没有真正的常量,任何变量都能被重新赋值。于是社区约定:全大写 + 下划线表示"这是常量,约定别改"。

PI = 3.14159          # 全大写 + 下划线 = 约定的常量
GRAVITY = 9.8
radius = 2
print(f"圆的面积 = {PI * radius ** 2:.2f}")
# 输出: 圆的面积 = 12.57

命名规范速查:

场景 写法 例子
普通变量 snake_case total_score
常量 全大写 + 下划线 MAX_SIZE
函数名 snake_case get_name
类名 PascalCase(每个单词首字母大写) Student

⚠️ 常见错误

  1. 偷偷改常量PI = 3 语法不报错,但破坏了"约定",考试扣的是规范分。
  2. 驼峰命名totalScore 在 Python 里不主流,统一 total_score
  3. 中文变量名:Python 3 支持(姓名 = "国睿" 合法),但双语课和真实项目都要求英文命名,别自找麻烦。

1.8 编程习惯(为考试扣分项买单)

  • 变量名要有意义total_score 好过 tsa,看名字就懂它存什么。
  • 每个函数只做一件事:注释写"为什么这么做",而不是照抄代码的"做什么"。
  • 先想后写:拿到题目先理清"输入 → 处理 → 输出"三步,再动键盘。
  • 写完自查边界:空字符串、0、负数、None 各测一遍,很多丢分都在这。
  • 双语课作业可能要求英文注释,提前养成 # calculate total score 这种习惯,考试直接用得上。

⚠️ 常见错误

  1. 变量名没意义xa1tmp 满天飞,考试扣的是"可读性分",也是真实项目里别人读你代码时的吐槽点。
  2. 注释只写"做什么"不写"为什么"x = x + 1 # x 加一 是废话注释;# 跳过已审核的订单 才是有效注释。
  3. 不测边界就交:只测正常值,0、负数、None 一把测就翻车——考试给的就是这种用例。

📌 双语术语表(本讲)

中文 English 记忆点
解释型语言 interpreted language 边翻边跑
变量 variable 贴标签
赋值 assignment =
常量 constant 全大写约定
整数 / 浮点数 integer / float int / float
字符串 string str
布尔值 boolean boolTrue/False
空值 None 没有值
类型转换 type conversion / casting
输入 / 输出 input / output input() / print()
格式化字符串 f-string f"{x}"
整除 / 取余 floor division / modulo // / %
注释 comment #
运算符 operator
缩进 indentation 4 空格

⭐ 本讲考点清单

  1. = 赋值 vs == 比较
  2. 7 / 2 = 3.5(不是 3);// 向下取整(-7 // 2 = -4
  3. input() 返回字符串,数字要转换
  4. f-string 格式化:f"{x:.2f}"、对齐、拼接
  5. // 整除、% 取余、** 幂,% 结果符号跟除数一致
  6. 命名规则:不能数字开头、不能用关键字、snake_case
  7. type() / int() / float() / str() / bool() 转换
  8. and / or / not 逻辑运算;优先级记不住就加括号
  9. 交换变量的中间变量套路
  10. 浮点数不能直接 == 比较