第七章 循环语句(for循环、range函数、range在快速生成列表的应用、嵌套循环、break、continue、for...else)
一、for循环可以让程序将整个对象内的元素遍历(也可以称迭代),基本语法格式如下:
for var in 可迭代对象:
程序代码区块
可迭代对象(iterable object)可以是列表、元组、字典、集合或range( ),上述语法可以解释为将可迭代对象的元素当作var,重复执行,直到每个元素皆被执行一次,整个循环才会停止。设计上述程序代码时,必须要留意缩排的问题,可以参考if语句缩排,即for语句内程序代码要同时缩进对齐:
players = ['curry', 'james', 'durant', 'owen']
for player in players:
print(player.title() + ", it was a great game.")
print("我迫不及待想看下一场比赛," + player.title())
for循环可以应用在区间列表上(即列表切片):
players = ['curry', 'james', 'durant', 'owen']
print("打印前3位球员:")
for player in players[:3]:
print(player)
print("打印后3位球员:")
for player in players[-3:]:
print(player)
Python没有提供删除整个列表元素的方法,不过我们可以使用for循环完成此工作:
fruits = ['苹果', '香蕉', '西瓜', '葡萄', '柚子']
print("目前水果列表:", fruits)
for fruit in fruits[:]:
fruits.remove(fruit)
print("删除 %s" % fruit)
print("目前水果列表:", fruits)
这里for语句中可迭代对象必须用fruits[:],是原来列表对象fruits的深拷贝,不能直接用列表对象fruits,否则会导致迭代遍历不完整,只能删除一部分列表元素。
二、range()函数。Python可以使用range( )函数产生一个等差序列,我们又称这等差序列为可迭代对象(iterable object),也可以称是range对象。由于range( )是产生等差序列,我们可以直接使用,将此等差序列当作循环计数器。在前面我们使用”for var in 可迭代对象”当作循环,这时会使用可迭代对象元素当作循环指针,如果是要迭代对象内的元素,这是好方法,但是如果只是要执行普通的循环迭代,由于可迭代对象占用内存空间,所以这类循环需要占用较多系统资源。这时我们应该直接使用range( )对象,这类迭代只有迭代时的计数指针需要内存,所以可以节省内存空间。range( )的用法与列表的切片(slice)类似:range(start, stop, step)。上述stop是唯一必须的值,等差序列是产生stop的前一个值。例如:如果省略start,所产生等差序列范围是从0至stop-1。step的预设是1,所以预设等差序列是递增1。如果将step设为2,等差序列是递增2。如果将step设为-1,则是产生递减的等差序列。start或end可以是负整数,如果终止值小于起始值(递增序列)或者终止值大于起始值(递减序列)则产生空序列或称空range对象。
程序设计时应用range( ),可以产生程序精简的效果:
#一般程序设计写法
n = int(input("请输入一个整数: "))
total = 0
for i in range(1, n+1):
total += i
print("总和为:", total)
#精简程序设计写法
n = int(input("请输入一个整数: "))
total = sum(range(n+1))
print("从1到%d总和为:" % n, total)
三、我们可以采用一种精简的方式来快速生成新列表,语法格式为: 新列表 = [表达式 for 项目 in 可迭代对象]。上述语法观念是,将每个可迭代对象套入表达式,每次产生一个列表元素。此外,还可以在该语法中加入if条件判断,语法格式为: 新列表 = [表达式 for 项目 in 可迭代对象 if 表达式]。
'''
建立一个整数平方的列表,为了避免数值太大,
若是输入值大于10,此大于10的数值将被设为10。
'''
#一般程序设计写法
n = int(input("请输入一个整数: "))
if n > 10: n = 10
squares = []
for i in range(1, n+1):
squares.append(i ** 2)
print(squares)
#精简程序设计写法
n = int(input("请输入一个整数: "))
if n > 10: n = 10
squares = [i **2 for i in range(1, n+1)]
print(squares)
#生成1,3,...9的奇数列表
oddlist = [num for num in range(1, 10) if num % 2 == 1]
print(oddlist)
'''
勾股定理,基本观念是直角三角形两边长的平方和等于斜边的平方,如下:
a^2 + b^2 = c^2
这个程序会生成0~19间符合定义的a、b、c列表值。
'''
x = [(a,b,c) for a in range(1, 20) for b in range(a, 20) for c in range(b, 20)
if a**2 + b**2 == c**2]
print(x)
colors = ["Red", "Green", "Blue"]
shapes = ["Circle", "Square"]
result = [[color, shape] for color in colors for shape in shapes]
print(result)
#list unpacking,从每个嵌套列表中拉出color和shape的列表元素值
for color, shape in result:
print(color, shape)
四、一个循环内有另一个循环,我们称这是嵌套循环。如果外循环要执行n次,内循环要执行m次,则整个循环执行的次数是n*m次,设计这类循环时要特别注意下列事项:
● 外层循环的索引值与内层循环的索引值必须不同。
● 程序代码的内缩一定要小心。
#打印9*9乘法表
for i in range(1, 10):
for j in range(1, 10):
if (j <= i):
print("%d*%d=%-3d" % (i, j, i*j), end=" ")
print() #换行输出
在设计for循环时,如果期待某些条件发生时可以离开循环,可以在循环内执行break指令,即可立即离开循环,这个指令通常是和if语句配合使用:
for 变量 in 对象:
程序代码块1
if 条件表达式: #判断条件表达式
程序代码块2
break #如果条件表达式为True则离开循环
程序代码块3
在设计for循环时,如果期待某些条件发生时可以不往下执行循环内容而继续执行下一次循环,此时可以用continue指令,这个指令通常是和if语句配合使用:
for 变量 in 对象:
程序代码块1
if 条件表达式: #判断条件表达式
程序代码块2
continue #如果条件表达式为True则不执行for循环中的程序代码块3
程序代码块3
#列出所有身高是200(含)公分以上的球员数据
players = [['james', 202],
['curry', 193],
['durant', 205],
['david', 211],
['jordan', 198]]
for player in players:
if player[1] < 200:
continue
print(player)
for player, height in players:
if height < 200:
continue
print(player, height)
在设计for循环时,如果期待所有的if条件是False时,在最后一次循环后,可以执行特定程序区块指令,可使用这个for...else循环,这个指令通常是和if和break语句配合使用。
for 变量 in 对象:
程序代码块1
if 条件表达式: #判断条件表达式
程序代码块2
break #如果条件表达式为True则离开循环
程序代码块3
else:
程序代码块4 #最后一次循环条件表达式是False时执行该程序代码块
'''
测试某一个数字n是否是质数,质数的条件是:
● 2是质数。
● n不可被2至n-1的数字整除。
'''
num = int(input("请输入大于1的整数做质数测试:"))
if num == 2:
print("%d是质数" % num)
else:
for n in range(2, num):
if num % n == 0:
print("%d不是质数" % num)
break
else: #最后一次循环if条件仍然为False时执行
print("%d是质数" % num)