类型 | 是否有序 | 是否可变 | 重复元素 | 特点 |
列表List [] | 有序 | 可变 | 允许重复 | 可以随时增删改里面的元素 |
元组Tuple() | 有序 | 不可变 | 允许重复 | 创建后内容不能修改,安全性更高 |
字典Dict {键:值} | 有序(Python 3.7+) | 可变 | 键不能重复 | 靠键索引取值,存键值对数据 |
集合Set{} | 无序 | 可变 | 不允许重复 | 自动去重,适合做交集并集等运算 |
数字Numbers | — | 不可变 | — | 整数、浮点数、复数等 |
字符串String | 有序 | 不可变 | 允许重复 | 创建后不能修改内部内容 |
不可变数据:数字、字符串、元组—— 创建后内容无法修改
案例1:数字
a = 10print("修改前 a =", a)print("修改前 id(a) =", id(a))a = 20 # 看起来"改了",实际上是重新创建了新对象print("修改后 a =", a)print("修改后 id(a) =", id(a))
运行结果:
案例2:字符串
s = "hello"print("修改前 s =", s)print("修改前 id(s) =", id(s))# s[0] = "H" ← 这行如果去掉注释会报错:'str' object does not support item assignments = s + " world" # 看起来"改了",实际上是创建了新字符串print("修改后 s =", s)print("修改后 id(s) =", id(s))
运行结果:
案例3:元组
t = (1, 2, 3)print("修改前 t =", t)print("修改前 id(t) =", id(t))# t[0] = 999 ← 这行如果去掉注释会报错t = (1, 2, 3, 4) # 重新赋值,创建了新元组print("修改后 t =", t)print("修改后 id(t) =", id(t))
运行结果:
可变数据:列表、字典、集合—— 能直接修改内部元素
案例4:列表
lst = [1, 2, 3]print("修改前 lst =", lst)print("修改前 id(lst) =", id(lst))lst[0] = 999 # 直接修改第一个元素lst.append(4) # 添加新元素print("修改后 lst =", lst)print("修改后 id(lst) =", id(lst))
运行结果:
案例5:字典
d = {"name": "小明", "age": 18}print("修改前 d =", d)print("修改前 id(d) =", id(d))d["age"] = 19 # 修改已有键的值d["city"] = "上海" # 新增键值对print("修改后 d =", d)print("修改后 id(d) =", id(d))
运行结果:
案例6:集合
s = {1, 2, 3}print("修改前 s =", s)print("修改前 id(s) =", id(s))s.add(4) # 添加元素s.remove(2) # 删除元素print("修改后 s =", s)print("修改后 id(s) =", id(s))
运行结果:
运算类别 | 运算符 | 说明 |
算术运算 | + - * / // % ** | 加减乘除、整除、取余、幂运算 |
关系运算 | == != > < >= <= | 等于、不等于、大于、小于、大于等于、小于等于(比较大小,返回布尔值) |
逻辑运算 | and or not | 与、或、非(真假判断) |
赋值运算 | = += -= *= /= //= %= **= | 赋值、加等于、减等于、乘等于、除等于、整除等于、取余等于、幂等于 |
成员运算 | in not in | 在...里面、不在...里面(判断元素是否在容器里) |
身份运算 | is is not | 是同一个对象、不是同一个对象(判断两个变量是否指向同一对象(不是值相等)) |
列表专属 | + * | + 拼接两个列表,* 重复列表内容 |
集合专属 | & | ^ - | 交、并、补(对称差)、差运算 |
案例1:算术运算
# 算术运算符a = 10b = 3print("a + b =", a + b) # 13print("a - b =", a - b) # 7print("a * b =", a * b) # 30print("a / b =", a / b) # 3.3333333333333335(浮点数)print("a // b =", a // b) # 3(整除,向下取整)print("a % b =", a % b) # 1(余数)print("a ** b =", a ** b) # 1000(10的3次方)# 注意:// 是向下取整(向负无穷方向取整)print("10 // 3 =", 10 // 3) # 3print("-10 // 3 =", -10 // 3) # -4(不是 -3,因为 -3.33 向下取整是 -4)
案例2:比较运算符
# 比较运算符(返回布尔值 True / False)x = 10y = 20print("x == y:", x == y) # Falseprint("x != y:", x != y) # Trueprint("x > y:", x > y) # Falseprint("x < y:", x < y) # Trueprint("x >= 10:", x >= 10) # Trueprint("x <= 5:", x <= 5) # False# 字符串也可以比较(按字母顺序,即 ASCII 码)print("'apple' < 'banana':", "apple" < "banana") # True(a 在 b 前面)print("'Apple' < 'apple':", "Apple" < "apple") # True(大写 A 的 ASCII 码小于小写 a)
案例3:逻辑运算符
# 逻辑运算符a = Trueb = Falseprint("a and b:", a and b) # False(两个都真才真)print("a or b:", a or b) # True(至少一个真就真)print("not a:", not a) # False(取反)print("not b:", not b) # True(取反)# 结合比较运算符使用age = 18score = 85# 判断:年龄大于等于 18 并且 分数大于 80result = (age >= 18) and (score > 80)print("是否成年且优秀:", result) # True# 判断:年龄小于 12 或者 年龄大于 60age2 = 65is_child_or_elder = (age2 < 12) or (age2 > 60)print("是否儿童或老人:", is_child_or_elder) # True
案例4:赋值运算
# 赋值运算符num = 10print("初始 num =", num) # 10num += 5 # 等价于 num = num + 5print("num += 5 后:", num) # 15num -= 3 # 等价于 num = num - 3print("num -= 3 后:", num) # 12num *= 2 # 等价于 num = num * 2print("num *= 2 后:", num) # 24num /= 4 # 等价于 num = num / 4print("num /= 4 后:", num) # 6.0(浮点数)num //= 2 # 等价于 num = num // 2print("num //= 2 后:", num) # 3.0num %= 2 # 等价于 num = num % 2print("num %= 2 后:", num) # 1.0num **= 3 # 等价于 num = num ** 3print("num **= 3 后:", num) # 1.0
案例5:成员运算
# 成员运算符(用于列表、元组、字符串、字典、集合等)# 列表fruits = ["apple", "banana", "orange"]print("'apple' in fruits:", "apple" in fruits) # Trueprint("'grape' in fruits:", "grape" in fruits) # Falseprint("'grape' not in fruits:", "grape" not in fruits) # True# 字符串text = "hello world"print("'world' in text:", "world" in text) # Trueprint("'python' in text:", "python" in text) # False# 字典(判断的是键,不是值)person = {"name": "小明", "age": 18}print("'name' in person:", "name" in person) # True(判断键)print("'age' in person:", "age" in person) # True(判断键)print("'小明' in person:", "小明" in person) # False(判断键,不是值)print("'小明' in person.values():", "小明" in person.values()) # True(判断值)
案例6:身份运算符
a = 100b = 100print("a is b:", a is b) # True(指向同一对象)print("a is not b:", a is not b) # False
案例7:+ 拼接两个列表
# 列表拼接:将两个列表合并成一个新列表list1 = [1, 2, 3]list2 = [4, 5, 6]result = list1 + list2print("list1 + list2 =", result) # [1, 2, 3, 4, 5, 6]# 原列表没有被修改print("原 list1 不变:", list1) # [1, 2, 3]print("原 list2 不变:", list2) # [4, 5, 6]# 字符串列表也可以拼接names1 = ["小明", "小红"]names2 = ["小刚", "小丽"]all_names = names1 + names2print("所有名字:", all_names) # ['小明', '小红', '小刚', '小丽']# 混合类型也可以拼接(但一般不推荐)mixed = [1, "hello", True] + [3.14, False]print("混合拼接:", mixed) # [1, 'hello', True, 3.14, False]
案例8:* 重复列表内容
# 列表重复:将列表内容重复 N 次list1 = [1, 2, 3]result1 = list1 * 2print("list1 * 2 =", result1) # [1, 2, 3, 1, 2, 3]result2 = list1 * 3print("list1 * 3 =", result2) # [1, 2, 3, 1, 2, 3, 1, 2, 3]# 原列表没有被修改print("原 list1 不变:", list1) # [1, 2, 3]# 可以用来快速初始化列表zeros = [0] * 5print("5个0:", zeros) # [0, 0, 0, 0, 0]stars = ["*"] * 10print("10个星号:", stars) # ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*']# ⚠️ 注意:重复列表中的可变元素是浅拷贝(引用同一个对象)matrix = [[0]] * 3print("初始 matrix:", matrix) # [[0], [0], [0]]matrix[0][0] = 1print("修改后 matrix:", matrix) # [[1], [1], [1]] ← 三个子列表都变了!# 因为三个 [0] 是同一个对象,复制的是引用# 正确做法:用列表推导式创建独立的子列表matrix2 = [[0] for _ in range(3)]matrix2[0][0] = 1print("正确做法 matrix2:", matrix2) # [[1], [0], [0]] ← 只有第一个变了
案例9:&交集(两个集合共有的元素)
set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}# 交集:两个集合中都存在的元素intersection = set1 & set2print("set1 & set2 =", intersection) # {4, 5}# 等价写法intersection2 = set1.intersection(set2)print("intersection() 方法:", intersection2) # {4, 5}# 多个集合的交集set3 = {4, 5, 9, 10}result = set1 & set2 & set3print("三个集合交集:", result) # {4, 5}# 无交集的情况result = {1, 2, 3} & {4, 5, 6}print("无交集:", result) # set()(空集合)
案例10:| 并集(两个集合的所有元素,去重)
set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}# 并集:两个集合的所有元素(重复的只保留一个)union = set1 | set2print("set1 | set2 =", union) # {1, 2, 3, 4, 5, 6, 7, 8}# 等价写法union2 = set1.union(set2)print("union() 方法:", union2) # {1, 2, 3, 4, 5, 6, 7, 8}# 多个集合的并集set3 = {100, 200}result = set1 | set2 | set3print("三个集合并集:", result) # {1, 2, 3, 4, 5, 6, 7, 8, 100, 200}
案例11: ^ 对称差(补集):只在其中一个集合中的元素
set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}# 对称差:去掉共有的,保留各自独有的symmetric_diff = set1 ^ set2print("set1 ^ set2 =", symmetric_diff) # {1, 2, 3, 6, 7, 8}# 解释:4和5是共有的被去掉,1,2,3只属于set1,6,7,8只属于set2# 等价写法symmetric_diff2 = set1.symmetric_difference(set2)print("symmetric_difference() 方法:", symmetric_diff2) # {1, 2, 3, 6, 7, 8}# 多个集合的对称差(按顺序依次计算)set3 = {1, 8, 9}result = set1 ^ set2 ^ set3print("三个集合对称差:", result) # {2, 3, 6, 7, 9}# 一步步算:# (set1 ^ set2) = {1,2,3,6,7,8}# ({1,2,3,6,7,8} ^ set3) = {2,3,6,7,9}
案例12:- 差集:在第一个集合但不在第二个集合中的元素
set1 = {1, 2, 3, 4, 5}set2 = {4, 5, 6, 7, 8}# 差集:属于 set1 但不属于 set2 的元素difference = set1 - set2print("set1 - set2 =", difference) # {1, 2, 3}# set2 - set1 结果不同(不对称)difference2 = set2 - set1print("set2 - set1 =", difference2) # {6, 7, 8}# 等价写法diff1 = set1.difference(set2)diff2 = set2.difference(set1)print("difference() 方法 diff1:", diff1) # {1, 2, 3}print("difference() 方法 diff2:", diff2) # {6, 7, 8}# 多个集合的差集(从左到右依次计算)set3 = {1, 2, 10}result = set1 - set2 - set3print("多个集合差集:", result) # {3}# 解释:set1 - set2 = {1,2,3},再减 set3 = {3}
多年前端开发实战经验,坚持原创技术分享。擅长前端与 UI 设计融合,熟练运用 AI 提升开发效率,为不同阶段开发者提供可落地的思路与技巧。