循环结构用来重复执行一条或多条语句,使用循环结构可以减少源程序重复书写的工作量,许多算法需要使用到循环结构,python使用for语句和while语句来实现循环结构。
可迭代对象(iterable)一次返回一个元素,因此适用于循环。
Prthon()包括以下几种可迭代对象:序列(sequence),例如字符串(St)、列表(lis) .元组(uple等;字典(dict);文件对象;迭代器对象(iterator);生成器函数(generator)。
迭代器是一个对象,表示可迭代的数据集合,包括方法__ iter__ ()和__ next__(),可以实现迭代功能。
生成器是一个函数,使用yield语句,每次产生一个值,也可以用于循环迭代。
Python3中的内置对象range是一个这代器对象,在迭代时产生指定范围的数字序列,其格式如下。
rarge(start, stopl, step])
range返回的数字序列从start开始,到stop结束(不包含stop).如果指定了可选的步长step,则序列按步长step增长。
注意,Python2中range的类型为函数,是一个生成器: Python3中range的类型为类,是一个迭代器。
for语句用于遍历可迭代对象集合中的元素并对集合中的每个元索执行次相关的嵌入语句。当集合中的所有元素完成迭代后控制传递给for之后的下一个语句。
for语句的格式如下。
for变量in对象集合:
循环体语句/语句块
# [例3.9]利用 for 循环求1~100中所有奇数的和以及所有偶数的和。
sum_odd = 0; sum_even = 0
for i in range(1, 101):
if i % 2 != 0: #奇数
sum_odd += i #奇数和
else: #偶数
sum_even += i #偶数和
print("1~100中所有奇数的和:", sum_odd)
print("1~100中所有偶数的和:", sum_even)
----------------------打印结果-----------------------
1~100中所有奇数的和: 2500
1~100中所有偶数的和: 2550
与for循环一样,while也是一个预测试的循环,但是while在循环开始前并不知道重复执行循环语句序列的次数。
while语句按不同条件执行循环语句(块)零次或多次。
while循环的语句的格式如下。
for 变量 in 对象集合:
循环体语句(块)1
else:
语句(块)2
或者:
while (条件表达式)
循环体语句(块)1
else:
语句(块)2
#【例 3.18】 使用for 语句的else 子句
hobbies = ""
for i in range(1, 3 + 1):
s = input('请输入爱好之一(最多三个,按Q或q结束):')
if s.upper() == 'Q':
break
hobbies += s + ' '
else:
print('您输入了三个爱好。')
print('您的爱好为:', hobbies)
----------------------打印结果-----------------------
请输入爱好之一(最多三个,按Q或q结束):1
请输入爱好之一(最多三个,按Q或q结束):2
请输入爱好之一(最多三个,按Q或q结束):3
您输入了三个爱好。
您的爱好为: 1 2 3
(1) while循环语句的执行过程如下。
①计算条件表达式。
②如果条件表达式的结果为True,控制将转到循环语句(块),即进入循环体。当到达循环语句序列的结束点时转①,即控制转到while语句的开始,继续循环。
③如果条件表达式的结果为False,退出while循坏,即控制转到while循环语句的后继语句。
(2)条件表达式是每次进入循环之前进行判断的条件,可以为关系表达式或逻辑表达式,其运算结果为True(真)或False(假)。在条件表达式中必须包含控制循环的变量。
(3)循环语句序列可以是一条语句,也可以是多条语句。
(4)在循环语句序列中至少应包含改变循环条件的语句,以使循环趋于结束,避免死循环。
# 【例3.10】 利用whlie 求100 的和,以及1~ 100 的奇数和·偶数和。
i = 1; sum_all = 0; sum_odd = 0; sum_even = 0
while (i <= 100):
sum_all += i #所有数之和
if (i % 2 == 0): #偶数
sum_even += i #偶数和
else: #奇数
sum_odd += i #奇数和
i += 1
print("和=%d、奇数和=%d、偶数和=%d" % (sum_all, sum_odd, sum_even))
----------------------打印结果-----------------------
和=5050、奇数和=2500、偶数和=2550
若在一个循环体内又包含另一个完整的循环结构,则称之为循环的嵌套。这种语句结构称为多重循环结构。
在内层循环中还可以包含新的循环,以形成多层循环结构。
在多层循环结构中两种循环语句(for循环、while循环)可以相互嵌套。多重循环的循环次数等于每一重循环次数的乘积。
# [例3.12] 利用嵌套循环打印运行效果如图3-5所示的九九乘法表。
for i in range(1, 10):
s = ""
for j in range(1, i+1):
s += str.format("{0:1}*{1:1}={2:<2} ", i, j, i * j)
print(s)
----------------------打印结果-----------------------
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
61=6 62=12 63=18 64=24 65=30 66=36
71=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81
break语句用于退出for、while循环,即提前结束循环,接着执行循环语句的后继语句。
注意,当多个for、while语句彼此嵌套时,break语句只应用于最里层的语句,即break语句只能跳出最近的–层循环。
# [例3.13]使用break语句中止循环。
while True:
s = input('请输入字符串(按Q或者q结束):')
if s.upper() == 'Q':
break
print('字符串的长度为:', len(s))
----------------------打印结果-----------------------
请输入字符串(按Q或者q结束):1
字符串的长度为: 1
请输入字符串(按Q或者q结束):2
字符串的长度为: 1
请输入字符串(按Q或者q结束):1
字符串的长度为: 1
请输入字符串(按Q或者q结束):1
字符串的长度为: 1
请输入字符串(按Q或者q结束):q
conimne语句类似于break 语句,也必须在for. while循环中使用,但它结束本次循环,即跳过循环体内continue下面尚未执行的语句,返回到循环的起始处,并根据循环条件判断是否执行下一次循环。
continue语句和break语句的区别在于:continue语句仅结束本次循环,并返回到循环的起始处,如果循环条件满足就开始执行下-次循环;而break语句则是结束循环,跳转到循环的后继语句执行。
与break语甸类似,当多个for. while语句彼此嵌套时continue语句只应用于最里层的语句。
# [例3.15]使用continue语句跳过循环示例. 要求输人若干学生成绩(按Q或q键结束),如果成绩<0,则重新输人。统计学生人数和平均成绩
num = 0; scores = 0; #初始化学生人数和成绩和
while True:
s = input('请输入学生成绩(按Q或q结束):')
if s.upper() == 'Q':
break
if float(s) < 0: #成绩必须>=0
continue
num += 1 #统计学生人数
scores += float(s) #计算成绩之和
print('学生人数为:{0},平均成绩为:{1}'.format(num,scores / num))
----------------------打印结果-----------------------
请输入学生成绩(按Q或q结束):12
请输入学生成绩(按Q或q结束):23
请输入学生成绩(按Q或q结束):34
请输入学生成绩(按Q或q结束):45
请输入学生成绩(按Q或q结束):q
学生人数为:4,平均成绩为:28.5
如果while循环结构中的循环控制条件一直为真,则循环将无限继续,程序将-直运行下去,从而形成死循环。
当程序死循环时会造成程序没有任何响应,或者造成不断输出(例如控制台输出、文件写入、打印输出等)。
在程序的循环体中,插人调试输出语句,可以判断程序是否为死循环。注意,有的程序算法十分复杂,可能需要运行很长时间,但并不是死循环。
在大多数计算机系统中,可以使用Ctrl+C组合键中止当前程序的运行。
# [例3.17]死循环示例。
import math
while True: #循环条件一直为真
num = float(input("请输入一个正数:"))
print(str(num), "的平方根为:", math.sqrt(num))
print("Good bye!")
本程序因为循环条件为“while True”,所以将一直重复 提示用户输人一个正数,计算并输出该数的平方根,从而形成死循环。所以,最后的“print(“Good bye!”)"语句将没有机会执行。
for、while语句可以附带一个 else子句(可选)。如果for、while语句没有被break语句中止,则会执行else子句,否则不执行。
其语法如下。
for 变量 in 对象集合:
循环体语句(块)1
else:
语句(块)2
或者:
while (条件表达式)
循环体语句(块)1
else:
语句(块)2
#[例 3.18] 使用for语句的else子句
hobbies = ""
for i in range(1, 3 + 1):
s = input('请输入爱好之一(最多三个,按Q或q结束):')
if s.upper() == 'Q':
break
hobbies += s + ' '
else:
print('您输入了三个爱好。')
print('您的爱好为:', hobbies)
----------------------打印结果-----------------------
请输入爱好之一(最多三个,按Q或q结束):4
请输入爱好之一(最多三个,按Q或q结束):4
请输入爱好之一(最多三个,按Q或q结束):4
您输入了三个爱好。
您的爱好为: 4 4 4
Python语言的for循环直接迭代对象集合中的元素,如果需要在循环中使用索引下标访问集合元素,则可以使用内置的enumerate()函数。
enumerate()函数用于将一个可遍历的数据对象(例如列表、元组或字符串)组合为一个索引序列,并返回一个可迭代对象,故在for循环当中可直接迭代下标和元素。
# [例3. 19] enumerate() 丽数和下标元素循环示例
seasons = ['Spring', 'Summer', 'Autumn', 'Winter']
for i, s in enumerate(seasons, start=1): #start默认从0开始
print("第{0}季节:{1}".format(i, s))
----------------------打印结果-----------------------
第1季节:Spring
第2季节:Summer
第3季节:Autumn
第4季节:Winter
如果需要并行遍历多个可迭代对象,则可以使用Python的内置函数zip()。
zip()函数将多个可迭代对象中对应的元素打包成一- 个个元组,然后返回一个可迭代对象。
如果元素的个数不一样,则返回列表的长度与最短的对象相同。利用运算符×还可以实现将元组解压为列表等。
# [例 3.20] zip()函数和并行循环示例
evens = [0, 2, 4, 6, 8]
odds = [1, 3, 5, 7, 9]
for e,o , in zip(evens,odds):
print("{0}*{1}={2}".format(e,o,e*o))
----------------------打印结果-----------------------
01=0
23=6
45=20
67=42
8*9=72
如果需要遍历可迭代对象、并使用指定函数处理对应的元素.则可以使用Pyrthon的内置函数map()
map(func, seql[, seq2,…])函数将func作用于seq中的每一个元素 、并将所有的调用结果作为可送代对象运回。如果func为None.该函数的作用等同于zip()函数。
例如,如果要返回列表中每个字符串的长度,可以使用内置的map()函数和len()函数:
# [例3.21] map()函数和循环示例。
list(map(abs, [-1,0, 7. -8]))
#计算绝对值、输出:[1.0, 7. 8]
list(map(pocw, range(5), range(5)))
#计算果基输出:[1, 1, 4,27, 256]
list(map(ard, "abcdef'))
#计算ASCII码.输出:[97,98, 99, 100, 101. 102]
list(map(lambda x,y:x+y,'abe', "de'))
#字符电拼接、输出:['abc', 'de']
----------------------打印结果-----------------------
File “”, line 7
list(map(ard, "abcdef’))
^
SyntaxError: EOL while scanning string literal