💡 课堂例题

第 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]} 次.')