Python 语言基础:注释、变量、流程控制与容器

Python 入门核心语法:注释、标识符、变量、基础类型、输入输出、运算符、字符串、流程控制与四大容器。

一、注释、标识符与字面量

注释

注释的作用是给人看,不会作为真正要执行的程序语句参与运行。刚入门时,先分清两种最常见的写法:

  • # 开头的是单行注释,适合给某一行代码做简短说明
  • ''' ... '''""" ... """ 包起来的内容常被当作多行注释使用,更准确地说它本质上是多行字符串;如果只是为了说明代码,也可以这样写
# 这是单行注释

"""
这是多行字符串。
如果它只是用来解释代码,也常被当作多行注释使用。
"""

标识符

标识符可以理解成“程序里名字的统称”,变量名、函数名、模块名,本质上都属于标识符。

先记住 Python 标识符的硬规则:

  • 只能由字母、数字、下划线组成
  • 不能以数字开头
  • 严格区分大小写,例如 nameName 不是同一个名字
  • 不能使用 Python 关键字作为名字,例如 ifclassfor

例如下面这些写法里,前两个合法,后两个不合法:

user_name = "alex"
age2 = 18

# 2name = "tom"   # 不能以数字开头
# class = "vip"   # 不能使用关键字

除了“能不能用”,还建议尽量这样写:

  • 变量名优先使用小写加下划线,例如 user_name
  • 常量名通常使用全大写,例如 MAX_RETRY
  • 文件名不要和标准库模块重名,例如不要把脚本起名为 random.py

字面量与常量

字面量,就是代码里直接写出来的值;常见的常量写法,则是把那些“通常不希望被随意修改”的值,用全大写名字保存起来。

先看最直观的字面量例子:

18
3.14
True
"hello"
None

这些直接写在代码里的值,都属于字面量。

再看常量的常见写法:

PI = 3.14159
MAX_RETRY = 3
DEFAULT_PORT = 8000

要注意一点:Python 并没有像有些语言那样提供“绝对不可修改”的常量语法。所谓常量,更多是一种命名约定,告诉自己和别人“这个值通常不要改”。

二、变量、数据类型与类型转换

可以把变量理解成存放数据的名字,或者说“程序里一个可引用的数据容器”。

  • 变量用来保存程序运行过程中的数据
  • 这些数据通常只在程序运行期间保存在内存里,可以把它理解成“临时保存”
  • 变量里保存的值在程序执行期间可以变化
  • 变量名的意义是让你后续还能再次引用这份数据

最常见的定义方式就是:

name = "Tom"
age = 19
price = 5.5

这里的 = 不是“数学里的相等”,而是赋值,表示把右边的值绑定给左边的变量名。

数据类型

age = 18  # int:整数,常用于计数、索引、状态值
price = 9.9  # float:浮点数,常用于测量值、价格、比例
is_admin = False  # bool:布尔值,常用于条件判断
name = "alex"  # str:字符串,表示文本内容
nickname = None  # NoneType:表示没有值,或当前暂时缺省

scores = [90, 85, 92]  # list:有序、可修改的数据集合
point = (10, 20)  # tuple:有序、通常不修改的数据组合
user = {"name": "alex", "age": 18}  # dict:键值映射
tags = {"python", "web", "async"}  # set:自动去重,适合集合运算

查看数据类型

a = 18

print(type(a)) #<class 'int'>
print(type("python")) #<class 'str'>
print(type([1, 2, 3])) #<class 'list'>
print(type({"name": "alex"})) #<class 'dict'>

类型转换:

age_text = "18"
age = int(age_text)
ratio = float("3.5")
message = str(100)

print(age, ratio, message) #18 3.5 100

认识类型提示

从 Python 3 开始,变量后面也可以顺手写上“这个值大概是什么类型”:

name: str = "alex"
age: int = 18
scores: list[int] = [90, 85, 92]

这类写法叫类型提示,主要是给人和编辑器看的,用来说明数据形状,本身不会把 Python 变成强类型语言。

