[Python学习日记-12] Python中的流程控制(for)
[Python学习日记-12] Python中的流程控制(for)
简介
for 语法
break 和 continue 语法(与 while 相同)
for ... else ... 语法
exit() 函数和 pass 语句
while 和 for 的比较
简介
在[Python学习日记-11] Python中的流程控制(while)中学习了 while 循环的使用方法,其实Python 还提供了另外一个循环结构就是 for 循环,Python 提供的 for 循环语句和 Java、C++ 等编程语言提供的 for 语句不同,Python 中的 for 循环更像是 shell 或是脚本语言中的 foreach 循环。它可以遍历如列表、元组、字符串、Dictionary(字典)等序列成员(列表、元组、字符串、字典也称为等序列),也可以用在列表解析和生成器表达式中。下图为 while 条件循环和 for 遍历循环
for 语法
一、语法结构
Python 中的 for 循环主要是序列遍历的形式,其中可迭代序列指的是可迭代(iterable)性数据(容器类型数据、range 对象、迭代器),即列表、元组、字符串、Dictionary(字典)等
for 元素 in 可迭代序列(iterable): # in 为关键字
执行代码...
二、for 循环的嵌套
在 Python 当中是允许序列嵌套,例如 [1,2,[1,2,3],4,5] 这种形式,那么我们应该如何使用 for 循环来全部取出呢?这就需要用到 for 循环的嵌套了
for 元素1 in 可迭代序列(iterable):
for 元素2 in 元素1:
执行代码...
当然这里简简单单的 for 循环嵌套并不能很好的遍历出列表中的所有元素还需要在嵌套当中判断是否为序列才可以完成遍历,下面我们看看不同的遍历方法吧
1、遍历不等长多级序列
list = [1,2,3,4,("张三","李四",{"王五","小猪佩奇"})]# 第一次循环:[1,2,3,4,("张三","李四",{"王五","小猪佩奇"})]
for i in list:# 判断当前元素是否为元组,如果是则进入第二次循环,否则直接打印if isinstance(i,tuple):# 第二次循环:("张三","李四",{"王五","小猪佩奇"})for j in i:# 判断当前元素是否为集合,如果是则进入第三次循环,否则直接打印if isinstance(j,set):# 第三次循环:{"王五","小猪佩奇"}for k in j:print(k)else:print(j)else:print(i)
2、 遍历等长的序列
# 遍历等长的序列一定要注意序列当中的元素必须是等长的
list = [(1,2,3),("张三","李四","王五"),{"佩奇老妈","小猪佩奇","老猪佩奇"}]# 一次循环把序列当中嵌套的元素全部打印
for a,b,c in list:print(a,b,c)
3、迭代字符串
# 迭代字符串
for letter in 'Python':print('当前字母 :',letter, end=' ')
三、变量的解包
解释列表循环 for i in name
如果对 Java、C、C++ 等其他编程语言有了解的话其实都会有一个疑问,为什么 Python 中的序列循环会那么简单呢?这是因为 Python 中有一个特性,那就是变量的解包,换句话说就是列表、元组、字符串、Dictionary(字典)等序列成员在 Python 看来都是分开一个个的,下面我们以代码来讲解这个变量解包到底是怎么回事
# 字符串的解包
a,b,c = "pop"
print(a,b,c)# 元组的解包
a,b = (1,2)
print(a,b)# 列表的解包
a,b,c = [10,20,30]
print(a,b,c)# 集合的解包
a,b,c = {"佩奇老妈","小猪佩奇","老猪佩奇"}
print(a,b,c)# 字典的解包
a,b,c = {"pqlm":"佩奇老妈","pqxz":"小猪佩奇","lzpq":"老猪佩奇"}
print(a,b,c)
上面代码演示的都是一些具有可迭代性的数据,即可以连续地提供其中的每一个元素的对象,其逻辑图如下
四、range 对象(计数循环)
range(start,end,step) # 开始值,结束值,步长
range(len(list)) # 结合 len() 来遍历出列表长度,其中 list 表示需遍历的列表
range(end) # 与 range(0,end,1)
注意:range() 的特性是顾头不顾尾,即 start 的元素会被包含,end-1 是实际的值(end 的数字不会被包含)
for i in range(5): # 相当于 range(0,5)print(i)
for i in range(1,5): # 相当于 range(1,5,1)print(i)
# 正向从左到右,步长为三
for i in range(0,20,3):print(i)
# 反向从右到左
for i in range(5,0,-1): # 5 4 3 2 1print(i)
break 和 continue 语法(与 while 相同)
break 的作用是终止所在的循环,这里还有一个类似的语法,那就是 continue 语法,这个语法是终止当次循环,但它不会结束循环,而是进入下一次循环当中。
一、语法结构
for 元素 in 可迭代序列(iterable):
执行代码...
break
for 元素 in 可迭代序列(iterable):
执行代码...
continue
二、代码示例
break示例:
# 遍历打印0-99的数,当大于10时终止循环
for i in range(100):if i > 10:breakprint(i)
continue 示例:
# 遍历打印0-20的数,当大于10小于15时跳过当次循环
for i in range(20):if 10 < i < 15:continueprint(i)
for ... else ... 语法
一、语法结构
for 元素 in 可迭代序列(iterable):
执行代码...
else:
执行代码...
二、代码示例
# 正常结束循环和 continue 都会执行 else 当中的代码
for i in range(20):if 10 <i < 15:continueprint(i)
else:print("打印完毕")
# 若是遇到 break 终止循环是,则不会执行 else 当中的代码
for i in range(20):if 10 <i < 15:breakprint(i)
else:print("打印完毕")
exit() 函数和 pass 语句
exit 是交互式 shell 的助手,用于“>>> exit()”退出交互式 Python 程序,pass 语句用作占位,没有实际意义
import sys
for element in "Python":print(element)if element == "t":#exit() #一般不用在程序中sys.exit(0) #无错误退出程序else:pass # pass 占位
while 和 for 的比较
一、使用场景
- while 一般用于处理复杂的逻辑关系
- for 一般用于迭代数据
- 部分情况下两个循环可以互相转换
二、具体例子
1、乘法口诀表
while 循环实现:
i = 1
while i <= 9:j = 1while j <= i:print("%d*%d=%2d " % (i,j,i * j),end = "" )j += 1print()i += 1
for 循环实现:
# 方向一
for i in range(1,10):for j in range(1,i + 1):print("%d*%d=%2d " % (i,j,i * j),end = "" )print() # 换行# 方向二
for i in range(9,0,-1):for j in range(1,i + 1):print("%d*%d=%2d " % (i,j,i * j),end = "" )print() # 换行# 方向三
for i in range(1,10):blank = 9 - iwhile blank > 0:print(" ",end="") # 11个空格blank -= 1for j in range(1,i + 1):print(f"{j} x {i} = {i * j:>2}",end = " " )print() # 换行# 方向四
for i in range(9,0,-1):blank = 9 - iwhile blank > 0:print(" ",end="") # 11个空格blank -= 1for j in range(1,i + 1):print(f"{j} x {i} = {i * j:>2}",end = " " )print() # 换行
2、打印菱形(星星)
打印菱形这种比较复杂的花样需要使用 while 循环,for 循环比较难实现。
首先我们要先计算出,
- 总行数(line):星星的数量设定为 n,那么总行数为 n 整除2然后加1,即 n = 13 时行数为7,n = 11 时行数为6,n = 9 时行数为5,n = 7 时行数为4...,公式为 line = n // 2 + 1
- 空格数量(blanks):i 为当前行,空格数量等于总行数减去当前行数,即 line = 1 时空格数量为5,line = 2 时空格数量为4,line = 3 时空格数量为3,line = 4 时空格数量为2,line = 5 时空格数量为1,line = 6 时空格数量为0...,公式为 blanks = line - i
- 星星数量(stars):i为当前行,星星数量等于当前行数乘以2然后减1,即 line = 1 时星星数量为1,line = 2 时星星数量为3,line = 3 时星星数量为5,line = 4 时星星数量为7...,公式为 stars = line * 2 - 1
n = 13
line = n // 2 + 1
i = 1
while i < line:# 打印空格blanks = line- iprint(" " * blanks, end="")# 打印星星stars = 2 * i - 1print("*" * stars, end="")# 打印换行print()i += 1i = line
while i >= 1:# 打印空格blanks = line - iprint(" " * blanks, end="")# 打印星星stars = 2 * i - 1print("*" * stars, end="")# 打印换行print()i -= 1