当前版本:
- Python 3.8.4
简介
for 循环是一种重复执行特定代码块的控制流结构。它可以遍历序列(例如列表、元组、字符串)或其他可迭代对象(例如字典、集合)中的元素。每次迭代循环时,会将元素赋值给一个变量,然后执行循环体内的代码。
本篇文章会从 for 循环的基本到应用详细介绍,包括基本用法、迭代对象和面试题。
文章目录如下
1. for循环的作用
python 中的 for 循环提供了一种便捷且高效的方式来处理数据集合,能够以一种简单的语法结构遍历和处理数据,节省了编写代码的时间和精力。同时,for 循环也使得代码更加可读性强、易于理解和维护,提高了程序的可靠性和可扩展性。
举例说明,需要单独处理数字1、2、4、7、8
print("处理数字:1")
print("处理数字:2")
print("处理数字:4")
print("处理数字:7")
print("处理数字:8")
使用 print 举例说明(在实际场景中一般是调用函数处理),如果不使用循环则需要编写5行代码。当需要处理上万行数据时,还能手动去写吗?显然不太现实,所以循环的方式为我们解决了这个问题。使用 for 循环来处理仅需2行代码:
for i in "12478":
print(f"处理数字:{i}")
需要注意的是:for 循环的语法要求迭代对象必须是一个可迭代对象,例如列表、字符串、字典等。不支持直接在 for 循环中直接使用数值或空格分隔的数值。错误的写法:
for i in 12478:
print(f"处理数字:{i}")
当然了,遍历出来的变量并不会因为循环的结束而销毁。例如:循环结束后查看变量 i
# 循环遍历字符串
for i in "12478":
pass # 占位符,什么也不做
# 这行代码不在循环中
print(f"当前i的值为:{i}")
- 遍历的最后一个字符为8,所以变量 i 的最终值就是8
2. for循环的语法
2.1. 基本写法
语法如下:
# for循环遍历一个可迭代对象
for 变量名 in 迭代对象:
循环体
- for in 和冒号是固定的语法,不可修改。
- 迭代对象:俗称被处理的对象,可以是字符串、列表...等。
- 变量名:自定义的一个名称,将迭代对象遍历出来的值赋值给变量,用于后续处理。
- 循环体:必须被包含在循环内,需要比 for 多一个缩进。
将迭代对象理解为一筐苹果,每个苹果都需要检查是否完好,如果苹果是好的,则可以售卖;如果苹果是坏的,则扔掉。
for 循环可以理解为:将一筐苹果的每一个苹果都拿出来,逐个处理。那么拿出来的这个苹果需要有一个名字,我们将其定义为变量名。有了名字后我们需要检查、处理,处理的方法需要在循环体中进行。
为什么循环体必须用缩进呢?
实际上缩进的目的是提供代码的可读性和结构化,使用缩进能够清晰地区分出循环中的代码块,并使代码更易于理解和维护。比如多层嵌套(错误语法):
for i in "AAA":
for j in "BBB":
print("处理事件1")
print("处理事件2")
这样看起来是不是有点头大,如果是更多层级则更是分不清,换成正确的写法:
for i in "AAA": # 第1层循环
for j in "BBB": # 第2层循环
print("处理事件1") # 第2层的循环体
print("处理事件2") # 第1层的循环体
这种写法也称为多层嵌套,理论上嵌套的层数没有限制,但只要理解规则就能掌握:
- 每个for循环都需要有与之对应的缩进代码块,用于表示循环体。
- 当有多个for循环嵌套时,每个内层循环的缩进级别都比外层循环的缩进级别多一个缩进倍数,用于明确表示嵌套关系。
- 循环变量的命名应该不同,以在内层循环中保持唯一性,并在代码中清楚地标识出每个循环的作用。
用多层嵌套举一个房间的例子
for i in "12": # 楼层数
for j in "123": # 每个房间号
print(f"当前房号为:{i}-{j}")
2.2. 跳出循环体
当程序满足某个条件或者达到了预期的目标时,可以跳出循环,避免继续执行不必要的循环迭代,可以提高代码的效率和性能。python 中给出了2种跳出循环的方法:
- break:跳出整个循环
- continue:跳出当前循环
【案例一】跳出整个循环
for i in "12345": # 遍历一组数字
if i == "3": # 当i为3时,跳出整个循环
break
print(f"当前i的值为:{i}")
【案例二】跳出当前循环
for i in "12345": # 遍历一组数字
if i == "3": # 当i为3时,跳出当前循环
continue
print(f"当前i的值为:{i}")
2.3. 单行写法
使用单行表达式的方式来编写 for 循环被称为列表推导(List Comprehension),示例
num = [1, 2, 3, 4, 5]
# 变量 = [循环体 for循环]
squared_num = [x**2 for x in num]
- for 循环语法不变,将循环体放到 for 前面即可。
如果需要使用条件判断,则
num = [1, 2, 3, 4, 5]
# 变量 = [循环体 for循环 if判断]
even_num = [x for x in num if x % 2 == 0]
- for 循环后面写 if 判断,循环体仍然放在最前面
遍历多层嵌套也是一样的写法
[ print(i,j) for i in range(0,2) for j in range(10,12) ]
[ print(i,j,k) for i in range(0,2) for j in range(10,12) for k in range(20,22) ]
注意
单行写法可以提高代码的简洁性和可读性,但过度使用单行写法可能会导致代码变得难以理解和维护。所以在使用单行写法时,需要在简洁性和可读性之间进行权衡,并根据实际情况选择是否使用。
3. for循环的迭代对象
for 循环的迭代对象可以是字符串、整数序列、列表、元组、字典、集合等,本章节将对这几种迭代对象展开介绍。
3.1. 遍历字符串
for 循环可以直接遍历字符串
for i in "1a+bc": # 遍历字符串
print(f"当前字符为:{i}")
也支持遍历为字符串的变量
var = "1a+bc"
for i in var: # 遍历变量
print(f"当前字符为:{i}")
遍历字符串是逐个遍历,因此空格也会被遍历
for i in "a b c": # 遍历字符串
print(f"当前字符为:{i}")
3.2. 遍历整数
for 循环并不能直接遍历整数,而是需要通过 range 函数生成的一个序列来遍历
range 默认从0开始,范围:0 ~ (结束值-1)
for i in range(3): # 遍历0~2
print(f"当前数字为:{i}")
range 也支持指定开始值和结束值(这个结束值依然是 -1)
for i in range(10,13): # 遍历10~12
print(f"当前数字为:{i}")
也支持指定间隔,比如遍历10~15,间隔2个
for i in range(10,15,2): # 遍历10~14, 间隔2
print(f"当前数字为:{i}")
如果要生成一个列表,可以直接使用 range,不需要循环
numbers = list(range(1, 10, 3))
3.3. 遍历列表
for 可以直接遍历列表中的元素,比如:
# 定义一个列表
L = ["AAA", "B", 1, 2]
# 遍历这个列表
for i in L:
print(f"当前元素为:{i}")
如果列表中包含列表,会将被包含的列表整个遍历出来
# 定义一个列表
L = ["AAA", "B", [1, 2, 3]]
# 遍历这个列表
for i in L:
print(f"当前元素为:{i}")
被包含的列表 [1,2,3] 还能继续遍历
# 定义一个列表
L = ["AAA", "B", [1, 2, 3]]
# 遍历这个列表
for i in L:
if type(i) == list:
# 如果这个元素是列表,则遍历这个元素
for j in i:
print(f"当前元素为:{j}")
else:
print(f"当前元素为:{i}")
3.4. 遍历元组
遍历元组的方法与列表是一样的
# 定义一个元组
T = ("AAA", "B", 1, 2)
# 遍历这个元组
for i in T:
print(f"当前元素为:{i}")
3.5. 遍历字典
字典的元素由键和值组成,所以可以单独遍历,也可以全部遍历
【案例一】遍历键
# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}
# 遍历这个字典的键
for i in D:
print(f"当前键为:{i}")
【案例二】遍历值
# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}
# 遍历这个字典的值
for i in D.values():
print(f"当前值为:{i}")
【案例三】遍历键和值
# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}
# 遍历这个字典
for k,v in D.items():
print(f"当前键为:{k}, 当前值为:{v}")
3.6. 遍历集合
遍历集合的方法与列表是一样的
# 定义一个集合
S = {"AAA", "B", 1, 2}
# 遍历这个集合
for i in S:
print(f"当前元素为:{i}")
需要注意的是:集合是无序的,每次遍历的顺序可能不同。如果需要按照特定的顺序遍历集合,可以使用 sorted()
函数对集合进行排序,然后再进行遍历。
3.7. 遍历元素索引
python 中通过 enumerate() 函数来获取对象的索引,这些对象可以是字符串、列表、元组、字典、集合等。
【案例一】输出元素的同时,也输出索引
# 定义一个列表
L = ["AAA", "B", 1, 2]
# 遍历这个列表和它的索引
for index,item in enumerate(L):
print(f"当前索引为:{index}, 当前元素为:{item}")
【案例二】指定索引的开始值
# 定义一个列表
L = ["AAA", "B", 1, 2]
# 遍历这个列表和它的索引(索引指定从10开始)
for index,item in enumerate(L, start=10):
print(f"当前索引为:{index}, 当前元素为:{item}")
【案例三】遍历字典
# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}
# 遍历这个字典的索引、键、值
for index, (key, value) in enumerate(D.items()):
print(f"索引为:{index}, 键为:{key}, 值为:{value}")
4. 常见面试题
4.1. 整数求和
【案例一】求 1-100 相加的和
# 定义一个为0的变量
s = 0
# 遍历1~100
for i in range(1,101):
# 让这个变量每次加i,也就是用0加上1~100
s += i
# 输出最后的结果
print(s)
【案例二】求 1-100 奇数相加的和
# 定义一个为0的变量
s = 0
# 遍历1~100, 设定间隔2。也就是1.3.5.7...
for i in range(1,101,2):
# 让这个变量每次加i,也就是用0加上1~100的奇数
s += i
# 输出最后的结果
print(s)
【案例三】求 1-100 偶数相加的和
# 定义一个为0的变量
s = 0
# 遍历0~100, 设定间隔2。也就是0.2.4.6...
for i in range(0,101,2):
# 让这个变量每次加i,也就是用0加上0~100的偶数
s += i
# 输出最后的结果
print(s)
4.2. 九九乘法表
# 打印1~9行
for i in range(1, 10):
# 打印每行的列,第1行最大列为1,第2行最大列为2...第9行最大列为9,所以遍历的最大值随上一循环的增加而增加
for j in range(1, i+1):
# 乘积的结果
result = i * j
# 打印 n * n = n 的字符串,并将这里的循环体换行替换为制表符
print(f"{i} * {j} = {result}", end="\t")
print() # 横向打印完成后再换行
4.3. 冒泡排序
冒泡排序就是对一串数字不断对比,将最大的放到最后面,依次类推。
# 定义一个列表
L = [32, 324, 1, 54, 21, 6]
# 通过索引去获取元素,再将这些元素作比较,大的排后面,小的排前面
for i in range(1, len(L)):
for j in range(0, len(L) - i):
if L[j] > L[j+1]:
L[j], L[j+1] = L[j+1],L[j]
print(L)
4.4. 求水仙花数
什么是水仙花数?
一个三位数,这个数 = 个位³ + 十位³ + 百位³
方法一
# 通过索引的方式获取个位数、十位数、百位数,再转换为int相加,做判断
for i in range(100,1000):
i = str(i)
unit = i[0] #个位数
tens = i[1] #十位数
hundredth = i[2] #百位数
if (int(unit)**3 + int(tens)**3 + int(hundredth)**3) == int(i):
print('水仙花数为:', i, end="\t")
print(f"说明:{i} = {unit}³ + {tens}³ + {hundredth}³ = ", int(unit)**3, '+', int(tens)**3, '+', int(hundredth)**3)
方法二
# 通过整除的办法获取个位数、十位数、百位数,所有值的3次幂再相加,做判断
for i in range (100,1000):
unit = i % 10 #个位数
tens = (i // 10) % 10 #十位数
hundredth = i // 100 #百位数
if (unit**3 + tens**3 + hundredth**3) == i:
print('水仙花数为:', i)
4.5. 佩波纳契数列
佩波纳契数列为:第1个数 + 第2个数 = 第3个数,以此类推...
- 例如:1、2、3、5、8...
n1 = 1 #设置第1个数
n2 = 10 #设置第2个数
count = 10 #设置输出次数
for i in range(count):
print(n1, end= ' ')
n3 = n1
n1 = n2
n2 += n3