# 循环结构

循环结构就是在程序中控制某条或某些指令重复执行的结构,在 python 中构造循环结构有两种做法,一种是 for-in 循环,一种是 while 循环。

# for-in 循环

如果明确知道循环执行的次数,推荐使用 for-in 循环

看下面这个列子:计算 1~100 的和


sum = 0

for x in range(1,101):
    sum += x

print(sum)

注意:range 函数左闭右开

计算 1~100 之间偶数的和:

sum = 0

for x in range(1,101):
    if x % 2 == 0:
        sum += x

print(sum)

当然还有更方便的方式:

sum = 0

for x in range(0,101,2):
    sum += x

print(sum)

那么计算 1~100 之间奇数之和呢?

sum = 0

for x in range(1,101,2):
    sum += x

print(sum)

# while 循环

如果不知道循环执行的次数,推荐使用 while 循环

猜数字游戏:计算机出一个1到100的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点,小一点,猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。

import random

# 随机数
random_num = random.randint(1,100)

# 计数器
counter = 0

# 执行循环
while True:
    my_num = int(input('请输入你的号码:'))   

    counter += 1

    if my_num > random_num:
        print('小一点')
    elif my_num < random_num:
        print('大一点')
    else:
        print('恭喜你猜对了')
        break
    
print('你一共猜了 %d 次' % counter)

if counter > 7:
    print('你的智商余额明显不足')

注意:和分支结构一样,循环结构也是可以嵌套的

例如输出九九乘法表

for x in range(1,10):
    for j in range(1,x+1):
        print('%d * %d = %d' % (x,j,x*j),end='\t')
    print()

# 练习

练习1:输入一个正整数判断是不是素数

素数指的是只能被1和自身整除的大于1的整数


'''
   普通的解决方案
'''

num = int(input('请输入您的数字:'))
is_su = True

for x in range(1,num + 1):
    if x == 1 or x == num:
        continue
    if num % x == 0 :
        is_su = False
        break

if is_su and num != 1:
    print('%d 是素数' % num)
else:
    print('%d 不是素数' % num)


'''
   更简单的处理方案
'''

from math import sqrt

num = int(input('请输入一个正整数:'))
end = int(sqrt(num))
is_prime = True

for x in range(2,end +1):
    if num % x == 0:
        is_prime = False
        break

if is_prime and num != 1:
    print(f'{num} 是素数')
else:
    print(f'{num} 不是素数')

练习2:输入两个正整数,计算它们的最大公约数和最小公倍数

两个数的最大公约数是两个数的公共因子中最大的那个数。两个数的最小公倍数是能够同时被两个数整除的最小的那个数。

x = int(input('x = '))

y = int(input('y = '))

# 最大公约数
if x > y:
    x,y = y,x

for factor in range(x,0,-1):
    if x % factor == 0 and y % factor == 0:
        print(f'{x}{y}的最大公约数是{factor}')
        print(f'{x}{y}的最小公倍数是{ x * y // factor}')
        break

练习3:打印三角形图案


'''
    *
    **
    ***
    ****
    *****
'''
row = int(input('请输入行数:'))
for x in range(row):
    for j in range(x+1):
        print('*',end='')
    print()


'''
    *****
     ****
      ***
       **
        *
'''
row = int(input('请输入行数:'))
for j in range(row,0,-1):
    for x in range(row):
        if j < row - x:
            print(' ',end='')
        else:
            print('*',end='')
    print()


'''
    *****
    ****
    ***
    **
    *
'''

row = int(input('请输入行数:'))
for x in range(row,0,-1):
    for j in range(x):
        print('*',end='')
    print()



'''
    *
   **
  ***
 ****
*****
'''

row = int(input('请输入行数:'))
for x in range(row):
    for j in range(row,0,-1):
        if j > x + 1:
            print(' ',end='')
        else:
            print('*',end='')
    print()

'''
    *
   ***
  *****
 *******
*********
'''

row = int(input('输入行数为:'))

for x in range(row):
    for j in range(row - x - 1):
        print(' ',end='')
    for j in range(2*x + 1):
        print('*',end='')
    print()