文章目录
- 第7章 循环设计
- 7.1 基本for循环
- 7.2 range()函数
- 7.2.1 只有一个参数的range()函数
- 7.2.2 有两个参数的range()函数
- 7.2.3 有3个参数的range()函数
- 7.3 进阶的for循环应用
- 7.3.1 巢状for循环
- 7.3.2 强制离开for循环-break指令
- 7.3.3 for循环暂时停止不往下执行-continue指令
- 7.4 while循环
- 7.4.1 基本while循环
- 7.4.2 巢状while循环
- 7.4.3 强制离开while循环-break指令
- 7.4.4 while循环暂时停止不往下执行-continue指令
- 7.4.5 while循环条件语句与可迭代对象
第7章 循环设计
7.1 基本for循环
for循环可以让程序将整个对象内的元素遍历(也可以叫迭代),在遍历过程中,同时可以记录或输出每次遍历的状态或轨迹。for循环基本语法格式如下:
for var in 可迭代对象:
程序代码段
可迭代对象(iterable object)可以是列表、元组、字典与集合或range()。在信息科学中,迭代(iteration)可以解释为重复执行语句,上述语法可以解释为将可迭代对象的元素当作var
,重复执行,直到每个元素都被执行一次,整个循环才会停止。
for循环基本操作
fruits = ['apple', 'orange', 'banana', 'peach', 'pear']
for fruit in fruits:
print(fruit)
执行结果:
apple
orange
banana
peach
pear
使用for循环时,如果程序代码段只有一行,它的语法格式可以用下列方式表达:
for var in 可迭代对象:程序代码段
如前面的例子可写成:
fruits = ['apple', 'orange', 'banana', 'peach', 'pear']
for fruit in fruits:print(fruit)
当for循环的程序代码段有多行程序语句时,这些语句都需要做缩进处理。它的语法格式可用下列方式表达:
for var in 可迭代对象:
程序代码
程序代码
......
程序实例:
count = 0;
fruits = ['apple', 'banana', 'cherry', 'durian']
for fruit in fruits:
if(fruit != ''):count = count+1
print("第 %d 种水果是:%s" % (count,fruit.title()))
执行结果:
第 1 种水果是:Apple
第 2 种水果是:Banana
第 3 种水果是:Cherry
第 4 种水果是:Durian
将for循环应用在数据类型的判断:
files = ['demo1.py', 'demo2.py', 'demo3.java', 'demo4.php']
py = []
for file in files:
if file.endswith('.py'): # 以.py为扩展名
py.append(file) # 加入列表
print(py)
执行结果:
['demo1.py', 'demo2.py']
7.2 range()函数
Python可以使用range()函数产生一个等差级序列,这样的等差级序列称为可迭代对象或range对象。如果只是执行普通的循环迭代,可以直接使用range()对象作为循环的计数器,这类迭代只有迭代时计数指针需要内存,所以可省略内存空间,range()函数的用法与列表的切片(slice)类似。
range (start, stop, step)
从start开始,以step为步长,产生从start~stop-1的等差数列。(start默认为0,step默认为1)
>>> for x in range(3):
print(x)
0
1
2
>>> for x in range(1,5):
print(x)
1
2
3
4
>>> for x in range(1,10,2):
print(x)
1
3
5
7
9
>>> type(x)
<class 'int'>
>>> for x in range(3,-3,-2):
print(x)
3
1
-1
7.2.1 只有一个参数的range()函数
n = int(input("请输入星号数量:")) # 定义星号的数量
for number in range(n): # for循环
print("*",end="") # 打印星号
执行效果:
请输入星号数量:4
****
7.2.2 有两个参数的range()函数
当range()函数搭配两个参数时,它的语法格式如下:
range (start, end) # start是起始值,end-1是终止值,step默认为1
上述可以产生起始值为start到终止值为end-1之间,每次递增1的序列,start或end可以是负整数,如果终止值小于起始值,则会产生空序列或称空range对象。
>>> for x in range(10,2):
print(x)
>>> for x in range(-1,2):
print(x)
-1
0
1
7.2.3 有3个参数的range()函数
当range()函数搭配3个参数时,它的语法格式如下:
range (start, end, step) # start为起始值,end为终止值,step为间隔值(或步长)
从起始值start开始,以end-1为终止值,产生以step为步长的等差序列。
>>> for x in range(-1,2):
print(x)
-1
0
1
>>> for x in range(2,10,2):
print(x)
2
4
6
8
>>> for x in range(10,0,-2):
print(x)
10
8
6
4
2
使用range()函数搭配3个参数,产生列表:
start = 2
end = 9
step = 2
number1 = list(range(start, end, step))
print("当start值为%2d,end值为%2d,step值为%2d时的range()串行 = " % (start, end, step), number1)
start = -2
end = 9
step = 3
number1 = list(range(start, end, step))
print("当start值为%2d,end值为%2d,step值为%2d时的range()串行 = " % (start, end, step), number1)
start = 5
end = -5
step = -3
number1 = list(range(start, end, step))
print("当start值为%2d,end值为%2d,step值为%2d时的range()串行 = " % (start, end, step), number1)
执行结果:
当start值为 2,end值为 9,step值为 2时的range()串行 = [2, 4, 6, 8]
当start值为-2,end值为 9,step值为 3时的range()串行 = [-2, 1, 4, 7]
当start值为 5,end值为-5,step值为-3时的range()串行 = [5, 2, -1, -4]
删除列表内所有元素:
fruits = ['apple', 'banana', 'orange', 'pear']
print("目前fruits列表:",fruits)
#i = 1
for fruit in fruits[:]:
fruits.remove(fruit)
print("删除 %s " % fruit)
print("目前fruits列表:",fruits)
执行结果:
目前fruits列表: ['apple', 'banana', 'orange', 'pear']
删除 apple
目前fruits列表: ['banana', 'orange', 'pear']
删除 banana
目前fruits列表: ['orange', 'pear']
删除 orange
目前fruits列表: ['pear']
删除 pear
目前fruits列表: []
7.3 进阶的for循环应用
7.3.1 巢状for循环
一个循环内有另一个循环,我们称之为巢状循环
。如果外层循环要执行n次,内层循环要执行m次,则整个循环需执行n*m次。设计这类循环时要注意以下几点:
- 外层循环的索引值变量与内层循环的索引值变量不要同名,以免混淆。
- 注意程序代码的缩进
下列是巢状循环基本语法:
for var1 in 可迭代对象: # 外层for循环
...
for var2 in 可迭代对象: # 内层for循环
打印九九乘法表:
for i in range(1, 10):
for j in range(1, 10):
if j <= i:
result = i * j
print("%d*%d=%-3d" % (j, i, result), end=" ") # %-3d表示每个输出预留3个,左对齐
print() # 换行输出
执行结果:
绘制直角三角形:
for i in range(1, 10):
for j in range(1, 10):
if j <= i:
print("aa", end="")
print() # 换行输出
执行结果:
7.3.2 强制离开for循环-break指令
在for循环中,当某些条件发生需要退出循环时,可使用break指令。常用的语法格式如下:
for var in 可迭代对象:
程序代码段1
if 条件语句: # 判断条件语句
程序代码段2
break # 如果条件语句为True,则退出for循环
程序代码段3
程序实例:
# 一个列表scores内含有10个分数元素,列出前5名。
scores = [69, 73, 88, 66, 90, 78, 83]
scores.sort(reverse = True) # 从大到小排序
count = 0
for sc in scores:
count += 1
print(sc, end=" ")
if count == 5: # 取前5名
break # 离开for循环
执行结果:
90 88 83 78 73
7.3.3 for循环暂时停止不往下执行-continue指令
在设计for循环时,如果期待某些条件发生时不往下执行循环内容,可以使用continue指令。该指令通常与if语句搭配使用。常用的语法格式如下:
for var in 可迭代对象:
程序代码段1
if 条件语句: # 如果条件语句为True,则不执行程序代码段3
程序代码段2
continue
程序代码段3
程序实例:
scores = [69, 73, 88, 66, 90, 78, 83]
sc_A = []
for score in scores:
if score < 80: # 小于80则不往下执行
continue
sc_A.append(score) # 添加到列表sc_A中
print(sc_A)
执行结果:
[88, 90, 83]
7.4 while循环
一般while循环使用的语意上是条件控制循环,在符合特定条件下执行。for循环则是一种技术循环,会重复执行特定次数。
7.4.1 基本while循环
程序实例:
answer = 36
guess = 0
while guess != answer:
guess = int(input("猜一个1~100之间的整数:"))
if guess > answer:
print("再小一点")
elif guess < answer:
print("再大一点")
else:
print("恭喜答对啦")
执行结果:
7.4.2 巢状while循环
while循环也允许嵌套,此时的语法格式如下:
while 条件运算: # 外层while循环
...
while 条件运算: # 内层while循环
...
程序实例:
# 打印九九乘法表
i = 1
while i <= 9:
j = 1
while j <= i:
result = i * j
print(f'{j}*{i}={result}', end='\t')
j += 1
print()
i += 1
执行效果:
7.4.3 强制离开while循环-break指令
在设计while循环时,如果期待某些条件发生时可以离开循环,可以通过在循环内执行break指令退出循环。常用的语法格式如下:
while 条件语句A:
程序代码段1
if 条件语句B: # 判断条件语句A
程序代码段2
break # 如果条件语句A为True,则离开while循环
程序代码段3
程序实例:
scores = [69, 73, 88, 66, 90, 78, 83]
scores.sort(reverse = True) # 从大到小排序
count = 0
while True: # while无限循环
print(scores[count], end=" ")
count += 1
if count == 5: # 取前5名
break # 离开for循环
执行结果:
90 88 83 78 73
7.4.4 while循环暂时停止不往下执行-continue指令
在设计while循环时,若期待某些条件发生时可以不往下执行循环内容,则可使用continue指令。常用的语法格式如下:
while 条件运算A:
程序代码段1
if 条件语句B: # 如果条件语句是True,则不执行程序代码段3
程序代码段2
continue
程序代码段3
程序实例:
# 列出1~10之间的偶数
index = 0
while index <= 10:
index += 1;
if (index % 2 != 0): # 测试是否为奇数
continue # 不往下执行
print(index) # 输出偶数
执行结果:
2
4
6
8
10
7.4.5 while循环条件语句与可迭代对象
while循环的条件语句也可以和可迭代对象配合使用,此时它的语法格式如下:
while var in 可迭代对象:
程序代码段
程序实例:
# 删除列表内的apple字符串
fruits = ['apple', 'banana', 'orange', 'apple', 'watermelon', 'pear', 'apple']
fruit = 'apple'
print("删除前的fruits:", fruits)
while fruit in fruits: # 只要列表中包含apple,循环就继续
fruits.remove(fruit)
print("删除后的fruits:", fruits)
执行结果:
删除前的fruits: ['apple', 'banana', 'orange', 'apple', 'watermelon', 'pear', 'apple']
删除后的fruits: ['banana', 'orange', 'watermelon', 'pear']