单击上面的专辑,每天5分钟,从零开始学Python。
While 循环语句
Python语言提供了while和for循环结构,用于编制循环语句。在前2次课程中,我们学习了for循环语句,这次课,我们来看看while循环语句。
Python编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:
while 判断条件:
执行语句……
判断条件是循环执行的条件,每次循环执行前,都要执行条件表达式,对条件进行判断,当条件为真时则执行循环体语句,否则退出循环,如果条件表达式在循环开始时就为假,则不执行循环语句,直接退出循环。
执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。
执行流程图如下:
用一个例子来说明:请打印输出1到10以内所有的奇数。
启动IDLE,新建py文件,代码输入如下:
num = 1
while num < 10:
print (num)
num += 2
既然是打印10以内所有的奇数,所以打印输出的最小值是1,最大值是9.
在这段代码中,我们首先定义了一个整数变量num,赋予数值1。
我们将num < 10作为判断条件,当num当前值小于10的时候,执行后续的代码块。
代码块由2行代码组成,第一行是输出当前num值,第二行 num += 2 等同于 num = num +2。所以每一次循环,都要打印当前的num值,然后将num加上2.
第一次条件判断:
num=1,num<10条件语句判断为true,print函数输出num的当前值(1),将num+2变成3,然后进入下一次条件判断。
第二次条件判断:
num=3,num<10条件语句判断为true,print函数输出num的当前值(3),将num+2变成5,然后进入下一次条件判断。
以此类推,直到num=9,print函数输出num的当前值(9),将num+2变成11,然后进入下一次条件判断。条件不满足,退出循环。
输出结果:
再来完成一个练习,这次,我们需要计算1+2+3+……+100的和。
思考,这里我们有2个变量,一个是当前加到第几个数字了,一个是当前数字和是多少。循环的判断条件应该是当前要加的数字小于101。思考一下,代码如何写呢?
代码如下:
num = 1
total = 0
while num < 101:
total += num
num += 1
print("100以内整数的和为:%d" %total)
运行结果如下:
这里,total += num等同于total = total + num
一开始total和为0,每一次循环,都是之前的和,加上当前的num值。
num+=1 等同于 num = num +1, 所以,每一次循环,num都会加1。
一开始,num = 1, 满足判断条件num<101,执行代码块, total = total + num,total当前值为0, num=1, 所以total等于0+1变成1。num变成1=1等于2,满足条件判断,进行第二次循环。
在第二次循环中,新的total值= 当前total值(1)+ 当前num值(2),所以total = 1+2 =3, 而num变成2+1=3,满足条件判断,进入下一次循环。
以此类推:
total一直等于之前num的和加上当前num的值,所以相当于1+2+3+……+99+100,而此时num=101,不满足条件判断,退出了循环。
还记得我们最开始说的那个印度国王的故事吗?
在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里,赏给我1粒麦子,在第2个小格里给2粒,第3小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有的64格的麦粒,都赏给您的仆人吧!”国王觉得这要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。那么,宰相要求得到的麦粒到底有多少呢?
当时我们计算过:
第一天 1粒
第二天 1*2=2粒 2的(2-1)次方
第三天 2*2=4粒 2的(3-1)次方
第四天 2*2*2=8粒 2的(4-1)次方
。。。。。。以此类推
第六十四天国王需要摆2的(64-1)次方颗麦粒。
那么,如何通过编程来计算麦粒的总和呢?
我们来理一下思路。
项目分析:
国际象棋有8行8列共64格,
第1个格子放1粒麦子,第2个格子放2粒麦子,
以后每格都比前面格子数量多一倍,
求麦子总数。
循环之前,我们都应当考虑有什么需要变量?
#定义一个变量total来保存总的麦子数量,初始值为0
total =0
#定义一个变量i,循环1-64,来代表每一个格子
i =1
#假设每个格子中的麦子数量为x,初始也是1
x =1
循环的进入和退出条件。
循环是从第一个格子,循环到第64个格子,因为包含第64个格子本身,所以循环条件肯定是<=64,如果是<64,那循环到第63个格子就结束了:
while i<=64:
循环的判断条件定义好了,现在考虑真正的计算,也就是循环体的部分:
#总数累计上这一个格子的麦粒数
total = total + x
(你也可以写成total += x)
#下一个格子
i = i + 1
(你也可以写成 i += 1 )
#下一个格子的麦粒数是这一个格子的2倍
x = x*2
(你也可以写成 x *= 2 )
最后的结果是什么
#显示结果
print("64个格子,总的麦粒数量为:",total)
全部代码看一遍
执行结果为
达依尔索要的麦粒数目实际上是天文数字,总数将是一个十九位数,折算重量约为2000多亿吨,即使现代,全球小麦的年产量也不过是数亿吨。