可以先记住两点:

  • name: str 表示“这个变量通常应该是字符串”
  • list[int] 表示“这是一个列表,里面的元素通常是整数”

这里先认识这种写法就够了。更完整的函数参数、返回值、str | Nonemypy,放到下一篇《Python 函数与模块》统一讲。

三、输入输出与运算符

输出函数

输出函数 print(),把结果显示到屏幕上。可以输出变量、输出表达式、输出调试信息。

age = 18
print("明年年龄:", age + 1)  # 明年年龄: 19

print() 也常配合 sepend 使用:

  • sep:多个输出项之间的分隔符
  • end:本次输出结束时追加的结尾字符,默认是换行
print("Sun", "Mon", "Tue", sep=", ", end=";\n") # Sun, Mon, Tue;
print("Wed", "Thu") # Wed Thu

格式化输出通常优先用 f-string

goods_name = "胡萝卜"
goods_price = 5.5

print(f"今天蔬菜特价了,{goods_name}只要{goods_price:.2f}元/斤!")  
# 今天蔬菜特价了,胡萝卜只要5.50元/斤!

其中 {goods_price:.2f} 表示保留 2 位小数。

输入函数

Python 最常见的输入函数是 input(),它会暂停程序,等待用户输入内容。

注意:input() 接收到的结果默认是字符串

age_text = input("请输入年龄:")
age = int(age_text)

print(age)
print(age + 1)

如果不做类型转换,很多数值计算都会得到错误结果,或者直接报错。

运算符

a = 9
b = 4

