Python 基础语法与变量

目录

  1. Python 的语法基石
    • 1.1 缩进与代码块
    • 1.2 注释的艺术
    • 1.3 语句、换行与分号
  2. 标识符与关键字
    • 2.1 命名规则与约定
    • 2.2 保留关键字一览
  3. 变量与动态类型
    • 3.1 变量的本质:名称绑定
    • 3.2 动态类型与类型查询
    • 3.3 多重赋值与变量交换
  4. 基本输入与输出
    • 4.1 print() 函数详解
    • 4.2 input() 交互式输入
  5. 数字类型入门
    • 5.1 整数 int
    • 5.2 浮点数 float
    • 5.3 复数 complex
    • 5.4 算术运算符与优先级
    • 5.5 类型转换与进制表示
  6. 字符串基础
    • 6.1 创建字符串
    • 6.2 转义字符与原始字符串
    • 6.3 字符串格式化
  7. 实战练习与常见错误
  8. 总结

1. Python 的语法基石

1.1 缩进与代码块

Python 最独特的语法特征就是使用缩进来表示代码块的归属,而不像 C/Java 那样使用花括号 {}。同一代码块内的语句必须拥有相同的缩进空白数量,通常使用 4个空格(PEP 8 强烈建议)。

if True:
    print("缩进正确")
    print("我属于 if 块")
print("我已在 if 块之外")

错误的缩进会引发 IndentationError

if True:
print("缩进缺失")   # IndentationError: expected an indented block

缩进的严格性迫使程序员写出结构清晰的代码,这正是“可读性很重要”的体现。保持整个文件中缩进风格一致(空格 vs 制表符)至关重要。推荐使用空格,并配置编辑器将 Tab 键自动转为 4 个空格。

1.2 注释的艺术

