Day004 - 循环

循环

  • 让代码重复执行(代码写一遍,运行的时候可以执行多次)

while与for循环的选择

  • for 循环:循环次数确定的时候使用

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

for循环

语法

for 变量 in 序列:
    循环体

说明

  • for | in | : - 关键字,固定写法
  • 变量 - 写一个变量名(可以是已经定义过的,也可以没有定义过的);
  • 序列 - 容器型数据类型对应的数据,常见序列:字符串、列表、元组、字典、集合、迭代器、生成器、range等;
  • 循环体 - 和for保持一个缩进的语句或语句块,是需要重复执行的代码;
  • for循环的循环次数和序列中的元素个数有关;

执行过程

  • 让变量依次取序列中的值,取完为止,每取一个值执行依次循环体;

    for x in 'abc123':
        print(x, 'hello')
    """
    x = 'a':print(x,'hello') -> print('a','hello')
    x = 'b':print(x,'hello') -> print('b','hello')
    x = 'c':print(x,'hello') -> print('c','hello')
    ...
    x = '3':print(x,'hello') -> print('3','hello')
    """
    

range函数

  • 产生指定范围的数字序列

range(N)

  • 产生[0,N)的数字序列,步长为1;

    # 用法1:产生0开始步长为1的数字序列
    for i in range(5):
        print(i)
    
    # 用法2:直接的控制循环次数
    for i in range(4):
        print('hello')
    

range(M,N)

  • 产生[0,N)的数字序列,步长为1;

    print('=====for i in range(-5, 5)=====')
    for i in range(-5, 5):
        print(i, end=' ')
    

range(M,N,step)

  • 产生[M,N)的数字序列,步长为step;

    print('=====for i in range(5, -5,-1)=====')
    for i in range(5, -5, -1):
        print(i, end=' ')
    print()
    print('=====for i in range(20, 0, -3)=====')
    for i in range(20, 0, -3):
        print(i, end=' ')
    

练习

  1. 打印100以内所有的偶数

    for i in range(2, 101, 2):
        print(i, end=' ')
    
  2. 打印100-200中所有个位数是3的数

    # 方法1:
    for i in range(103, 200):
        if i % 10 == 3:
            print(i, end=' ')
    # 方法2:
    for j in range(103, 200, 10):
        print(j, end=' ')
    
  3. 打印所有的水仙花数

    for i in range(100, 1000):
        a = i % 10
        b = i % 100 // 10
        c = i // 100
        if a ** 3 + b ** 3 + c ** 3 == i:
            print(i, end=' ')
    
  4. 统计100以内偶数的个数

    num = 0
    for i in range(0, 100, 2):
        num += 1
    print(num)
    
  5. 统计100以内能被3整除的偶数的个数

    # 方法1:
    num = 0
    for i in range(0, 100, 3):
        if i % 2 == 0:
            num += 1
    print(num)
    # 方法2:
    num = 0
    for i in range(0, 100, (2*3)):
        num += 1
    print(num)
    
  6. 统计1+2+3+…+100的和

    num = 0
    for i in range(1, 101):
        num += i
    print(num)
    
  7. 计算所有水仙花数的和

    num = 0
    for i in range(100, 1000):
        a = i % 10
        b = i % 100 // 10
        c = i // 100
        if a ** 3 + b ** 3 + c ** 3 == i:
            num += i
    print(num)
    

while循环

语法

while 条件语句:
    循环体

说明

  • while | : - 关键字固定写法;
  • 条件语句 - 任何有结果的表达式;(只有赋值语句不行);
  • 循环体 - 和while保持一个缩进的一条或者多条语句是需要重复执行的代码;

执行过程

  1. 先判断条件语句是否为True,如果为True就执行循环体;

  2. 执行完循环体再判断条件是否为True,如果依旧为True就再次执行循环体,直到条件语句为False;

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

练习

  1. 让用户不断输入数字,直到输入的数字为0

    # 方法1:
    num = 1
    while num:
        num = int(input('请输入数字:'))
        if num == 0:
            print('输入正确')
            
    # 方法2:
    value = ''
    while value != '0':
        value = input('请输入:')
        
    # 方法3:
    while True:
        num = int(input('请输入数字:'))
        if num == 0:
            print('输入正确!')
            break
    

循环关键字 - continue 、break、else

  • continue 和 break 只能出现在循环体中;

