Day4

循环

循环这个环节呢,算是个人认为比较难的一个环节,对于这个循环里面的循环步骤个人认为有点绕弯子,不过在本篇文章中,我个人也针对这些问题进行了个人的总结和方法的归纳。

一、 程序的三大流程

想要写好一串代码个人认为一定要知晓它其中的基本流程,只有脑子里有概念了,手上一定也不会差到哪里去。所以先总结一下程序的三大流程

  • 顺序:代码的执行顺序遵循从上到下的顺序,顺序执行代码
  • 分支:根据条件判断,决定执行代码的分支
  • 循环:让特定的代码,执行循环的操作

    二、 while循环的基本使用

    2.1 while语句基本语法

    上面也说过了,循环就是让特定的代码执行循环的操作。while循环最常见的应用场景就是:让执行的代码按照指定的次数重复执行,代码演示如下 ```bash

    1. 定义重复次数计数器

    i = 1

2. 使用 while 判断条件

while i <= 5:

  1. # 要重复执行的代码
  2. print("Hello Python")
  3. # 处理计数器 i
  4. i = i + 1

print(“循环结束后的 i = %d” % i)

  1. (以上代码就是利用while循环 循环打印了5hello word)<br />注:while 语句以及缩进部分是一个 完整的代码块
  2. 针对这一串代码我们可以来分析一下每条代码对应的意思:
  3. i = 1,这个 i 在这里其实我们可以把它理解为一个计数器,也就说记录我们这个while循环次数的一个变量<br />while i < 5: ,这一句的意思呢,我们可以理解为让这个 i 循环5次在第4次循环结束的时候退出循环,打印输出4次循环的结果。如果是 i <= 5,就是循环6次,在第5次的循环结束时退出循环,打印5次结果。<br />print就不多说了,打印输出()里面的内容<br />i += 1,这一句的意思就是在每一次循环结束的时候让 i 这个变量加 1 然后回到while i < 5这里进行判断。
  4. 假代码格式如下:<br />![微信截图_20210702104721.png](https://cdn.nlark.com/yuque/0/2021/png/21689121/1625194079268-d043c13d-df8b-44e0-9017-57b62921a317.png#clientId=u828c02d0-0585-4&from=ui&id=u1034e0ec&margin=%5Bobject%20Object%5D&name=%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20210702104721.png&originHeight=204&originWidth=711&originalType=binary&ratio=1&size=7822&status=done&style=none&taskId=u234607b5-865d-4b9f-8595-281493f2693)<br />在写循环代码的时候可能会遇到**死循环**,遇到了也不需要担心,检查一下代码是否有添加计数器 + 1这样的操作可以有效地减少这种事情发生的概率。**死循环由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止!**
  5. <a name="F4s0k"></a>
  6. #### 2.2 赋值运算符
  7. - python中,用 = 可以给变量进行赋值
  8. - 在算术运算时,为了简化代码的编写,Python 还提供了一系列的 算术运算符 对应的 赋值运算符
  9. - 注:在进行赋值运算符的编写时,中间不能有空格。(正确示范:+= 错误示范:+ =)<br />下表总结了赋值运算符
  10. ![微信截图_20210702105214.png](https://cdn.nlark.com/yuque/0/2021/png/21689121/1625194355027-403db5b6-874c-4408-9e1f-79189be487dc.png#clientId=u828c02d0-0585-4&from=ui&id=udc1d894e&margin=%5Bobject%20Object%5D&name=%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20210702105214.png&originHeight=346&originWidth=764&originalType=binary&ratio=1&size=18546&status=done&style=none&taskId=ue5512712-6f27-468e-9619-054688cf981)<br />注:**在赋值运算符的书写过程中一定不能空格 不能有空格 不能有空格,虽然你加了空格系统也会报错给你。**
  11. <a name="u6FtT"></a>
  12. #### 2.3 Python 中的计数方法
  13. 常见的计数方式有两种,可以分别被称为:<br />自然计数法:自然计数法(从 1 开始)—— 更符合人类的习惯,所以我叫他人类计数法。<br />程序计数法:(从 0 开始)—— 几乎所有的程序语言都选择从 0 开始计数<br />因此,大家在编写程序时,应该尽量养成习惯:除非需求的特殊要求,否则 循环 的计数都从 0 开始
  14. <a name="bliF6"></a>
  15. #### 2.4 循环计算
  16. 在程序开发中,通常会遇到利用循环重复计算的需求,那我们怎么去满足这个要求呢,看代码我们来分析一下:<br />1.计算 0 ~ 100 之间所有数字的累计求和结果<br />![微信截图_20210702110552.png](https://cdn.nlark.com/yuque/0/2021/png/21689121/1625195359595-a422a3da-a4d9-40c9-833d-7d53949fbd5f.png#clientId=u828c02d0-0585-4&from=ui&id=u6d824d4d&margin=%5Bobject%20Object%5D&name=%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20210702110552.png&originHeight=251&originWidth=861&originalType=binary&ratio=1&size=28156&status=done&style=none&taskId=ucdd74ff7-65d4-43ba-9786-0ca508067d4)<br />其实不难看出,这串代码跟我们一开始的那一串代码很相似,只是加了几个小东西而已,我们来一个个分析一下
  17. - 第一步,先不用急着看e = 0是啥东西,让我们先找到while循环的框架,也就是从i = 1开始到后面的 i += 1,这个框架里面定义了 i 循环的次数是小于等100次,也就是转100圈而已嘛哈哈
  18. - 第二步,找一下在这个基本循环的框架上加了啥东西。我们可以看到在这串代码里多了e = 1e += iprint(’1-100的求和结果是%d % e),它们分别代表的是:
  19. - e = 0:设置 e 这个变量去承接 i 循环了100次后的值相加的总和。
  20. - e += i:前面说过了,代码的执行顺序遵循从上到下的顺序,所以我们一步一步来走代码看一下。首先,i =1,进入下一步,判断 i 这个值是否小于等于100,条件成立,进入下一步,打印输出当前的 i ,进入下一步,e += i,在赋值运算符里面我们了解到 c += a是等效于 c = c + a的。所以 num += i 就是等于 e = e + i 。因为e的值我们在前面定义了为0,所以这个等式就是用于计算他们每一次每个数相加的结果的。
  21. - print(’1-100的求和结果是%d % e):这个其实就很简单理解了,我们在前面也讲到过输出格式化,所以这个print的作用就是把这个e的值在循环结束的时候打印出来。
  22. **需求进阶**<br />1.计算 0 ~ 100 之间 所有 偶数 的累计求和结果<br />开发步骤
  23. 1. 编写循环 确认 要计算的数字
  24. 1. 添加 结果 变量,在循环内部 处理计算结果
  25. 如果我们给它加个计算1~100以内所有偶数的和加上判断条件,我们应该怎么去写呢?代码如下:
  26. ```bash
  27. # 0. 最终结果
  28. result = 0
  29. # 1. 计数器
  30. i = 0
  31. # 2. 开始循环
  32. while i <= 100:
  33. # 判断偶数
  34. if i % 2 == 0:
  35. print(i)
  36. result += i
  37. # 处理计数器
  38. i += 1
  39. print("0~100之间偶数求和结果 = %d" % result)