print(a + b)   # 13,加法
print(a - b)   # 5,减法
print(a * b)   # 36,乘法
print(a / b)   # 2.25,除法,结果通常是浮点数
print(a // b)  # 2,整除
print(a % b)   # 1,取模
print(a ** b)  # 6561,幂运算

比较运算符和逻辑运算符:

  • 比较运算符:==!=><>=<=
  • 逻辑运算符:andornot
age = 20
has_ticket = True

print(age >= 18)  # True
print(age < 18)  # False
print(age >= 18 and has_ticket)  # True
print(not has_ticket)  # False

四、字符串与切片

切片是 Python 非常高频的能力,几乎所有序列类型都能用。

text = "python-note"
#[开始:结束:步长]
print(text[0:3])   # 取索引 0 到 2
print(text[:])     # 整体复制
print(text[6:])    # 从索引 6 到结尾
print(text[:-3])   # 去掉最后 3 个字符
print(text[-1])    # 最后一个字符
print(text[::-1])  # 反转字符串

常见字符串方法:

raw = "  Alex Li  "

print(raw.strip())          # 去掉首尾空白字符
print(raw.lower())          # 转换为全小写
print(raw.upper())          # 转换为全大写
print(raw.replace("Li", "Wang")) # 替换子字符串
print(raw.startswith("  Al")) # 判断是否以指定内容开头
print(raw.endswith("  ")) # 判断是否以指定内容结尾
print(raw.find("Li"))      # 查找子字符串第一次出现的位置,找不到返回 -1
print(raw.count(" "))      # 统计子字符串出现次数
print("2026-06-20".split("-")) # 以 "-" 为分隔符拆分字符串为列表
print("-".join(["2026", "06", "20"])) # 使用 "-" 将列表元素连接成字符串

五、条件判断与循环

条件判断里的真值规则

Python 不只 True / False 能参与条件判断。很多对象在 if 里也会被转换成真值。

print(bool(1))        # True
print(bool(0))        # False
print(bool("hi"))     # True
print(bool(""))       # False
print(bool([1, 2]))   # True
print(bool([]))       # False
print(bool(None))     # False
  • 常见假值有:00.0""[]{}set()None
  • 其他大多数对象在条件里都视为真

if / elif / else

if 语句用来做条件判断。可以先把它理解成一句话:

  • 条件成立,就执行这一段代码
  • 条件不成立,就跳过或执行另一段代码

选择结构的 3 种常见形式

1. 单分支 if

age = 19

if age >= 18:
    print("已满 18 岁,可以上网")

这种写法适合“满足条件才执行,不满足就什么都不做”的情况。

2. 双分支 if ... else

age = 16

if age >= 18:
    print("已满 18 岁,可以上网")
else:
    print("未满 18 岁,不可以上网")

这种写法适合“二选一”的场景。

3. 多分支 if ... elif ... else

score = 87

if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 60:
    print("及格")
else:
    print("不及格")

if 嵌套

当一个条件块内部还要继续判断时,就会出现嵌套结构:

username = "root"
is_vip = True

if username == "root":
    if is_vip:
        print("管理员且是会员")

while 循环

target_age = 56
count = 0

# 循环条件:尝试次数小于 3
while count < 3:
    guess_age = int(input("guess age: "))
    if guess_age == target_age:
        print("yes, you got it")
        break  # 猜对时跳出循环
    elif guess_age > target_age:
        print("think smaller...")
    else:
        print("think bigger...")
    count += 1
else:
    # 当 while 循环正常结束(没有被 break 打断)时执行
    print("you have tried too many times")

for 循环

for 循环最适合做“遍历一个容器里的每一项”。

的基本语法:

for 变量 in 可迭代对象:
    重复执行的代码

常见的“可迭代对象”:字符串/列表/元组/字典/集合/range()

# range(0, 10, 2) 表示从 0 到 9,步长为 2。
for number in range(0, 10, 2):
    print(number)

可以直接遍历容器:

for name in ["tom", "rose", "alex"]:
    print(name)

breakcontinue

  • break:立刻结束当前整个循环
  • continue:跳过本次循环,直接进入下一次循环

break 示例:

for index in range(1, 6):
    if index == 4:
        print("已经吃饱了,后面的苹果不吃了")
        break
    print(f"正在吃第{index}个苹果")

continue 示例:

for index in range(1, 6):
    if index == 3:
        print("不好,有大虫,这个苹果不吃了")
        continue
    print(f"正在吃第{index}个苹果")

六、列表、元组、字典、集合

列表 list

列表最适合存放一组有顺序、可重复、可修改的数据。

number_list = [1, 3, 5, 7, 9]
mixed_list = ["tom", 18, True, 9.9]

列表的增删改查

  • :通过索引读取元素
  • :使用 append()insert() 添加元素
  • :通过索引直接重新赋值
  • :使用 delpop()remove() 删除元素
number_list = [1, 3, 5, 7, 9]
names = ["tom", "rose", "alex", "rose"]
# 查:访问索引位置上的元素
second_num = number_list[1]
print(second_num)  # 3

# 增:在末尾追加
number_list.append(11)

# 增:在指定位置插入
number_list.insert(2, 99)

# 改:修改索引位置上的值
number_list[1] = 30
print(number_list)

# 删:按索引删除
del number_list[2]
print(number_list)
last_item = number_list.pop()      # 删除并返回最后一个元素
names.remove("rose")         # 删除第一个匹配到的值

列表的其他常见操作

numbers = [1, 2, 3]

print(len(numbers))          # 长度
print([1, 2, 3] + [4, 5, 6]) # 组合
print(["Hello"] * 4)         # 重复
print(3 in [1, 2, 3])        # 成员判断
print(8 not in numbers)      # 不在列表中

列表索引

列表支持正向索引和反向索引:

abcd_list = ["a", "b", "c", "d"]

print(abcd_list[1])   # b
print(abcd_list[-2])  # c

可以先这样理解:

  • 正向索引从 0 开始
  • 反向索引从 -1 开始,表示最后一个元素

列表切片

列表和元组也支持切片,语法和字符串类似:

字典(dict)和集合(set)不支持切片。

abcd_list = ["a", "b", "c", "d"]

print(abcd_list[1:])    # ['b', 'c', 'd']
print(abcd_list[:3])    # ['a', 'b', 'c']
print(abcd_list[1:3])   # ['b', 'c']
print(abcd_list[:-1])   # ['a', 'b', 'c']
print(abcd_list[::2])   # ['a', 'c']
print(abcd_list[::-1])  # ['d', 'c', 'b', 'a']

切片可以记成 列表[起始:结束:步长]

  • 起始位默认从开头开始
  • 结束位默认切到末尾,但本身不包含结束位
  • 步长不写时默认为 1
  • 步长为负数时表示反向切片

可变对象与不可变对象

  • 常见不可变类型:intfloatboolstrtuple
  • 常见可变类型:listdictset

浅拷贝与深拷贝

注意:浅拷贝只复制第一层,嵌套对象仍然共享引用

import copy

source = ["zhangsan", ["alex", "oldboy"]]
# 浅拷贝,只复制外层列表,内层列表仍然是引用
shallow = source.copy()
# 深拷贝,递归复制所有层级,完全独立
deep = copy.deepcopy(source)

# 修改原列表的内层元素
source[1][0] = "updated"

print(shallow)  # 内层列表会一起变
print(deep)     # 深拷贝保持独立

元组 tuple

point = (10, 20)
# 元组不可变,适合表示一组固定数据。

元组和列表长得很像,但有一个关键区别:元组一旦创建,通常不能再原地修改。

只有一个元素的元组,必须带上逗号。

a_tuple = (2,)
not_tuple = (2)

print(type(a_tuple))   # <class 'tuple'>
print(type(not_tuple)) # <class 'int'>

也就是说,(2) 只是普通括号表达式,(2,) 才是单元素元组。

字典 dict

phone_book = {"Tom": 123, "Jerry": 456, "Kim": 789}

print(phone_book["Tom"])        # 123
print(phone_book.get("Jack"))   # None,键不存在也不会报错
print("Tom" in phone_book)      # True,判断键是否存在

phone_book["Tom"] = 999         # 修改
phone_book["Heath"] = 888       # 新增
print(phone_book)

for name, number in phone_book.items():
    print(name, number)         # 遍历字典的键值对

del phone_book["Tom"]           # 删除指定键
print(phone_book)

phone_book.clear()              # 清空整个字典
print(phone_book)               # {}

可以先这样区分:

  • del phone_book["Tom"]:删除某一个键值对
  • phone_book.clear():清空字典内容,但字典对象本身还在
  • del phone_book:删除整个变量名绑定,后续再访问会报错

集合 set

集合最常见的用途就是去重与集合运算。

两个很容易混淆的点:

  • {3, 5} 是一个集合
  • {} 不是空集合,而是空字典
  • 真正的空集合要写成 set()
a_set = {3, 5}
b_set = set(range(8, 14))
c_set = set([1, 2, 3])
d_set = set({"a": 1, "b": 2}.items())
empty_set = set()

left = {1, 2, 3, 4, 5, 6}
right = {5, 6, 7, 8, 9}

print(left & right)                # 交集,等价于 left.intersection(right)
print(left | right)                # 并集,等价于 left.union(right)
print(left - right)                # 差集,等价于 left.difference(right)

集合的增删查

可以先把集合理解成:无序、元素不重复、适合做成员判断

最常见的操作包括:

  • :使用 add() 添加单个元素,使用 update() 一次加入多个元素
  • :使用 in / not in 判断元素是否存在
  • :使用 remove()discard()pop()clear() 删除元素
numbers = {1, 2, 3}

# 增:添加单个元素
numbers.add(4)
print(numbers)

# 增:一次加入多个元素
numbers.update([5, 6])
print(numbers)

# 查:判断元素是否存在
print(3 in numbers)        # True
print(10 not in numbers)   # True

# 删:删除指定元素,不存在时会报错
numbers.remove(6)
print(numbers)

# 删:删除指定元素,不存在时不会报错
numbers.discard(10)
print(numbers)

# 删:随机删除并返回一个元素
removed_item = numbers.pop()
print(removed_item)
print(numbers)

# 删:清空整个集合
numbers.clear()
print(numbers)             # set()