💡 课堂例题
第 5 章 · 序列 · 共 10 题 · 代码均取自课堂讲稿
1
字符串的创建与转义
演示单引号、双引号、三引号创建字符串,以及转义字符(\\n、\\t)和原始字符串(r'')的用法。
python
s1 = 'hello, world!'
s2 = "你好,世界!❤️"
s3 = '''hello,
wonderful
world!'''
print(s1)
print(s2)
print(s3)
# 转义字符
s1 = '\'hello, world!\''
s2 = '\\hello, world!\\'
print(s1) # 'hello, world!'
print(s2) # \hello, world!\
# 原始字符串(r开头,\不再表示转义)
s1 = '\\it \\is \\time \\to \\read \\now'
s2 = r'\it \is \time \to \read \now'
print(s1)
print(s2)
2
ord() 和 chr() — 字符编码转换
ord() 获取字符的 Unicode 编码,chr() 将编码转回字符。演示八进制、十六进制、Unicode 编码表示。
python
# ord()获取字符编码
print(ord('A')) # 65
print(ord('中')) # 20013
# chr()编码转字符
print(chr(66)) # 'B'
print(chr(25991)) # '文'
# 八进制和十六进制表示
s1 = '\141\142\143\x61\x62\x63'
print(s1) # abcabc
# Unicode编码表示
s2 = '\u7a0b \u5e8f \u8bbe \u8ba1'
print(s2) # 程 序 设 计
# encode()编码为bytes
print('中'.encode('utf-8')) # b'\xe4\xb8\xad'
print('ABC'.encode('ascii')) # b'ABC'
print(len('中')) # 1 — 一个字符
print(len('中'.encode('utf-8'))) # 3 — UTF-8占3字节
3
字符串运算:拼接、比较、成员、切片
演示 + 拼接、* 重复、比较运算(逐字符比编码)、in/not in 成员运算、索引和切片操作。
python
# 拼接和重复
s1 = 'hello' + ', ' + 'world'
print(s1) # hello, world
print('!' * 3) # !!!
# 比较运算(逐字符比较Unicode编码)
print('boy' < 'bad') # False('o'<'a'为False)
print('中' > '文') # False
print(ord('中')) # 20013
print(ord('文')) # 25991
# 成员运算
s1 = 'hello, world'
print('wo' in s1) # True
print('ll' not in s1) # False
print("程序" in "Python 程序设计") # True
# 索引和切片
s = 'abc123456'
print(s[2:5]) # c12
print(s[-7:-4]) # c12
print(s[::2]) # ac246
print(s[::-1]) # 654321cba — 反转字符串
4
字符串方法:查找、替换、拆分、修剪
find/rfind、replace、split/join、strip/lstrip/rstrip、startswith/endswith、isdigit/isalpha 等常用方法。
python
# 查找
s = 'hello, world!'
print(s.find('or')) # 8
print(s.find('or', 9)) # -1(没找到)
print(s.rfind('o')) # 7(逆向查找)
# 性质判断
s = 'abc123456'
print(s.startswith('hel')) # True
print(s.endswith('!')) # True
print(s.isdigit()) # False
print(s.isalnum()) # True
# 修剪
s1 = ' jackfrued@126.com '
print(s1.strip()) # jackfrued@126.com
s2 = '~你好,世界~'
print(s2.lstrip('~')) # 你好,世界~
print(s2.rstrip('~')) # ~你好,世界
# 替换
s = 'hello, good world'
print(s.replace('o', '@')) # hell@, g@@d w@rld
print(s.replace('o', '@', 1)) # hell@, good world
# 拆分与合并
s = 'I love you'
words = s.split()
print(words) # ['I', 'love', 'you']
print('~'.join(words)) # I~love~you
s = 'I#love#you#so#much'
words = s.split('#', 2)
print(words) # ['I', 'love', 'you#so#much']
5
列表基本操作:创建、索引、切片
列表使用 [] 定义,支持多种数据类型混合。list() 函数可将其他序列转为列表。演示索引、切片、修改元素。
python
# 创建列表
list1 = [35, 12, 99, 68, 55, 35, 87]
list2 = ['Python', 'Java', 'Go', 'Kotlin']
list3 = [100, 12.3, 'Python', True]
# list()函数转换
list4 = list(range(1, 10)) # [1,2,3,4,5,6,7,8,9]
list5 = list('hello') # ['h','e','l','l','o']
# 切片操作
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(arr[:]) # 全部
print(arr[::2]) # [1, 3, 5, 7, 9] — 步长为2
print(arr[::-1]) # [10,9,8,7,6,5,4,3,2,1] — 反转
print(arr[3:8]) # [4, 5, 6, 7, 8]
print(arr[2:8:2]) # [3, 5, 7]
print(arr[-2:-6:-2]) # [9, 7] — 负步长从右向左
# 索引修改元素
list1 = ['苹果', '香蕉', '西瓜', '梨子', '葡萄']
list1[2] = '哈密瓜'
print(list1) # ['苹果', '香蕉', '哈密瓜', '梨子', '葡萄']
# 切片修改
list1[1:3] = ['白菜', '萝卜']
print(list1) # ['苹果', '白菜', '萝卜', '梨子', '葡萄']
6
列表对象方法:增删改查
append/insert/extend 添加,remove/pop/del/clear 删除,sort/reverse 排序反转,count/index 统计查找,copy 浅拷贝。
python
# 添加元素
arr = []
arr.append(1) # 表尾添加
arr.insert(1, 4) # 指定位置插入
arr.extend([5, 6, 7]) # 扩展序列
languages = ['Python', 'Java', 'C++']
languages.append('JavaScript')
languages.insert(1, 'SQL')
print(languages) # ['Python', 'SQL', 'Java', 'C++', 'JavaScript']
# 删除元素
arr4 = [1, 2, 3, 1, 2, 3, 1, 2, 3]
arr4.remove(1) # 删除第一次出现的1
print(arr4.pop(1)) # 删除角标1的元素并返回
print(arr4.pop()) # 删除表尾元素并返回
del arr4[3] # del删除(不返回值)
arr4.clear() # 清空
# 排序和反转
arr5 = [5, 4, 9, 1, 8, 2, 3, 7, 6]
arr5.sort() # 升序 [1,2,3,4,5,6,7,8,9]
arr5.sort(reverse=True) # 降序
arr5.reverse() # 反转
# count和index
arr6 = [1, 2, 3, 1, 2, 3, 1, 1, 1]
print(arr6.count(1)) # 5
print(arr6.index(3)) # 2
# 浅拷贝
arr1 = [1, 2, [3, 4, 5]]
arr2 = arr1.copy()
arr1[2][1] = 666
print(arr1) # [1, 2, [3, 666, 5]]
print(arr2) # [1, 2, [3, 666, 5]] — 嵌套列表共享!
7
列表生成式与嵌套列表
列表生成式用一行代码替代 for 循环创建列表。嵌套列表表示矩阵/表格结构。
python
# 普通方式:创建1-99中能被3或5整除的数
items = []
for i in range(1, 100):
if i % 3 == 0 or i % 5 == 0:
items.append(i)
# 列表生成式:一行搞定
items = [i for i in range(1, 100) if i % 3 == 0 or i % 5 == 0]
# 平方列表
nums1 = [35, 12, 97, 64, 55]
nums2 = [num ** 2 for num in nums1]
print(nums2) # [1225, 144, 9409, 4096, 3025]
# 过滤
nums2 = [num for num in nums1 if num > 50]
print(nums2) # [97, 64, 55]
# 嵌套列表:5个学生3门课成绩
scores = [[95, 83, 92], [80, 75, 82], [92, 97, 90],
[80, 78, 69], [65, 66, 89]]
print(scores[0]) # [95, 83, 92]
print(scores[0][1]) # 83
# 用生成式创建嵌套列表
import random
scores = [[random.randrange(60, 101) for _ in range(3)]
for _ in range(5)]
8
元组:打包、解包与星号表达式
元组是不可变类型,支持打包解包操作。星号表达式可让一个变量接收多个值。演示 Python 特有的变量交换。
python
# 创建元组
t1 = (35, 12, 98)
t2 = ('骆昊', 45, True, '四川成都')
print(type(t1)) #
# 一元组必须加逗号
b = ('hello') # 这是字符串!
d = ('hello',) # 这是一元组!
# 打包操作
a = 1, 10, 100
print(type(a)) #
# 解包操作
i, j, k = a
print(i, j, k) # 1 10 100
# 星号表达式
a = 1, 10, 100, 1000
i, j, *k = a
print(i, j, k) # 1 10 [100, 1000]
i, *j, k = a
print(i, j, k) # 1 [10, 100] 1000
*i, j = a
print(i, j) # [1, 10, 100] 1000
# 解包语法对所有序列都成立
a, *b, c = 'hello'
print(a, b, c) # h ['e', 'l', 'l'] o
# Python特有:优雅的变量交换
a, b = b, a # 无需中间变量!
a, b, c = b, c, a # 三个变量轮换
9
集合:创建、去重与集合运算
集合自动去重、无序,不支持索引。演示交集&、并集|、差集-、对称差^ 以及子集/超集判断。
python
# 集合自动去重
set1 = {1, 2, 3, 3, 3, 2}
print(set1) # {1, 2, 3}
set2 = set('hello')
print(set2) # {'h', 'e', 'l', 'o'}
# 集合运算
set1 = {1, 2, 3, 4, 5, 6, 7}
set2 = {2, 4, 6, 8, 10}
print(set1 & set2) # {2, 4, 6} — 交集
print(set1 | set2) # {1,2,3,4,5,6,7,8,10} — 并集
print(set1 - set2) # {1, 3, 5, 7} — 差集
print(set1 ^ set2) # {1,3,5,7,8,10} — 对称差
# 复合赋值
set1 |= set2 # 并集更新
set1 &= {3, 6, 9} # 交集更新
# 子集与超集
set1 = {1, 3, 5}
set2 = {1, 2, 3, 4, 5}
print(set1 < set2) # True — 真子集
print(set2 > set1) # True — 超集
print(set1.issubset(set2)) # True
# 集合方法
set1 = {1, 10, 100}
set1.add(1000) # 添加
set1.discard(10) # 删除(安全)
set1.remove(100) # 删除(不存在报错)
set1.clear() # 清空
# frozenset不可变集合
fset = frozenset({1, 3, 5, 7})
10
字典:创建、操作与应用
字典以键值对存储数据。演示创建方式(字面量/dict/zip/生成式)、索引运算、get/keys/values/items 方法、update 合并、以及统计应用。
python
# 创建字典
person = {
'name': '王大锤', 'age': 55,
'height': 168, 'weight': 60,
'addr': '成都市武侯区科华北路62号1栋101'
}
# dict()和zip()创建
person = dict(name='王大锤', age=55)
items1 = dict(zip('ABCDE', '12345'))
print(items1) # {'A':'1','B':'2','C':'3','D':'4','E':'5'}
# 字典生成式
items3 = {x: x ** 3 for x in range(1, 6)}
print(items3) # {1:1, 2:8, 3:27, 4:64, 5:125}
# 添加/修改
person["爱好"] = "Python编程"
person.update({"身高": 180, "体重": 75})
# 安全取值 get()
print(person.get('sex')) # None
print(person.get('sex', True)) # True — 默认值
# 遍历
for key, value in person.items():
print(f'{key}:\t{value}')
# 合并字典
person1 = {'name': '王大锤', 'age': 55}
person2 = {'age': 25, 'addr': '成都市...'}
person1.update(person2)
# Python 3.9+: person1 |= person2
# 应用:统计字母出现次数
sentence = input('请输入一段话: ')
counter = {}
for ch in sentence:
if 'A' <= ch <= 'Z' or 'a' <= ch <= 'z':
counter[ch] = counter.get(ch, 0) + 1
sorted_keys = sorted(counter, key=counter.get, reverse=True)
for key in sorted_keys:
print(f'{key} 出现了 {counter[key]} 次.')