1、引入
某次程序大赛,S1
班有4
名学员参加,学员的成绩由用户输入,计算该班参赛学员的平均分。
场景:上述练习中,如果有3
个班级各四名同学参赛,如何计算每个班级参赛同学的平均分呢?
分析:
需要循环3次计算每个班的平均分。而每个班有四名同学,所以对每个班级需要循环四次累加总分。可以用一个循环控制班级的数目,用另一个循环控制每个班级同学的数目,这样就得到了二重循环。
2、二重循环
在Python
中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。在Python
中,for
循环和while
循环都可以进行循环嵌套。
在while循环中套用while循环
while 条件表达式1:
while 条件表达式2:
循环体2
循环体1
for循环中套用for循环
for 迭代变量1 in 对象1:
for 迭代变量2 in 对象2:
循环体2
循环体1
while循环中套用for循环
while 条件表达式1:
for 迭代变量 in 对象:
循环体2
循环体1
for循环中套用while循环
for 迭代变量 in 对象:
while 条件表达式:
循环体2
循环体1
各种循环可以相互嵌套,内层循环结束后才执行外层循环的语句。外层循环变量变化一次,内层循环变量要变化一遍。
3、示例
classNum = 1
while classNum <= 3:
print("请输入{}班4位学员的成绩".format(classNum))
i = 1
sum = 0
while i <= 4:
print("请输入第{}位学员的成绩:".format(i), end="")
score = int(input())
sum += score
i += 1
avg = sum / 4
print("{}班参赛学员的平均分是:{}".format(classNum,avg))
classNum += 1
或者:
classNum = 1
while classNum <= 3:
sum = 0
print("请输入{}班4位学员的成绩".format(classNum))
for x in range(1, 5):
print("请输入第{}位学员的成绩:".format(x), end="")
score = int(input())
sum += score
avg = sum / 4
print("{}班参赛学员的平均分是:{}".format(classNum,avg))
classNum += 1
for classNum in range(1,5):
print("\n请输入软件{}班的学员成绩".format(classNum))
sum = 0 # 累加和
for i in range(1, 5):
score = int(input("请输入第{}名学员的成绩:".format(i)))
sum += score
avg = sum / 4
print("软件{}班参赛学员的平均分是:{}".format(classNum, avg))
4、练习
(1)用*
打印直角三角形图案。
分析:
第一行,i=1,打印一个*,内层循环一次,j的取值只有1。
第二行,i=2,打印两个*,内层循环两次,j的取值只有1~2。
第三行,i=3,打印三个*,内层循环三次,j的取值只有1~3。
(2)输入行数,打印直角三角形。
从控制台输入直角三角形的高度
每行的数目依次为1、3、5、7…
分析:
外层循环控制行数, 根据用户输入的行数得到外层循环条件。
分析每行打印的内容,每一行均打印号,第i行的*号数为2 * i – 1
,从而得到内层循环条件。
(3)打印倒直角三角形。
从控制台输入直角三角形的高度,每行*的数目从下至上依次为1、2、3、4…。
分析:
外层循环控制行数, 根据用户输入的行数得到外层循环条件。
分析每行打印的内容,每一行均打印*
号,某一行与该行*
号数之和等于行数加1
,从而得到内层循环条件。
(4)打印等腰三角形
控制台输入等腰三角形的高度,每行的数目依次为1、3、5、7…。
分析:
外层循环控制行数, 根据用户输入的行数得到外层循环条件。
分析每行打印的内容,每一行先打印空格,再打印号。打印空格和打印*号用两个不同的for循环。为了清晰起见,我们可以以#号代替空格来分析每行空格数、*
号数和行数的关系,如下图所示:
第i
行的空格数与i
之和等于rows
,第i
行*
号数为2 * i-1
,从而得到两个内层for循环的循环条件。
(5)打印菱形
如果用户输入的行数为奇数,则打印出菱形;否则提示用户输入奇数。假设用户输入的行数为rows,则每行的*号数依次为1,3,5,7,……,rows,……,7,5,3,1,如下图所示。
复杂图形分步打印的思想。
分析:
先判断用户输入的是否为奇数。
分步打印,先打印菱形的上半部分,即一个等腰三角形,行数为(rows + 1
)/ 2
。
打印菱形的下半部分,打印完一行后换行。