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()

04-23 19:27