智泊Python--Day5

智泊Python–Day5

  Day5 是 Python 里最常用的容器——列表(list)。它相当于其它语言里的「数组」,但更灵活:长度可变、可存不同类型、自带一堆好用的方法。这一天信息量很大,重点是吃透索引(含负索引)、**切片 [start:end:step]**(尤其用负步长反转列表)、以及 append/insert/extend/pop/remove/sort 这几个高频方法。最后还补充了 math 和 random 两个数学相关标准库。

 

1.列表的基本使用

  列表用方括号定义,允许存不同类型(但不建议混用,可读性差)。索引用 nums[i],负索引 nums[-1] 表示倒数第一个。遍历有四种姿势:直接 for x in 列表、range(len) 拿索引、enumerate 拿「索引+元素」。切片 是重中之重:[start:end:step],左闭右开,步长为负时从右往左取(反转列表 nums[::-1])。+ 合并列表、* 重复列表、in 判断成员。列表去重则用「新空列表 + 不在则 append」的套路。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 定义:可存不同类型(不推荐混用)
nums = [1, 2, 3, 4, 5]
nums2 = [1, 2, 3, "hello", True]

# 索引(含负索引)
print(nums[0]) # 1
print(nums[-1]) # 5(倒数第一个)

# 长度
print(len(nums)) # 5

# 遍历
for i in nums:
print(i)
for i in range(len(nums)):
print(nums[i])
for i in enumerate(nums):
print(i) # (0, 1) (1, 2) ...

# 修改元素
nums = [10, 20, 30]
nums[0] = 100
print(nums) # [100, 20, 30]

# 切片(左闭右开,step 可负)
nums = [10, 20, 30, 40, 50]
print(nums[:3]) # [10, 20, 30]
print(nums[3:]) # [40, 50]
print(nums[2:5]) # [30, 40, 50]
print(nums[0:5:2]) # [10, 30, 50]
print(nums[5:0:-1]) # [50, 40, 30, 20, 10]
print(nums[::-1]) # [50, 40, 30, 20, 10](反转)

# 合并 + 重复
a, b = [1, 2, 3], [4, 5, 6]
print(a + b) # [1, 2, 3, 4, 5, 6]
print(a * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]

# 成员判断
a = [1, 2, 3, 4, 5]
print(1 in a, 6 in a, 1 not in a, 6 not in a)

# 列表去重
a = [1, 2, 3, 3, 5, 5, 7, 7, 8, 9, 10]
b = []
for i in a:
if i not in b:
b.append(i)
print(b)

 