其实很简单,这一道题只是在原基础上加了一个 if 判断条件 判断这个 i 取余2是否为0 如果判断条件成立就输出 i ,然后再按照上面的流程把程序走完。

三、break 和 continue

  • break:某一个条件满足后,退出循环,不再执行后续重复的代码
  • continue:某一个条件满足后,不执行后续重复的代码,但是他不会退出当前循环,而是回到当前循环伊始
  • break 和continue只针对当前循环有效 .

    3.1 break

    在循环过程中,某一个条件满足后,不希望再执行后续重复的代码,使用break可以退出循环,代码如下: ```bash i = 0

while i < 10:

  1. # break 某一条件满足时,退出循环,不再执行后续重复的代码
  2. # i == 3
  3. if i == 3:
  4. break
  5. print(i)
  6. i += 1

print(“over”)

  1. 其实也可以这么理解,break 它在循环中 拿到它所需要的值时他就溜了,拿到自己想要的东西就,跑了罢工了。<br />**break 只针对当前所在循环有效。**
  2. <a name="xBT73"></a>
  3. #### 3.2 continue
  4. 在循环过程中,某一条件满足后,不希望继续执行后面的代码但是又不想退出循环,就可以使用continue。也就是说在一整个循环里面,只有某些条件不需要执行循环代码,其他的条件都要执行。<br />最典型的跳七游戏,代码如下:
  5. ```bash
  6. i = 0
  7. while i < 10:
  8. # 当 i == 7 时,不希望执行需要重复执行的代码
  9. if i == 7:
  10. # 在使用 continue 之前,同样应该修改计数器
  11. # 否则会出现死循环
  12. i += 1
  13. continue
  14. # 重复执行的代码
  15. print(i)
  16. i += 1

在这个过七游戏中可以看到其实也只是加了一条 if 的判断和 continue而已,if i == 7 i += 1 continue这一串代码代表的意思就是说如果当 i 这个变量的数值到达7的时候,i + 1,然后continue回到while i <= 10这一块,注意,这里的这个i += 1是必要的,如果不加的话会出现continue完了以后一直形成一个死循环,也就是 i 的数值会一直是7。

