Python: Python 语法与变量
现在开始编写真正的 Python 代码了。先来掌握最基础的规则:缩进、注释和变量。
1. 缩进规则
Python 最鲜明的特点——它用缩进来划分代码块,而不是花括号 {}。
TEXT
📖 仅展示
# ✅ 正确:同一个代码块内缩进保持一致
if 3 > 1:
print("3 大于 1")
print("这一行也在 if 代码块内")
# ❌ 错误:缩进不一致
if 3 > 1:
print("3 大于 1")
print("缩进错误!") # IndentationError
⚠️ 黄金法则:缩进永远用 4 个空格,不要用 Tab。大多数编辑器(VS Code、PyCharm)会自动把 Tab 键转换成 4 个空格。
缩进不仅适用于 if 语句,还适用于所有代码块——循环、函数、类等等:
PYTHON
# for 循环中的缩进
for i in range(3):
print(i) # 这一行在循环内
print("---") # 这一行也在循环内
print("完成") # 这一行不在循环内
2. 注释
注释是写给人看的——Python 会完全忽略它们。
(1) 单行注释:#
PYTHON
# 这是单行注释
print("Hello") # 代码后面的注释
# 多行注释使用多个 # 符号
# 这是第二行
# 这是第三行
(2) 多行字符串注释:""" """ 或 ''' '''
严格来说这些是字符串,但常被当作多行注释来用:
PYTHON
"""
这是一个多行注释
常用于编写函数说明
或者临时屏蔽大段代码
"""
print("上面的多行字符串不会执行")
3. 变量
Python 的变量不需要声明类型——直接赋值就能用:
PYTHON
name = "Alice" # str
age = 25 # int
height = 1.75 # float
is_student = True # bool
(1) 变量命名规则
| 规则 | 正确 ✅ | 错误 ❌ |
|---|---|---|
| 只能包含字母、数字和下划线 | my_name |
my-name |
| 不能以数字开头 | var1 |
1var |
| 区分大小写 | name 和 Name 是不同的 |
- |
| 不能是关键字 | - | if、for、class |
(2) 命名规范(PEP 8)
PYTHON
# ✅ 变量:小写加下划线(snake_case)
user_name = "Alice"
total_price = 99.9
max_value = 100
# ✅ 常量:全大写加下划线
PI = 3.14159
MAX_SIZE = 1024
# ❌ 不推荐
userName = "Alice" # CamelCase(Java 风格)
UserName = "Alice" # 看起来像类名
(3) 多变量赋值
Python 允许在一行里给多个变量赋值:
PYTHON
# 一次给多个变量赋值
a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3
# 交换两个变量(其他语言需要借助临时变量)
x, y = 10, 20
x, y = y, x
print(x, y) # 20 10
# 给多个变量赋相同的值
m = n = p = 0
print(m, n, p) # 0 0 0
▶ 示例:变量类型与交换(难度 ⭐)
PYTHON
# 定义不同类型的变量
name = "Alice"
age = 25
height = 1.68
is_student = True
# 打印变量信息
print(f"{name} 今年 {age} 岁,身高 {height}m")
print(f"学生身份:{is_student}")
# 交换两个变量
a, b = 10, 20
print(f"交换前:a={a}, b={b}")
a, b = b, a
print(f"交换后:a={a}, b={b}")
# 检查类型
print(f"name 的类型:{type(name)}")
print(f"age 的类型:{type(age)}")
print(f"height 的类型:{type(height)}")
Output:
TEXT
📖 仅展示
Alice is 25 years old, 1.68m tall
Student status: True
Before: a=10, b=20
After: a=20, b=10
name type: <class 'str'>
age type: <class 'int'>
height type: <class 'float'>
4. type() 函数
▶ 示例:变量类型探索(难度 ⭐)
PYTHON
# 探索不同的类型和类型转换
x = 42
y = 3.14
z = "Hello"
w = True
print(f"x = {x}, 类型 = {type(x).__name__}")
print(f"y = {y}, 类型 = {type(y).__name__}")
print(f"z = {z}, 类型 = {type(z).__name__}")
print(f"w = {w}, 类型 = {type(w).__name__}")
# 类型转换
print(f"\nint(y) = {int(y)}")
print(f"float(x) = {float(x)}")
print(f"str(x) = {str(x)}")
print(f"bool(0) = {bool(0)}, bool(1) = {bool(1)}")
# 动态类型:变量的类型可以改变
var = 100
print(f"\nvar = {var}, 类型 = {type(var).__name__}")
var = "现在是个字符串"
print(f"var = {var}, 类型 = {type(var).__name__}")
Output:
TEXT
📖 仅展示
x = 42, type = int
y = 3.14, type = float
z = Hello, type = str
w = True, type = bool
int(y) = 3
float(x) = 42.0
str(x) = 42
bool(0) = False, bool(1) = True
var = 100, type = int
var = now a string, type = str
▶ 示例:变量赋值技巧(难度 ⭐)
PYTHON
# 多重赋值
a, b, c = 10, 20, 30
print(f"a={a}, b={b}, c={c}")
# 无需临时变量即可交换
x, y = 100, 200
print(f"交换前:x={x}, y={y}")
x, y = y, x
print(f"交换后:x={x}, y={y}")
# 给多个变量赋相同的值
p = q = r = 0
print(f"p={p}, q={q}, r={r}")
# 解包列表
colors = ["red", "green", "blue"]
first, second, third = colors
print(f"第一个:{first},第二个:{second},第三个:{third}")
Output:
TEXT
📖 仅展示
a=10, b=20, c=30
Before swap: x=100, y=200
After swap: x=200, y=100
p=0, q=0, r=0
First: red, Second: green, Third: blue
4. type() 函数
用 type() 来检查变量的类型:
PYTHON
print(type(10)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("Hello")) # <class 'str'>
print(type(True)) # <class 'bool'>
# 变量重新赋值后类型可以改变(动态类型)
x = 10
print(type(x)) # <class 'int'>
x = "Hello"
print(type(x)) # <class 'str'> ← 类型变了
5. 常见错误
PYTHON
# IndentationError:缩进错误
print("缩进多了")
print("这一行多了一个空格") # ❌
# NameError:变量未定义
print(z) # ❌ z 从未被赋值
# SyntaxError:语法错误
print("Hello) # ❌ 引号没有闭合
❓ 常见问题
Q 为什么 Python 用缩进而不是像其他语言那样用花括号
{}?A Python 之父 Guido van Rossum 认为,代码首先应该便于人类阅读。缩进在视觉上就能体现代码结构——你的眼睛本来就看得到它,何必再多加符号呢?这强制了格式统一,也消灭了整类 bug(漏掉花括号、括号不匹配)。这是一种设计哲学:"优美胜于丑陋。"
Q 我把 Tab 和空格混用了——代码看起来没问题,却抛出
IndentationError,为什么?A Python 把 Tab 和空格当成不同的字符。一行用 Tab 缩进,和一行用 4 个空格缩进,人眼看是一样的,但 Python 认为它们不一样。解决办法:把编辑器配置成用空格替换 Tab(VS Code 默认就这样)。可以用
python -m tabnanny myfile.py 来扫描混用缩进的情况。Q Python 的动态类型和 Java 这类语言的静态类型有什么区别?重要吗?
A 在静态类型语言里,你要事先声明变量的类型(
int x = 5;),而且之后不能改。在 Python 里,类型在运行时才确定,而且可以变(x = 5; x = "hello" 都行)。动态类型更灵活、写起来更快,但类型错误要到运行时才暴露。对初学者来说,动态类型意味着更少的样板代码;对大型项目来说,静态类型能更早地发现 bug。Q 我一直遇到
NameError: name 'xxx' is not defined,怎么解决?A NameError 表示 Python 找不到这个名字的变量。常见原因:① 变量名拼错了(Python 区分大小写——
Name ≠ name);② 在赋值之前就使用了变量;③ 变量定义在函数或循环内部,你却在外面访问它。快速排查法:在报错的那一行前面加个 print(),看看那一刻到底有哪些变量存在。Q
= 和 == 有什么区别?我总是搞混。A
= 是赋值——把值放进变量(x = 5 意思是"x 现在存的是 5")。== 是比较——它在问"这两个相等吗?"(x == 5 返回 True 或 False)。可以把 = 想象成指向左边的箭头(x ← 5),把 == 想象成检查两边的天平。这是初学者最常见的错误之一——把本应写的 if x == 5: 写成了 if x = 5:。📖 小节
- Python 用 4 个空格的缩进来组织代码块
- 单行注释用
#,多行注释用""" """ - 变量直接赋值——无需声明类型(动态类型)
- 变量名使用
snake_case(小写加下划线) - 常量使用
ALL_CAPS,如MAX_VALUE - 用
type()检查变量的类型 - 可以一次给多个变量赋值:
a, b = 1, 2
📝 作业
- 写一段代码,定义三个变量:
city(城市名)、year(年份)、score(分数 88.5),并用print()打印出来 - 交换两个变量
a = 5和b = 10,让a变成 10,b变成 5 - 用
type()检查True、"123"和3.0的类型 - 故意写一段有缩进错误的代码,看看 Python 抛出什么错误,并把错误信息截图