当前版本:
- Python 3.8.4
简介
for 循环是一种重复执行特定代码块的控制流结构。它可以遍历序列(例如列表、元组、字符串)或其他可迭代对象(例如字典、集合)中的元素。每次迭代循环时,会将元素赋值给一个变量,然后执行循环体内的代码。
本篇文章会从 for 循环的基本到应用详细介绍,包括基本用法、迭代对象和面试题。
文章目录如下
1. for循环的作用
2. for循环的语法
2.1. 基本写法
2.2. 跳出循环体
2.3. 单行写法
3. for循环的迭代对象
3.1. 遍历字符串
3.2. 遍历整数
3.3. 遍历列表
3.4. 遍历元组
3.5. 遍历字典
3.6. 遍历集合
3.7. 遍历元素索引
4. 常见面试题
4.1. 整数求和
4.2. 九九乘法表
4.3. 冒泡排序
4.4. 求水仙花数
4.5. 佩波纳契数列
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