Python循环结构

循环结构

1. for 循环结构

语法:
for 变量 in 序列:
    循环体

​ 循环的次数与序列中的元素个数有关。

​ 常见序列:字符串、元组、列表、字典、集合、迭代器、生成器、range

range函数

​ 用于产生指定范围的数字序列

1. range(N)                 -   产生[0,N)的数字序列,其中步长是1
2. range(M,N)            -   产生[M,N)的数字序列,步长为1
3. range(M,N,step)    -   产生[M,N)的数字序列,步长为step指定的值

练习: 打印100以内所有偶数

# 方法一:
for i in range(100):
    if i % 2 == 0:
        print(i, end=' ')
print('\n')

# 方法二
for i in range(0, 100, 2):
    print(i, end=' ')
print('\n')

2. while 循环

语法
while 条件语句:
    循环体

​ while 循环控制循环次数的原则:让条件经历过指定次数后由True变成False

while 和 for 的选择
  • for 循环: 循环次数确定时, 使用for循环。

  • while循环: 循环次数不确定,或使用死循环时,使用while循环。

    (程序员在写代码的时候没办法通过任何方式来确定循环次数)

练习:输入一个数字,若输入的数字不是0,则继续输入

num = input('请输入一个数字:')
while num != 0:
	num = input('请继续输入一个数字:')

3. 循环关键字

continue 和 break

​ 注:continue和break只能出现在循环体中。

  • continue:结束当前循环(不会影响循环次数)

    如果在执行循环体的时候遇到了continue,那么当次循环结束,直接进入下一次循环

  • break:结束整个循环(会影响循环次数)

包含break的while循环

​ 语法:

while True:
    需要重复执行的操作
    if 循环结束的条件:
        break
else

循环的完整结构

for 变量 in 序列:
    循环体
else:
    代码段
    
================

while 条件语句:
    循环体
else:
    代码段

else结构的存在不会影响原来的执行;

循环自然结束时,执行else中的代码段;

若通过break结束循环,则不执行else中的代码段。

练习

基础题
  1. 使用for和while循环输出 0~100内所有3的倍数。

    for i in range(100):
        if i % 3 == 0:
            print(i)
    =========================
    num = 0
    while num < 100:
        if num % 3 == 0:
            print(num)
        num += 1
    
  2. 使用for和while循环输出100~200内个位数或者十位数能被3整除的数。

    for i in range(100, 200):
        if i % 10 % 3 == 0 or i // 10 % 10 % 3 == 0:
            print(i)
    =======================================================
    num = 100
    while num < 200:
        if num % 10 % 3 == 0 or num // 10 % 10 % 3 == 0:
            print(num)
        num += 1
    
  3. 统计100~200中十位数是5的数的个数

    num = 0
    for i in range(100, 200):
        if i // 10 % 10 == 5:
            num += 1
    print(num)
    
  4. 打印50~150中所有能被3整除但是不能被5整除的数

    for i in range(50, 150):
        if i % 3 == 0 and i % 5 != 0:
            print(i)
    
  5. 计算50~150中所有能被3整除但是不能被5整除的数的和

    sum_i = 0
    for i in range(50, 150):
        if i % 3 == 0 and i % 5 != 0:
            sum_i += i
    print(sum_i)
    
进阶题
  1. 使用循环计算1*2*3*4*...*10的结果。

    product_i = 1
    for i in range(1, 11):
        product_i *= i
    print(product_i)
    
  2. 统计100以内个位数是2并且能够被3整除的数的个数。

    num = 0
    for i in range(100):
        if i % 10 == 2 and i % 3 == 0:
            num += 1
    print(num)
    
  3. 输入任意一个正整数,求他是几位数?

    注意: 这儿不能使用字符串,只能用循环

    num = int(input('请输入一个正整数:\n'))
    x = 0  # 位数
    while num // 10 != 0:
        x += 1
        num //= 10
    else:
        x += 1       # 最后一位数不满足条件语句,没有计算
    print(x)
    
  4. 打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是 一个水仙花数,因为 1³ + 5³ + 3³ 等于 153。

    for i in range(100, 1000):
        i_1 = i // 100
        i_2 = i // 10 % 10
        i_3 = i % 10
        if i_1**3 + i_2**3 + i_3**3 == i:
            print(i, end=' ')
    print('\n')
    
挑战题
  1. 判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)

    num = int(input('请输入一个数:\n'))
    if num == 1:
        print(num, '既不是素数也不是合数', sep='')
    elif num == 2:
        print(num, '是素数', sep='')
    else:
        for i in range(2, num):
            if num % i == 0:
                print(num, '不是素数', sep='')
                break
        else:
            print(num, '是素数', sep='')
    
  2. 求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)

    n = int(input('请输入n的值:\n'))
    if n == 1 or n == 2:
        print('斐波那契数列的第', n, '个值为1', sep='')
    else:
        vaule_1 = 1
        vaule_2 = 1
        for i in range(n - 2):
            vaule = vaule_1 + vaule_2
            vaule_1 = vaule_2
            vaule_2 = vaule
        print('斐波那契数列的第', n, '个值为', vaule, sep='')
    
  3. 输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

    for i in range(1, 10):
        for j in range(1, 10):
            print(i, 'x', j, '=', i * j, sep='', end=' ')
        print('')
    
  4. 这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)

    for x in range(35):
        for y in range(100 - x):
            if x * 3 + y * 2 + (100 - x - y) / 2 == 100:
                print('共有大马', x, '匹,中马', y, '匹,小马', (100 - x - y), '匹', sep='')