Python中的循环大体与c/cpp相似,但也有些许不同。
while语句
基本程序
# 整数的递增计数
a = int(input('整数a:'))
b = int(input('整数b:'))
a, b = sorted([a, b])
counter = a
while counter <= b:
print(counter, end=' ')
counter = counter + 1
print()
# 从一个正整数开始递减计数到0
print('递减计数。')
n = int(input('正整数:'))
while n >= 0:
print(n, end=' ')
n -= 1
print()
这两段代码主要展示了while循环的基本类型,其中第二段代码展示了一种语法糖:n = n - 1 可以写成 n -= 1。
但是Python中不存在i++这类的自增运算符。
计算求和
# 计算1到n的和。
print('计算1到n的和。')
n = int(input('n的值:'))
sum = 0
i = 1
while i <= n:
sum += i
i += 1
print('1到{}的和是{}。'.format(n, sum))
这段代码是一个求和的简单实现。
else代码块和break语句
不同于c/cpp,Python中循环语句后也可以接else。
# 计算1到n的和(n读取的为正整数)
print('计算1到n的和。')
while True:
n = int(input('n的值:'))
if n > 0:
break
sum = 0
i = 1
while i <= n:
sum += i
i += 1
print('1到{}的和是{}。'.format(n, sum))
其中else语句与break语句的关系如下:
若循环体没有执行break语句,则循环执行完成后,执行else代码块。
若循环体由break语句跳出,那么无论是否存在else代码块,else代码块均不会执行。
这一点是与c/cpp不同的点,需要额外注意。
与c/cpp类似,可以使用continue跳过循环内该语句之下的其他内容。
# 不断读取整数并对正整数进行加法运算
print('对正整数进行加法运算(输入-9999表示结束)。')
sum = 0
while True:
n = int(input('整数:'))
if n == -9999:
break
if n <= 0:
continue
sum += n
print('正整数总和为:', sum, '。')
两个实例
猜数游戏。
# 猜数字游戏
import random
MAX = 1000
MAX_STAGE = 10
print('请在{}次之内猜出范围在1~{}的数字'.format(MAX_STAGE, MAX))
stage = 1
answer = random.randint(1, MAX)
while stage <= MAX_STAGE:
print('第{}次 正确数字是多少:'.format(stage))
n = int(input())
if n < 1 or n > 1000:
continue
if n == answer:
print('正确!第{}次猜中'.format(stage))
break
elif n < answer:
print('正确数字要大一些。')
else:
print('正确数字要小一些。')
stage += 1
else:
print('真可惜。正确数字是{}。'.format(answer))
猜拳游戏。
# 猜拳游戏
import random
print('猜拳游戏。')
# 胜利次数、失败次数、平局次数
win_no = lose_no = draw_no = 0
while True:
comp = random.randint(0, 2)
while True:
human = int(input('石头剪刀布(0:石头/1:剪刀/2:布)'))
if 0 <= human <= 2:
break
print('计算机出的是:', end='')
if comp == 0:
print('石头', end='')
if comp == 1:
print('剪刀', end='')
if comp == 2:
print('布', end='')
print('。')
# 判断胜负
judge = (human - comp + 3) % 3
if judge == 0:
print('平局。')
draw_no += 1
elif judge == 1:
print('你输了。')
lose_no += 1
else:
print('你赢了')
win_no += 1
retry = int(input('再玩一局?(0:是/1:否):'))
if retry == 1:
break
print('成绩:{}次成功,{}次失败,{}次平局'.format(win_no, lose_no, draw_no))
for 语句
Python的for语句与c/cpp的for语句的思维完全不同。
c/cpp:同while循环,判断循环条件是否成立从而控制循环。
Python:不断按顺序取出序列中的值作为变量值,然后执行代码组,知道序列中的所有数字被取出。
貌似C11标准也有一种类似的for循环,是说看着眼熟。
# 按读取次数打招呼(从0考试计数)
n = int(input('打招呼的次数:'))
for i in range(n):
print('No.', i, ':你好。')
其中的range就生成了一个从0开始,n-1结束的序列。
# 整数的递增计数
start = int(input('开始:'))
end = int(input('结束:'))
step = int(input('步进:'))
for count in range(start, end, step):
print(count, end=' ')
print()
上述代码解释了range函数的第三个参数的意义:生成序列的步进。
同样,for函数也同while函数一样,可以使用else代码块。
#生成n个10~99的随机数
import random
n = int(input('生成的随机数的个数:'))
for _ in range(n):
r = random.randint(10, 99)
if r == 13:
print('\n根据条件终止循环。')
break
print(r, end=' ')
else:
print('\n生成随机数结束')
两个实例
列举奇数:
# 列举奇数。
n = int(input('整数:'))
for i in range(1, n + 1, 2):
print(i, end=' ')
print()
列举约数:
# 读取整数后列举该数的全部约数
n = int(input('整数:'))
for i in range(1, n + 1):
if n % i == 0:
print(i, end=' ')
print('')
一点心得
实际上,for循环只和in后的列表内容有关,而且是按顺序取出in后的列表。
如果列表是1、2、3、4、5,那么i的值就是1、2、3、4、5,之后循环结束。
同样,如果列表的值毫无规律,如3、5、2、4、1,那么i的值就是一次一次按顺序取出的值:3、5、2、4、1。
很明显这种循环方式更加灵活。
比如需要跳过某一个数字来进行循环的情况,就可以不适用if语句在循环体内进行循环,而是在构建循环序列时进行操作。使得循环所耗的代价更小。
# 对整数1~12进行循环但跳过8.
for i in list(range(1, 8)) + list(range(9, 13)):
print(i, end=' ')
print()
多重循环
和c/cpp一样,只不过Python使用缩进来判断语句所处于的循环位置。
举两个小例子即可。
九九乘法表。
# 打印输出九九乘法表
print('-' * 27)
for i in range(1, 10):
for j in range(1, 10):
print('{:3d}'.format(i * j), end='')
print()
print('-' * 27)
等腰三角形。
# 输出直角三角形。
n = int(input('腰长:'))
for i in range(1, n+1):
for j in range(1, i + 1):
print('*', end='')
print()