continue

  • 结束一次循环/结束当次循环;

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

    for i in range(10):
        # 当i为偶数的时候直接跳过打印i的值
        if i % 2 == 0:
            continue
        print(i)
    

break

  • 结束整个循环;

  • 如果在执行循环体的时候遇到了break,整个循环直接结束;

    for i in range(1, 10):
        # 当i为偶数的时候直接结束循环
        if i % 2 == 0:
            break
        print(i)
    
  • 有了break的while循环

    """
    while True:
        需要重复执行的操作
        if 循环结束的条件:
            break
    """
    while True:
        value = input('请输入:')
        if value == '0':
            print('输入正确')
            break
    

else

  • else结构的存在不影响原来循环的执行;

  • 当循环正常执行完成,执行else代码段;

  • 当循环被break终止,else代码段不会被执行;

    # 完整的for循环
    for 变量 in 序列:
        循环体
    else:
        代码段
        
    # 完整的while循环
    while 条件语句:
        循环体
    else:
        代码段
    
  • 例子:

    for x in range(4):
        print(x, '====')
        if x == 2:
            break
    else:
        print('else正常执行')
    

课后习题

基础题

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

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

    # for
    for i in range(100, 201):
        if i % 10 % 3 == 0 or i // 10 % 10 % 3 == 0:
            print(i)
            
    # while
    num = 100
    while True:
        if num % 10 % 3 == 0 or num // 10 % 10 % 3 == 0:
            print(num)
        num += 1
        if num == 200:
            break
    
  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,151):
        if i % 3 == 0 and i % 5 != 0:
            print(i)
    
  5. 计算50~150中所有能被3整除但是不能被5整除的数的和

    sum1 = 0
    for i in range(50,151):
        if i % 3 == 0 and i % 5 != 0:
            sum1 += i
    print(sum1)
    

进阶题

  1. 使用循环计算1*2*3*4*...*10的结果。

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

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

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

    num = int(input('请输入一个正整数:'))
    num1 = 0
    while num:
        num //= 10
        num1 += 1
        if num == 0:
            break
    print('输入的数为:', num1, ' 位数')
    
  4. 打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是

    ⼀个⽔仙花数,因为 1³ + 5³ + 3³ 等于 153。

    for i in range(100, 1000):
        a = i % 10
        b = i % 100 // 10
        c = i // 100
        if a ** 3 + b ** 3 + c ** 3 == i:
            print(i, end=' ')
    

挑战题

  1. 判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)

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

    # 列表
    n = int(input('请输入裴波纳契数列要求的第几项:'))
    nl = [1] * n
    for i in range(2, n):
        nl[i] = nl[i - 1] + nl[i - 2]
    print(nl[n-1])
    
    # 通项公式
    n = int(input('请输入裴波纳契数列要求的第几项:'))
    print(int((1/5**0.5)*(((1+5**0.5)/2)**n-((1-5**0.5)/2)**n)))
    
    # 循环
    num = int(input('请输入裴波纳契数列要求的第几项:'))
    n1 = 1
    n2 = 1
    if num <= 2:
        print(n1)
    else:
        for i in range(num-2):
            n = n1 + n2
            n1 = n2
            n2 = n
        print(n)
    
    
  3. 输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

    for i in range(1, 10):
        for j in range(1, i + 1):
            # print(i, '*', j, '=', i * j, end=' ')
            print('{}*{}={:<3}'.format(i, j, i * j), end=' ')
            if i == j:
                print()
    
    # 结果
    1*1=1   
    2*1=2   2*2=4   
    3*1=3   3*2=6   3*3=9   
    4*1=4   4*2=8   4*3=12  4*4=16  
    5*1=5   5*2=10  5*3=15  5*4=20  5*5=25  
    6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  
    7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  
    8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  
    9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
    
  4. 这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)

for big in range(101):
    for middle in range(101):
        for small in range(101):
            if big + middle + small == 100 and 3 * big + 2 * middle + small / 2 == 100:
                print('大马:', big, '中马:', middle, '小马:', small)
# 结果
大马: 2 中马: 30 小马: 68
大马: 5 中马: 25 小马: 70
大马: 8 中马: 20 小马: 72
大马: 11 中马: 15 小马: 74
大马: 14 中马: 10 小马: 76
大马: 17 中马: 5 小马: 78
大马: 20 中马: 0 小马: 80
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值