注释是写给人类阅读的说明,解释器会完全忽略它们。

  • 单行注释:以 # 开头,直到行尾。
    # 计算圆的面积
    area = 3.14 * r ** 2
    
  • 多行注释:通常使用三个连续引号('''""")包裹长文本。虽然 Python 没有真正的多行注释语法,但这样的字符串未被赋值给变量,解释器会将其视为文档字符串(docstring),通常用在模块、函数、类定义的首行。
    """
    这是一个多行注释(文档字符串)
    常用于描述代码用途
    """
    

好的注释解释为什么而不是做了什么(代码本身已经说明了做了什么)。避免冗余的注释,如 x = x + 1 # 将 x 加 1

1.3 语句、换行与分号

  • Python 中一般一行就是一条语句,语句结束不需要分号
  • 如果想在一行包含多条语句,可以用分号分隔,但极不推荐,这牺牲了可读性。
    a = 1; b = 2  # 可行但丑陋
    
  • 过长的语句可以使用反斜杠 \ 换行,但更优雅的是利用 Python 的隐式换行:在圆括号 ()、方括号 []、花括号 {} 内部,可以自由换行。
    total = (first_variable
             + second_variable
             + third_variable)
    

2. 标识符与关键字

2.1 命名规则与约定

标识符(变量名、函数名、类名等)必须符合以下规则:

  • 由字母(A-Z, a-z)、数字(0-9)或下划线 _ 组成,不能以数字开头。
  • 区分大小写(nameName 不同)。
  • 不能与 Python 关键字重名。

PEP 8 推荐的命名风格:

  • 变量、函数、模块:小写字母,词之间用下划线 snake_case(如 my_variable, calculate_area())。
  • 常量:全大写,下划线分隔 MAX_OVERFLOW
  • :大驼峰 CamelCase(如 MyClass)。
  • 避免使用单字符 l(易与数字 1 混淆)、O(易与 0 混淆)。
  • _ 开头的名称表示“私有”或内部使用(是一种约定)。

2.2 保留关键字一览

Python 内置了一些单词作为关键字,它们有特殊含义,不能用作标识符。可以通过 keyword 模块查看:

import keyword
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break',
#  'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally',
#  'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
#  'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

记住常用关键字,特别是流程控制相关的,会帮助你更快理解代码结构。


3. 变量与动态类型

3.1 变量的本质:名称绑定

在 Python 中,变量不是一个存储数据的“盒子”,而只是附加到对象上的一个名称(标签)。赋值语句 x = 10 的意思是把名称 x 绑定到整数对象 10 上。当我们再执行 x = "hello",名称 x 就重新绑定到了一个字符串对象,原来指向的整数对象可能会被垃圾回收。

这个观念很重要,它解释了为什么 Python 没有声明类型,以及为什么以下情况发生:

a = [1, 2, 3]
b = a          # b 和 a 指向同一个列表对象
b.append(4)
print(a)       # [1, 2, 3, 4] —— a 也变了!

这里 b = a 并没有复制列表,只是给同一个对象增加了一个别名。

3.2 动态类型与类型查询

Python 是动态类型语言,变量可以随时改变所引用对象的类型,不需要提前声明。

  • 使用 type() 函数查看对象的类型:
    x = 42
    print(type(x))  # <class 'int'>
    x = "forty-two"
    print(type(x))  # <class 'str'>
    
  • 使用 isinstance() 检查对象是否属于某种类型,支持继承关系:
    print(isinstance(42, int))      # True
    print(isinstance(42, object))   # True(所有类都继承自 object)
    

3.3 多重赋值与变量交换

Python 支持同时为多个变量赋值,大大简化了代码。

x, y, z = 10, 20, 30   # 多重赋值
# 变量交换,无需临时变量
x, y = y, x
print(x, y)  # 20 10

这种机制本质上是“元组打包和解包”:右侧的 y, x 先被构筑成一个元组,然后依次解包赋值给左侧的变量。

还可以用 * 收集多余的值:

a, *b, c = [1, 2, 3, 4, 5]
print(a)  # 1
print(b)  # [2, 3, 4]  中间部分会变成一个列表
print(c)  # 5

4. 基本输入与输出

4.1 print() 函数详解

print() 是最常用的输出函数,它将参数打印到标准输出(屏幕)。

  • 打印多个值,默认用空格分隔:
    print("你好", "世界", 2025)   # 你好 世界 2025
    
  • sep 参数自定义分隔符:
    print("妈妈", "爸爸", "我", sep=", ")  # 妈妈, 爸爸, 我
    
  • end 参数指定结尾字符,默认是换行符 \n
    print("Loading", end="...")
    print("Done")    # Loading...Done
    

4.2 input() 交互式输入

input() 等待用户输入,返回一个字符串(即使用户输入的是数字)。

name = input("请输入你的名字:")
print(f"你好,{name}")

注意 input() 总是返回 str,如果需要数字,务必进行类型转换:

age = int(input("请输入年龄:"))
print(f"明年你就 {age + 1} 岁了")

5. 数字类型入门

5.1 整数 int

Python 的整数是任意精度的,不会像 C 语言那样溢出。你可以计算非常大的数:

print(2 ** 1000)   # 一个巨大的整数,无压力

整数可以直接用十进制表示,也支持二进制(0b0B)、八进制(0o)、十六进制(0x)形式:

print(0b1010)  # 10
print(0o12)    # 10
print(0xA)     # 10

5.2 浮点数 float

浮点数基于 IEEE 754 双精度标准,可能存在精度误差,这是所有编程语言都面临的问题。

print(0.1 + 0.2)   # 0.30000000000000004

需要高精度十进制时,可使用 decimal 模块。

5.3 复数 complex

Python 内置复数支持,虚部用 jJ 表示:

c = 3 + 4j
print(c.real)  # 3.0
print(c.imag)  # 4.0
print(c.conjugate())  # (3-4j)

5.4 算术运算符与优先级

运算符描述示例
+加法2 + 3 → 5
-减法5 - 2 → 3
*乘法2 * 3 → 6
/除法(浮点)7 / 2 → 3.5
//整除(地板除)7 // 2 → 3
%取余7 % 2 → 1
**幂运算2 ** 3 → 8

优先级从高到低:** > 正负号 +x -x > * / // % > + -。不清晰时使用括号

5.5 类型转换与进制表示

  • int() 可将字符串或浮点数转为整数(直接截断小数部分)。
    int("42")      # 42
    int(3.9)       # 3
    int("1010", 2) # 10 (二进制字符串转整数)
    
  • float() 将整数或字符串转为浮点数。
  • bin(), oct(), hex() 将整数转为对应进制的字符串表示:
    bin(10)  # '0b1010'
    hex(255) # '0xff'
    

6. 字符串基础

6.1 创建字符串

字符串可以使用成对的单引号 '...' 或双引号 "..."。两者的功能完全等价,选择哪种往往取决于内容中是否包含引号:

s1 = "I'm fine"
s2 = 'He said, "Hello"'

多行字符串用三个连续引号:

long_text = """第一行
第二行
第三行"""

6.2 转义字符与原始字符串

反斜杠 \ 用来引入特殊字符,如 \n 换行、\t 制表符、\\ 反斜杠本身、\' 引号等。

print("第一行\n第二行")

如果不希望转义发生,使用原始字符串,在字符串前加 r

path = r"C:\Users\new"   # 不会把 \n 当换行
print(path)  # C:\Users\new

6.3 字符串格式化

Python 提供了多种格式化方式,f-string(formatted string literals)是最现代且推荐的方法。

name = "Alice"
age = 25
# f-string
print(f"{name} is {age} years old.")
# 可以内嵌表达式
print(f"Next year {name} will be {age + 1}")

# format 方法
print("{} is {} years old.".format(name, age))

# 旧式 % 格式化(不推荐)
print("%s is %d years old." % (name, age))

f-string 从 Python 3.6 开始可用,它速度快、可读性高。建议在新代码中优先使用。


7. 实战练习与常见错误

下面是一个综合运用变量、数字、字符串和输入输出的小例子:

# 计算 BMI
height_cm = float(input("请输入你的身高(cm):"))
weight_kg = float(input("请输入你的体重(kg):"))
height_m = height_cm / 100
bmi = weight_kg / (height_m ** 2)
print(f"你的 BMI 是 {bmi:.1f}")  # .1f 保留一位小数

常见错误

  1. 忘记类型转换age = input("年龄:") 后直接 age + 1 报错,因为 age 是字符串。
  2. 缩进不一致:混用空格和 Tab。
  3. 变量未定义:使用了未赋值的变量。
  4. 整数除法误解/ 总是得到浮点数,即使整除结果也是浮点;// 才是整除。

8. 总结

本节你学习了 Python 最基础的语法规则和变量系统:缩进决定代码块、严格的命名规则、变量只是对象的标签、以及数字和字符串的基本操作。这些知识是构建所有 Python 程序的基石。在下一节,我们将进入核心数据类型的深入世界——列表、字典等内置容器,让数据组织变得灵活而强大。掌握这些基础后,你将能够阅读和编写许多实用的小脚本。

动手试一试:写一个程序,从用户那里读取两个数字,输出它们的加、减、乘、除结果,并保持适当的格式。这是对所学内容的最好巩固。

更多推荐