> 文章列表 > 【Python】Python学习笔记(四)循环语句

【Python】Python学习笔记(四)循环语句

【Python】Python学习笔记(四)循环语句

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()
# 从一个正整数开始递减计数到0print('递减计数。')
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 += ii += 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:breaksum = 0
i = 1while i <= n:sum += ii += 1
print('1到{}的和是{}。'.format(n, sum))

其中else语句与break语句的关系如下:
若循环体没有执行break语句,则循环执行完成后,执行else代码块。
若循环体由break语句跳出,那么无论是否存在else代码块,else代码块均不会执行。

这一点是与c/cpp不同的点,需要额外注意。

与c/cpp类似,可以使用continue跳过循环内该语句之下的其他内容。

# 不断读取整数并对正整数进行加法运算print('对正整数进行加法运算(输入-9999表示结束)。')sum = 0while True:n = int(input('整数:'))if n == -9999:breakif n <= 0:continuesum += nprint('正整数总和为:', sum, '。')

两个实例

猜数游戏。

# 猜数字游戏import randomMAX = 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:continueif n == answer:print('正确!第{}次猜中'.format(stage))breakelif n < answer:print('正确数字要大一些。')else:print('正确数字要小一些。')stage += 1
else:print('真可惜。正确数字是{}。'.format(answer))

猜拳游戏。

# 猜拳游戏import randomprint('猜拳游戏。')# 胜利次数、失败次数、平局次数
win_no = lose_no = draw_no = 0while True:comp = random.randint(0, 2)while True:human = int(input('石头剪刀布(0:石头/1:剪刀/2:布)'))if 0 <= human <= 2:breakprint('计算机出的是:', end='')if comp == 0:print('石头', end='')if comp == 1:print('剪刀', end='')if comp == 2:print('布', end='')print('。')# 判断胜负judge = (human - comp + 3) % 3if judge == 0:print('平局。')draw_no += 1elif judge == 1:print('你输了。')lose_no += 1else:print('你赢了')win_no += 1retry = int(input('再玩一局?(0:是/1:否):'))if retry == 1:breakprint('成绩:{}次成功,{}次失败,{}次平局'.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 randomn = int(input('生成的随机数的个数:'))for _ in range(n):r = random.randint(10, 99)if r == 13:print('\\n根据条件终止循环。')breakprint(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()