1 循环语句
循环语句用于重复执行某段程序代码,直到满足特定条件为止。在Python语言中,循环语句有以下两种形式。
- while 循环语句
- for 循环语句
1.1 while 循环语句
while 循环语句是用一个表达式来控制循环的语句,它的一般形式为:
while 表达式:
语句块
当表达式的返回值为真时,执行语句块(或称为“循环体”),然后重新判断表达式的返回值,直到表达式的返回值为假时,退出循环,具体流程图如下图所示。
【例1-1】用while循环语句实现计算1~99的整数和。
n = 1
sum = 0
while(n <= 99):
sum += n
n += 1
print("1-99的整数和是:",sum)
运行结果如下:
1-99的整数和是: 4950
【例1-2】设计一个小游戏,让玩家输入一个数字,程序判断是奇数还是偶数。
prompt = '输入一个数字,我将告诉你,它是奇数,还是偶数'
prompt += '\n输入“结束游戏”,将退出本程序:'
exit = '结束游戏' #退出指令
content = '' #输入内容
while content != exit:
content = input(prompt)
if content.isdigit(): #isdigit()函数用于检测字符串是否只由数字组成
number = int(content)
if(number % 2 == 0):
print('该数是偶数')
else:
print('该数是奇数')
elif content != exit:
print('输入的必须是数字')
代码运行示例:
输入一个数字,我将告诉你,它是奇数,还是偶数
输入“结束游戏”,将退出本程序:7
该数是奇数
输入一个数字,我将告诉你,它是奇数,还是偶数
输入“结束游戏”,将退出本程序:8
该数是偶数
输入一个数字,我将告诉你,它是奇数,还是偶数
输入“结束游戏”,将退出本程序:结束游戏
在编写while 循环语句时,一定要保证程序正常结束,否则会造成“死循环”(或“无限循环”)。例如,在下面的代码中,i的值永远小于100,运行后程序将不停地输出0.
i = 0
while i < 100:
print(i)
1.2 for 循环语句
for 循环语句是最常用的循环语句,一般用在循环次数已知的情况下,它的一般形式为:
for 迭代变量 in 对象:
语句块
其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表和元组等;被执行的语句块也称为“循环体”。具体流程图如下图所示。
【例1-3】用for循环语句实现计算1~99的整数和。
sum = 0
for n in range(1,100): #range(1,100)用于生成1到100(不包括100)的整数
sum += n
print("1到99的整数和是:",sum)
代码运行结果如下:
1到99的整数和是: 4950
【例1-3】中用到了range()函数,该函数的具体用法如下:
- range(stop):生成从0开始到stop结束(不包含stop)的一系列值。比如,range(3)生成的数值是0、1、2。
- range(start, stop):生成从start开始到stop结束(不包含stop)的一系列数值。比如,range(2, 5)生成的数值是2、3、4。
- range(start, stop, step):生成从start开始到stop结束(不包含stop)、步长为step的一系列数值。比如,range(2,10,2)生成的数值是2、4、6、8,range(10,1,2)生成的数值是10、8、6、4、2。
【例1-4】输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个水仙花数,因为153=13+53+33。
for i in range(100,1000):
a = i % 10 #个位数
b = i // 10 % 10 #十位数
c = i // 100 #百位数
if(i == a ** 3 + b ** 3 + c ** 3):
print(i)
代码运行结果如下:
153
370
371
407
【例1-5】判断一个数是不是素数。判断一个数是不是素数的算法:让m被2到 m \sqrt[]{m} m除,如果m能被2到 m \sqrt[]{m} m的任何一个整数整除,则可以判断m不是素数;如果m不能被2到 m \sqrt[]{m} m的任何一个整数整除,则可以判断m是素数。
# 由于程序中要用到求平方根的函数sqrt(),因此需要导入math模块
import math
m = int(input("请输入一个数m:"))
n = int(math.sqrt(m)) # math.sqrt(m)返回m的平方根
prime = 1
for i in range(2,n+1):
if m % i == 0:
prime = 0
if(prime == 1):
print(m,"是素数")
else:
print(m,"不是素数")
代码运行示例:
请输入一个数m:11
11 是素数
请输入一个数m:6
6 不是素数
1.3 循环嵌套
循环嵌套就是一个循环体包含另一个完整的循环结构,而在这个完整的循环体内还可以嵌套其他的循环结构。循环嵌套很复杂,在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 表达式:
for 迭代变量 in 对象:
语句块2
语句块1
在for 循环中嵌套while循环的格式如下:
for 迭代变量 in 对象:
while 表达式:
语句块2
语句块1
【例1-6】分别输入两个学生的3门成绩,并分别计算平均成绩。
使用while循环嵌套实现,具体代码如下:
j = 1 # 定义外部循环计数器初始值
while j <= 2: # 定义外部循环执行2次
sum = 0 # 定义成绩初始值
i = 1 # 定义内部循环计数器初始值
name = input("请输入学生姓名:") # 接收用户输入的学生姓名,赋值给name变量
while i <= 3: # 定义内部循环执行3次,就是接收3门课程的成绩
print("请输入第%d门的考试成绩:" % i) # 提示用户输入成绩
sum = sum + int(input()) # 接收用户输入的成绩,赋值给sum变量
i += 1 # i变量自增1,i变为2,继续执行循环,直到i等于4时,跳出循环
avg = sum / (i-1) # 计算学生的平均成绩,赋值给avg变量
print(name,"的平均成绩是%d\n" % avg) # 输出学生成绩平均值
j = j + 1 # 内部循环执行完毕后,外部循环计数器j自增1,变为2,再进行外部循环
print("学生成绩输入完成!")
代码运行示例:
请输入学生姓名:张三
请输入第1门的考试成绩:
89
请输入第2门的考试成绩:
90
请输入第3门的考试成绩:
91
张三 的平均成绩是90
请输入学生姓名:李四
请输入第1门的考试成绩:
78
请输入第2门的考试成绩:
85
请输入第3门的考试成绩:
96
李四 的平均成绩是86
学生成绩输入完成!
【例1-7】用for循环嵌套完成输出所有的“水仙花数”。
for a in range(10): # 个位数的范围是0-9
for b in range(10): #十位数的范围是0-9
for c in range(1,10): # 百位数的范围是1-9
number = a + 10 * b + 100 * c
if(number == a ** 3 + b ** 3 + c ** 3):
print(number)
代码运行结果如下:
370
371
153
407
【例1-8】打印九九乘法表。
for i in range(1,10):
for j in range(1,i+1):
print('{}x{}={}\t'.format(j,i,i*j),end='')
print()
代码运行结果如下:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
【例1-9】输入一个行数(必须是奇数),输出如下图形:
输出上述图形的代码如下:
rows = int(input('输入行数(奇数):'))
if rows % 2 != 0:
for i in range(0, rows // 2 +1): # 控制打印行数
for j in range(rows - i , 0 , -1): # 控制空格个数
print(" ",end='') # 打印空格,不换行
for k in range(0,2*i+1): # 控制星号个数
print("*",end='') # 打印星号,不换行
print("") # 换行
for i in range(rows//2,0,-1): # 控制打印行数
for j in range(rows-i+1,0,-1): # 控制空格个数
print(" ",end='') # 打印空格,不换行
for k in range(2*i-1,0,-1): # 控制星号个数
print("*",end='') # 打印星号,不换行
print("") # 换行
参考书籍:
Python程序设计基础教程(微课版) 林子雨 赵江声 陶继平编著