2.列表的练习

  两个小练习巩固索引与遍历:

  • ① 从 list1 中删除属于 list2 的元素(遍历 list2、命中就 remove)
  • ② 用负索引 names[-2] 或正索引 names[3] 取「黄忠」
  • ③ 输出索引为奇数位置的元素(注意这里「奇数索引」指下标为奇数,不是元素值奇数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 练习1:删除 list1 中属于 list2 的元素
list1 = ['mon', 'sun', 'sat', 'fri', 'thu', 'wed']
list2 = ['sun', 'wed', 'thu']
for i in range(len(list2)):
if list2[i] in list1:
list1.remove(list2[i])
print(list1)

# 练习2:取「黄忠」(倒数第2个 / 正索引第3个)
names = ['鲁班七号', '后裔', '狄仁杰', '黄忠', '孙尚香']
print(names[-2], names[3]) # 黄忠 黄忠

# 练习3:输出索引为奇数的元素
nums = [1, 2, 3, 1, 4, 2, 1, 3, 7, 3, 3]
for i in range(len(nums)):
if nums[i] % 2 == 1:
print(nums[i])

 

3.列表的功能

  列表自带的方法按用途分四类。增:append(n) 末尾加一个、insert(i, n) 指定位置插、extend(可迭代) 合并另一个序列的所有元素。删:pop(i) 按索引删并返回该元素(不填默认删最后一个)、remove(x) 删第一个值等于 x 的元素、clear() 清空。查:index(x) 返回首次出现的下标(没有则报错)、count(x) 统计个数。排序:sort() 原地升序(可 reverse=True 降序)、sorted() 返回新列表不改动原列表;reverse() 原地把列表反转,reversed() 返回反转后的可迭代对象(需 list() 转换)。copy() 是浅拷贝——num1 = num 只是让两个变量指向同一个列表,改一个另一个也变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 增
num = [10, 20, 30]
num.append(40) # [10, 20, 30, 40]
print(num)
num.insert(2, 50) # [10, 20, 50, 30, 40, 50]
print(num)
num.extend([40, 50, 60]) # [10, 20, 50, 30, 40, 50, 40, 50, 60]
print(num)

# 删
num = [10, 20, 30, 40, 50]
n = num.pop() # 50(默认删最后)
n2 = num.pop(2) # 30
print(n, n2, num) # 50 30 [10, 20, 40]

num = [10, 20, 30, 30, 30, 40, 50]
num.remove(30) # 只删第一个 30
print(num) # [10, 20, 30, 30, 40, 50]
print(num.count(30)) # 2
for _ in range(num.count(30)):
num.remove(30)
print(num) # [10, 20, 40, 50]
num.clear()
print(num) # []

# 改与查
num = [10, 20, 30, 40, 50]
num[0] = 100
print(num[0]) # 100
print(num[1:3]) # [20, 30]
num = [10, 20, 20, 30, 20, 40, 50]
print(num.index(20)) # 1(首次出现)

# 排序
num = [80, 30, 40, 70, 50]
num.sort()
print(num) # [30, 40, 50, 70, 80]
num.sort(reverse=True)
print(num) # [80, 70, 50, 40, 30]
print(sorted([80, 30, 40, 70, 50])) # 新列表,不改原值

# 反转
num = [80, 30, 40, 70, 50]
num.reverse()
print(num) # [50, 70, 40, 30, 80]
print(list(reversed(num)))

# 拷贝(浅拷贝)
num = [10, 20, 30, 40, 50]
num1 = num # 同一列表
num2 = num.copy() # 新列表
print(num2)

 

4.列表进阶练习

  三个综合小练:

  • ① 把每个元素翻倍(用索引 nums[i] *= 2,注意这会原地修改原列表)
  • ② append 加末尾、insert(0, x) 插最前
  • ③ 不用 min() 自己实现求最小值——先拿第一个当擂主,遍历比它小的就替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 练习1:每个元素翻倍(原地修改)
nums = [1, 2, 5, 9]
for i in range(len(nums)):
nums[i] *= 2
print(nums) # [2, 4, 10, 18]

# 练习2:末尾追加 + 最前插入
scores = [90, 89, 67, 98, 75, 87, 54, 88]
score1 = int(input("请输入第一个成绩:"))
score2 = int(input("请输入第二个成绩:"))
scores.append(score1)
scores.insert(0, score2)
print(scores)

# 练习3:自己实现 min()
nums = [90, 89, 67, 98, 75, 87, 54, 88]
min_val = nums[0]
for i in range(len(nums)):
if nums[i] < min_val:
min_val = nums[i]
print(min_val) # 54

 

5.math 数学操作

  内置函数 sum/max/min/round/abs/pow 直接可用;math 标准库补充了更专业的数学能力:math.pi、math.e、math.inf(无穷大)、sqrt(开方)、factorial(阶乘)、ceil/floor(上下取整)、log/log10(对数)。写数值相关程序时这两个是常客。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(sum(nums)) # 45
print(max(nums), min(nums)) # 9 1
print(round(3.1415926, 2)) # 3.14
print(abs(-10)) # 10
print(pow(2, 3)) # 8

import math
print(math.e) # 2.718281828459045
print(math.pi) # 3.141592653589793
print(math.inf, -math.inf) # 1e+308 -1e+308
print(math.sqrt(9)) # 3.0
print(math.factorial(5)) # 120
print(math.ceil(3.1415926)) # 4(向上取整)
print(math.floor(3.1415926)) # 3(向下取整)
print(math.log(math.e)) # 1.0(自然对数)
print(math.log10(100)) # 2.0

 

6.random 随机数

  random 标准库生成各类随机数:choice 从序列随机取一个、randint(a,b) 是闭区间 [a,b]、randrange(a,b) 是左闭右开 [a,b) 且可指定步长、random() 返回 [0,1) 浮点、uniform(a,b) 返回 [a,b] 浮点、shuffle 原地打乱列表。做小游戏、抽样、验证码时极常用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import random

# 随机选一个元素
girl_friends = ["刘亦菲", "杨幂", "迪丽热巴", "王祖贤"]
print(random.choice(girl_friends))
print(random.choice("abc"))
print(random.choice(range(1, 7)))

# 闭区间 [1,10]
print(random.randint(1, 10))

# 左闭右开 [1,10),可指定步长
print(random.randrange(1, 10))
print(random.randrange(1, 10, 2)) # 1~9 的奇数中随机

# 0~1 随机浮点
print(random.random())
print(1 + random.random() * 9) # 1~10 随机浮点

# 指定范围随机浮点
print(random.uniform(1, 10))

# 打乱列表(原地)
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(nums)
print(nums)

 

7.作业

  names 列表的一系列综合操作,覆盖插入、改名、合并、切片等。注意 extend 是原地合并且返回 None——所以 print(names.extend(...)) 会打印 None;想看到合并结果要分开写:先 names.extend(...) 再 print(names)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# a. 在 feifei 前插入 alex
names = ['jeff', 'rain', 'jack', 'lucy', 'lance', 'feifei']
for i in range(len(names)):
if names[i] == 'feifei':
names.insert(i, 'alex')
print(names)

# b. 把 lucy 改为中文「路西」
for i in range(len(names)):
if names[i] == 'lucy':
names[i] = '路西'
print(names)

# c. 在 rain 后插入一个子列表
num2 = ['one', 'null', 'pointer']
for i in range(len(names)):
if names[i] == 'rain':
names.insert(i + 1, num2)
print(names)

# d. 返回 lance 的索引
print(names.index('lance'))

# e. 合并新列表(extend 返回 None,分开写)
names_new = ["喜羊羊", "慢羊羊", "灰太狼", "小灰灰"]
names.extend(names_new)
print(names)

# f. 取索引 4~7(左闭右开)的 4 个元素
print(names[4:8])

# g. 取索引 2~10、步长 2 的元素
print(names[2:10:2])

# h. 取最后 3 个元素
print(names[-3:])

智泊Python--Day5
https://one-null-pointer.github.io/2026/07/24/智泊Python--Day5/
Author
liaoyue
Posted on
July 24, 2026
传送口