Day4
循环
循环这个环节呢,算是个人认为比较难的一个环节,对于这个循环里面的循环步骤个人认为有点绕弯子,不过在本篇文章中,我个人也针对这些问题进行了个人的总结和方法的归纳。
一、 程序的三大流程
想要写好一串代码个人认为一定要知晓它其中的基本流程,只有脑子里有概念了,手上一定也不会差到哪里去。所以先总结一下程序的三大流程
- 顺序:代码的执行顺序遵循从上到下的顺序,顺序执行代码
- 分支:根据条件判断,决定执行代码的分支
- 循环:让特定的代码,执行循环的操作
二、 while循环的基本使用
2.1 while语句基本语法
上面也说过了,循环就是让特定的代码执行循环的操作。while循环最常见的应用场景就是:让执行的代码按照指定的次数重复执行,代码演示如下
i = 1
while i < 5:
print('hello word')
i += 1
(以上代码就是利用while循环 循环打印了5次hello word)
注:while 语句以及缩进部分是一个 完整的代码块
针对这一串代码我们可以来分析一下每条代码对应的意思:
- i = 1,这个 i 在这里其实我们可以把它理解为一个计数器,也就说记录我们这个while循环次数的一个变量
- while i < 5: ,这一句的意思呢,我们可以理解为让这个 i 循环5次在第4次循环结束的时候退出循环,打印输出4次循环的结果。如果是 i <= 5,就是循环6次,在第5次的循环结束时退出循环,打印5次结果。
- print就不多说了,打印输出()里面的内容
- i += 1,这一句的意思就是在每一次循环结束的时候让 i 这个变量加 1 然后回到while i < 5这里进行判断。
假代码格式如下:
初始条件设置 —— 通常是重复执行的 计数器
while 条件(判断 计数器 是否达到 目标次数):
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
...(省略)...
处理条件(计数器 + 1
在写循环代码的时候可能会遇到死循环,遇到了也不需要担心,检查一下代码是否有添加计数器 + 1这样的操作可以有效地减少这种事情发生的概率。死循环由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止!
2.2 赋值运算符
- 在python中,用 = 可以给变量进行赋值
- 在算术运算时,为了简化代码的编写,Python 还提供了一系列的 与 算术运算符 对应的 赋值运算符
- 注:在进行赋值运算符的编写时,中间不能有空格。(正确示范:+= 错误示范:+ =)
下表总结了赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
%= | 取模(余数)赋值运算符 | c %= a 等效于 c = c % a |
**= | 取幂赋值运算符 | c **= a 等效于 c = c ** a |
注:在赋值运算符的书写过程中一定不能空格 不能有空格 不能有空格,虽然你加了空格系统也会报错给你=。=
2.3 Python 中的计数方法
常见的计数方式有两种,可以分别被称为:
- 自然计数法:自然计数法(从 1 开始)—— 更符合人类的习惯,所以我叫他人类计数法。
- 程序计数法:(从 0 开始)—— 几乎所有的程序语言都选择从 0 开始计数
因此,大家在编写程序时,应该尽量养成习惯:除非需求的特殊要求,否则 循环 的计数都从 0 开始
2.4 循环计算
在程序开发中,通常会遇到利用循环重复计算的需求,那我们怎么去满足这个要求呢,看代码我们来分析一下:
1.计算 0 ~ 100 之间所有数字的累计求和结果
num = 0
i = 1
while i <= 100:
print(i)
num += i
i += 1
print('%d' % num)
其实不难看出,这串代码跟我们一开始的那一串代码很相似,只是加了几个小东西而已,我们来一个个分析一下
- 第一步,先不用急着看num = 0是啥东西,让我们先找到while循环的框架,也就是从i = 1开始到后面的 i += 1,这个框架里面定义了 i 循环的次数是小于等100次,也就是转100圈而已嘛哈哈
- 第二步,找一下在这个基本循环的框架上加了啥东西。我们可以看到在这串代码里多了num = 1,num += i,print(’%d’ % num),它们分别代表的是:
- num = 0:设置 num 这个变量去承接 i 循环了100次后的值相加的总和。
- num += i:前面说过了,代码的执行顺序遵循从上到下的顺序,所以我们一步一步来走代码看一下。首先,i =1,进入下一步,判断 i 这个值是否小于等于100,条件成立,进入下一步,打印输出当前的 i ,进入下一步,num += i,在赋值运算符里面我们了解到 c += a是等效于 c = c + a的。所以 num += i 就是等于 num = num + i 。因为num的值我们在前面定义了为0,所以这个等式就是用于计算他们每一次每个数相加的结果的。
- print(’%d’ % num):这个其实就很简单理解了,我们在前面也讲到过输出格式化,所以这个print的作用就是把这个num的值在循环结束的时候打印出来。
那如果我们给它加个计算1~100以内所有偶数的和这个条件,让它看起来牛逼点,我们应该怎么去写呢?代码如下:
num = 0
i = 1
while i <= 10:
if i % 2 == 0:
print(i)
num += i
i += 1
print('最后的和%d' % num)
其实很简单,这一道题只是在原基础上加了一个 if 判断条件 判断这个 i 取余2是否为0 如果判断条件成立就输出 i ,然后再按照上面的流程把程序走完。
三、break 和 continue
敲重点!break和continue是专门在循环中使用的关键字
- break:某一个条件满足后,退出循环,不再执行后续重复的代码
- continue:某一个条件满足后,不执行后续重复的代码,但是他不会退出当前循环,而是回到当前循环伊始
- break 和continue只针对当前循环有效
3.1 break
在循环过程中,某一个条件满足后,不希望再执行后续重复的代码,使用break可以退出循环,代码如下:
i = 0
while i <= 10:
if i == 9:
break
print(i)
i += 1
print('over')
注:break只针对当前循环有效
3.2 continue
在循环过程中,某一条件满足后,不希望继续执行后面的代码但是又不想退出循环,就可以使用continue。也就是说在一整个循环里面,只有某些条件不需要执行循环代码,其他的条件都要执行。
最典型的跳七游戏,代码如下:
i = 0
while i <= 10:
if i == 7:
i += 1
continue
print(i)
i += 1
print('over')
在这个过七游戏中可以看到其实也只是加了一条 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 打印小星星
i = 0
while i <= 5:
a = 0
while a <= i:
print('* ', end='')
a += i
print('')
i += 1
首先是第一个。这个代码的前半部分确实是没什么问题,问题就出在 在第二个while循环里面 我最后给计数器定义的是a += i 。由于前面的a和 i 的变量赋值都是0 所以会导致在程序走到 a += i 这里的时候呢出现死循环的现象,毕竟a += i 得出来的数字永远是0,a += i 计算完后得到a的值回到第二个循环里面判断a 是否 <= i 因为一直是0 所以就会在第二个循环这里进入死循环。
那在看完第一个代码后可能有些朋友会有些疑惑,那他既然是等于0一直循环,给他换个值不就完事了吗,我也这么想过,所以我把a 和 i 换成1又试了一下,结果还是出问题了=。=我们来看一下代码
i = 1
while i <= 5:
a = 1
while a <= i:
print('* ', end='')
a += i
print('')
i += 1
#输出结果
*
*
*
*
*
Process finished with exit code 0
这一次的确实要比第一次理想很多嚯,毕竟把它从无限循环变成了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 这里。
我们接着看第三个代码:
i = 0
while i <= 5:
a = 0
while a <= i:
print('* ', end='')
a += 1
print('')
i += 1
*
* *
* * *
* * * *
* * * * *
* * * * * *
Process finished with exit code 0
当我把 a += i 改成 a += 1后,嚯嚯 这个就牛x了 直接让我给整出来了,但是其实细心一点可以发现它竟然打印了6行星星=。=(人当场都快没了哈哈)不过这个要比前面两个好解决,因为在前面说过了如果i <= 5的话确实会循环6次打印6次,所以我们把 i <= 5改成 i < 5 再看一下效果叭 QWQ~
i = 0
while i < 5:
a = 0
while a <= i:
print('* ', end='')
a += 1
print('')
i += 1
*
* *
* * *
* * * *
* * * * *
Process finished with exit code 0
冲冲冲 终于成功了 所以大致在玩这个小星星的时候会遇到这么几个比较大的问题,仅是个人感觉而已,大佬请无视=。=
补充几个东西:
- 在默认情况下,print 函数输出内容之后,会自动在内容末尾增加换行
- 如果不希望末尾增加换行,可以在 print 函数输出内容的后面增加 , end=""
- 其中 “” 中间可以指定 print 函数输出内容之后,继续希望显示的内容
4.2 打印九九乘法表
这个就不废话了,大致流程跟刚刚那个星星都是一样的,就只是在print那里变了一下而已,直接看代码
i = 1
while i <= 9:
a = 1
while a <= i:
print("%d * %d = %d" % (i, a, i * a), end='\t')
a += 1
print('')
i += 1
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
Process finished with exit code 0
这里要说的东西就只有一个,就是这个end=’\t’里面的\t,这个是字符串中的转义字符,看一下表格就懂了
描述 | 转义字符 |
---|---|
反斜杠符号 | \ |
单引号 | \ ’ |
双引号 | \ " |
换行 | \ n |
制表符 | \ t |
回车 | \ r |