四、while循环嵌套

while嵌套简单来说就是while里面还有while,我们用一个具体的代码实例来分析一下,代码要求是使用循环嵌套打印5行依次递增的小星星,分别是四个代码。三个我做错的案例,还有一个成功的,我把他们一一剖析说一下。

4.1 打印小星星

  1. i = 0
  2. while i <= 5:
  3. a = 0
  4. while a <= i:
  5. print('* ', end='')
  6. a += i
  7. print('')
  8. i += 1

首先是第一个。这个代码的前半部分确实是没什么问题,问题就出在 在第二个while循环里面 我最后给计数器定义的是a += i 。由于前面的a和 i 的变量赋值都是0 所以会导致在程序走到 a += i 这里的时候呢出现死循环的现象,毕竟a += i 得出来的数字永远是0,a += i 计算完后得到a的值回到第二个循环里面判断a 是否 <= i 因为一直是0 所以就会在第二个循环这里进入死循环.

那在看完第一个代码后可能有些朋友会有些疑惑,那他既然是等于0一直循环,给他换个值不就完事了吗,我也这么想过,所以我把a 和 i 换成1又试了一下,结果还是出问题了=。=我们来看一下代码

  1. i = 1
  2. while i <= 5:
  3. a = 1
  4. while a <= i:
  5. print('* ', end='')
  6. a += i
  7. print('')
  8. i += 1

微信截图_20210702184943.png
这一次的确实要比第一次理想很多嚯,毕竟把它从无限循环变成了5行星星列数有了是啊吧,但是不行啊,跟我们理想的依次递增的星星还是有蛮大的差距,不过也不碍事,先来分析一下代码。
首先呢 我们把他一开始的两个变量的赋值改了一下,改成了1,他输出的东西一下子就变成了一个能让你看的舒服的东西了,但是我们注意一下 他之所以会运行出这个样子,还是因为在 a += i 这里出了问题,当第一次的循环走完的时候 a 的值变成了2他折回循环判断那里,判断不正确 毕竟2不大于1 这个是个人都知道 然后跳出循环最后来到 i += 1这里,这第一次循环都没有错,第一行只打印了一个星星。等到了第二次循环的时候问题就来了,此时的 i 的值是等于2的 依次往下判断 i 小于等于5 成立,然后 a = 1判断出 a 的值是没有 i 的大的 条件成立,接着往下走打印输出一个星星并且不让它换行(end = ‘’),然后划重点 这里的 a += i 也就是说是1+2=3,然后循环回来第二个while那里判断,条件不成立,直接退出当前循环去到打印print(’’)和 i += 1那里。所以说在第二次循环里由于a的值的问题导致他只打印了一个星星。后面的都是同样的我就不废话了。所以我们可以得到问题是在a += i 这里。

我们接着看第三个代码:

  1. i = 0
  2. while i <= 5:
  3. a = 0
  4. while a <= i:
  5. print('* ', end='')
  6. a += 1
  7. print('')
  8. i += 1

微信截图_20210702185510.png
当我把 a += i 改成 a += 1后,嚯嚯 这个就牛x了 直接让我给整出来了,但是其实细心一点可以发现它竟然打印了6行星星=。=不过这个要比前面两个好解决,因为在前面说过了如果i <= 5的话确实会循环6次打印6次,所以我们把 i <= 5改成 i < 5 或则 把 i = 0 a = 0 这两个变量值都改成1 就完事了。来看下代码:
微信截图_20210702190006.png

微信截图_20210702190015.png
冲冲冲 终于成功了 所以大致在玩这个小星星的时候会遇到这么几个比较大的问题,仅是个人感觉而已,大佬请无视=。=
补充几个东西:

  • 在默认情况下,print 函数输出内容之后,会自动在内容末尾增加换行
  • 如果不希望末尾增加换行,可以在 print 函数输出内容的后面增加 , end=””
  • 其中 “” 中间可以指定 print 函数输出内容之后,继续希望显示的内容

    4.2 打印九九乘法表

    这个就不废话了,大致流程跟刚刚那个星星都是一样的,就只是在print那里变了一下而已,直接看代码 ```bash i = 1 while i <= 9: a = 1 while a <= i:
    1. print("%d * %d = %d" % (i, a, i * a), end='\t')
    2. a += 1
    print(‘’) i += 1

``` 微信截图_20210702190841.png
这里要说的东西就只有一个,就是这个end=’\t’里面的\t,这个是字符串中的转义字符,看一下表格就懂了
微信截图_20210702191049.png