PY-01 基础语法
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一次性跑完整份。
⚠️ 常见错误
- 缩进混用 Tab 和空格:同一块代码里一会儿 Tab 一会儿空格,报
IndentationError。全项目统一 4 空格。 - 中文标点:写成
print("hi")(全角括号)或中文引号,报SyntaxError。只有字符串内容里才能用中文标点。 - 漏掉括号:
print "hi"是 C 的写法,Python 必须print("hi")。 - 运行前忘保存:改完代码没 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 关键字:
if、for、class、def…(可执行import keyword; print(keyword.kwlist)查全表)。 - 大小写敏感:
Name和name是两个不同变量。 - 约定俗成:小写字母 + 下划线连接,叫 snake_case(蛇形命名),如
user_name、total_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
⚠️ 常见错误
=当成"等于":if x = 5是赋值、不是判断,Python 直接报语法错误。判断相等要用==。- 变量名数字开头:
1st_name直接SyntaxError。 - 没赋值就使用:
print(score)但之前从没写过score = ...,报NameError: name 'score' is not defined。 - 关键字当变量名:
class = 1、for = 2都会报错。 - 忘了中间变量:
a = b; b = a是经典错误——第二步的a已经是b的值,b永远拿不回原值。
1.3 基本数据类型 ⭐
五个基础类型 + 一个"没有"
| 类型 | 英文 | 例子 | 说明 |
|---|---|---|---|
| 整数 | int |
42、-3 |
任意大小,Python 不会溢出 |
| 浮点数 | float |
3.14、2.0 |
带小数 |
| 字符串 | str |
"abc"、'你好' |
单双引号都行 |
| 布尔 | bool |
True、False |
逻辑判断,首字母大写 |
| 空值 | None |
None |
表示"啥都没有" |
一个隐蔽的坑:True / False 首字母必须大写。写 true、false 会被当成普通变量名,直接 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。
⚠️ 常见错误
- 布尔首字母小写:
true、false→NameError。 None不等于False:None是"没有值",False是"值为假",两回事。- 浮点不能直接比相等:
0.1 + 0.2 == 0.3得False(实际是0.30000000000000004)。这是二进制的锅,判分/比较时用容差,别用==。 True其实就是1:True + 1得2,考试偶尔挖这个坑。
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 括号优先
⚠️ 常见错误
=和==混用:赋值 vs 比较,本讲第一大坑。- 拿 C/Java 的习惯算除法:
7 / 2在 C 里是3,Python 是3.5。要整数结果用//。 - 把
&&/||搬进 Python:那是 C/Java 的逻辑写法,Python 必须写and/or,否则语法错误。 - 除数为 0:
5 / 0、5 // 0、5 % 0都报ZeroDivisionError。 - 负数的
%结果:-7 % 2得1不是-1,因为 Python 的余数符号跟除数一致。
1.5 输入与输出 ⭐
让程序"长耳朵"和"长嘴巴"
input() 让程序停下来等键盘输入,print() 把结果显示出来。
name = input("请输入名字:") # 永远返回字符串!
print("你好,", name)
# 运行示例:
# 请输入名字:国睿
# 你好, 国睿
age = int(input("年龄:")) # 要当数字用,必须手动转换
print(f"你好,{name},你 {age} 岁")
# 输出: 你好,国睿,你 20 岁
input() 两大特点 ⭐:
- 参数是提示语,可以留空。
- 永远返回
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 位)。
⚠️ 常见错误
- 忘了转换就运算:
age = input("年龄:")后直接age + 1→TypeError:字符串不能加整数。 - f-string 漏了
f前缀:写"{name}"会原样输出{name}而不是变量值。 - 格式化符号写反:是
:.2f不是:.2;是>5不是5>。 - 以为
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
三个大坑:
int("12.5")会报错——字符串里带小数点,int()不认,得先float("12.5")再取整。int(3.99)得3,是直接砍掉小数,不是四舍五入。要四舍五入用round(3.99)。bool()的规则:0、空字符串、None、空列表 →False;其余所有值 →True。注意bool("0")是True(字符串"0"非空!)。
💡 记忆口诀:
int只认"整数长相"的字符串;带小数点的字符串先float再处理。
⚠️ 常见错误
int("3.5")报错:字符串转int必须是纯整数格式。str和数字直接+:"总分" + 95→TypeError。要么"总分" + str(95),要么用 f-string。- 以为
int()会四舍五入:int(3.99)是3,不是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 |
⚠️ 常见错误
- 偷偷改常量:
PI = 3语法不报错,但破坏了"约定",考试扣的是规范分。 - 驼峰命名:
totalScore在 Python 里不主流,统一total_score。 - 中文变量名:Python 3 支持(
姓名 = "国睿"合法),但双语课和真实项目都要求英文命名,别自找麻烦。
1.8 编程习惯(为考试扣分项买单)
- 变量名要有意义:
total_score好过ts、a,看名字就懂它存什么。 - 每个函数只做一件事:注释写"为什么这么做",而不是照抄代码的"做什么"。
- 先想后写:拿到题目先理清"输入 → 处理 → 输出"三步,再动键盘。
- 写完自查边界:空字符串、
0、负数、None各测一遍,很多丢分都在这。 - 双语课作业可能要求英文注释,提前养成
# calculate total score这种习惯,考试直接用得上。
⚠️ 常见错误
- 变量名没意义:
x、a1、tmp满天飞,考试扣的是"可读性分",也是真实项目里别人读你代码时的吐槽点。 - 注释只写"做什么"不写"为什么":
x = x + 1 # x 加一是废话注释;# 跳过已审核的订单才是有效注释。 - 不测边界就交:只测正常值,
0、负数、None一把测就翻车——考试给的就是这种用例。
📌 双语术语表(本讲)
| 中文 | English | 记忆点 |
|---|---|---|
| 解释型语言 | interpreted language | 边翻边跑 |
| 变量 | variable | 贴标签 |
| 赋值 | assignment | = |
| 常量 | constant | 全大写约定 |
| 整数 / 浮点数 | integer / float | int / float |
| 字符串 | string | str |
| 布尔值 | boolean | bool,True/False |
| 空值 | None | 没有值 |
| 类型转换 | type conversion / casting | |
| 输入 / 输出 | input / output | input() / print() |
| 格式化字符串 | f-string | f"{x}" |
| 整除 / 取余 | floor division / modulo | // / % |
| 注释 | comment | # |
| 运算符 | operator | |
| 缩进 | indentation | 4 空格 |
⭐ 本讲考点清单
=赋值 vs==比较7 / 2= 3.5(不是 3);//向下取整(-7 // 2 = -4)input()返回字符串,数字要转换- f-string 格式化:
f"{x:.2f}"、对齐、拼接 //整除、%取余、**幂,%结果符号跟除数一致- 命名规则:不能数字开头、不能用关键字、snake_case
type()/int()/float()/str()/bool()转换and/or/not逻辑运算;优先级记不住就加括号- 交换变量的中间变量套路
- 浮点数不能直接
==比较