Crossin的编程教室

标题: 【Python 第8课】while [打印本页]

作者: iamocean    时间: 2013-7-30 21:40
标题: 【Python 第8课】while
先介绍一个新东西:注释。
python里,以“#”开头的文字都不会被认为是可执行的代码。
 print “hello world”

 print "hello world" #输出一行字
是同样的效果。但后者可以帮助开发者更好地理解代码。

在接下来的课程中,我会经常用注释来解释代码。


用if改进完我们的小游戏后,功能已经基本实现了。很多同学做完后纷纷表示,每次只能猜一次,完了之后又得重新run,感觉好麻烦。能不能有办法让玩家一直猜,直到猜中为止?答案很显然,如果这种小问题都解决不了,那python可就弱爆了。


最简单的解决方法就是while。


同if一样,while也是一种控制流语句,另外它也被称作循环语句。继续来看渣画质手绘流程图:

814a5809c93d70cfcf3611b1f9dcd100bba12b37.jpg




程序执行到while处,“当”条件为True时,就去执行while内部的代码,“当”条件为False时,就跳过。

语法为:

while 条件:
 循环执行的语句


同if一样,注意冒号,注意缩进。


今天的栗子:
  1. a = 1 #先a设为1
  2. while a != 0: #a不等于0就一直做
  3.  print "please input"
  4.  a = input()
  5. print "over"
复制代码
想想怎么用while改进小游戏?有多种写法,大家自己思考下,我不多做说明了。下图给出一种方法。


8df996773912b31b8e8576958718367adbb4e112.jpg


注意,这里出现了两层缩进,要保持每层缩进的空格数相同。


到此为止,小游戏已经基本成型了。不过好像还差一点:每次自己都知道答案,这玩起来有神马意思。
明天来讲,怎么让你不知道电脑的答案。


#==== Crossin的编程教室 ====#
微信ID:crossincode
qq群:312723402


面向零基础初学者的编程课
每天5分钟,轻松学编程

f68e6e3d269759eee7be4973b3fb43166c22df15.jpg

作者: 取个名字真难    时间: 2013-9-29 21:37
关于最后的小游戏,我用的是第七课的办法,结果是刷屏输出判断结果:
num = 10
   print 'Guess what I think?'
   answer = input()
   while answer != num:
       print 'False!'
   if answer == num:
       print 'True!'
为什么呢????
作者: Janie    时间: 2013-11-5 17:04
做出来无论输入什么数字,都print ‘too big’
作者: crossin先生    时间: 2013-11-8 13:13
Janie 发表于 2013-11-5 17:04
做出来无论输入什么数字,都print ‘too big’

你是不是python3
或者用了raw_input
作者: Janie    时间: 2013-11-14 10:13
crossin先生 发表于 2013-11-8 13:13
你是不是python3
或者用了raw_input

嗯,用了raw_input,其实后来发现了~~呵呵。话说中间怎么有一部分课都没有的。。
作者: crossin先生    时间: 2013-11-17 22:53
Janie 发表于 2013-11-14 10:13
嗯,用了raw_input,其实后来发现了~~呵呵。话说中间怎么有一部分课都没有的。。 ...

因为论坛是后来搭建的,中间的课程一直没补上,我实在太懒了。。。
去下载置顶帖里的doc版本吧,然后有问题直接发帖就好了
作者: bright314    时间: 2014-3-3 20:52
是不是让 while 里面有恒成立的等式就能产生一个无限循环了?像酱紫的

03.png (31.43 KB, 下载次数: 887)

03.png


作者: bright314    时间: 2014-3-3 20:53
另外为什么我的中文输入会是繁体字啊
作者: crossin先生    时间: 2014-3-4 11:07
bright314 发表于 2014-3-3 20:52
是不是让 while 里面有恒成立的等式就能产生一个无限循环了?像酱紫的

是的。
繁体的问题,不知道。。。不是你输入法的问题?
作者: 珍妮晚上好    时间: 2014-4-2 10:13
帖子最后一张图片的最后一行,bingo=True我试了下,不写也没啥问题吧
作者: crossin先生    时间: 2014-4-2 11:22
珍妮晚上好 发表于 2014-4-2 10:13
帖子最后一张图片的最后一行,bingo=True我试了下,不写也没啥问题吧

不写程序就会一直运行下去
作者: war3mjq    时间: 2014-4-9 11:39
取个名字真难 发表于 2013-9-29 21:37
关于最后的小游戏,我用的是第七课的办法,结果是刷屏输出判断结果:
num = 10
   print 'Guess what I th ...

你的下面这段程序错了,是一个无限循环。你没有赋予循环在什么条件下结束
while answer !=num:    #answer不等于num 就执行下去。
    print 'False!'              #输出 ‘False’

作者: 化成    时间: 2014-6-15 22:27
为什么要令bingo=False?
另外设while循环时令bingo==False是什么意思呢?
作者: 化成    时间: 2014-6-16 10:39
bingo=False
while bingo==False:
这两行代码怎么理解啊?
作者: crossin先生    时间: 2014-6-16 13:46
化成 发表于 2014-6-16 10:39
bingo=False
while bingo==False:
这两行代码怎么理解啊?

第一句是让bingo的值为False
第二句是判断bingo的值是不是等于False,如果等于,那么就进入循环,否则就跳出循环
作者: 化成    时间: 2014-6-19 19:44
谢谢crossin!开始的时候没有理解,现在看明白了。当程序的最后一句bingo=True成立时while就跳出循环了,从而不会再提示你输入数据。如果没有这最后一句,它就会一直等待你输入数据。
作者: 萧风    时间: 2014-6-29 23:04
  1. num=10
  2. while True:
  3.     print "Guess what I think?"
  4.     answer=input()

  5.     if answer<num:
  6.         print"too small!"


  7.     if answer>num:
  8.         print"too big!"

  9.     if answer==num:
  10.         print"excellent,you are right!"

复制代码

作者: QQ_5C45F7    时间: 2014-8-10 13:29
  1. a=123  #先设A=123
  2. print"猜大小" #输出猜大小这几个字
  3. b=True  #设b为真

  4. while b==True:   #while条件,当B为真时,执行while内部的代码
  5.     c=input()  #把输入的值赋予变量C(这是循环执行的语句)

  6.     if c<a:   #如果c<a
  7.         print"小了"#显示小了

  8.     if c>a:  #如果c>a
  9.         print'大了'# 显示大了

  10.     if c==a:#如果c=a
  11.         print'正好合适'#显示正好合适

  12.         b=False
复制代码
其他代码都能看明白,就是如果我输入了正确的答案,比如我输入了123,程序是怎么判断直接执行最后一句了呢,为什么我输入不正确的答案,程序就会让你继续输入呢?
作者: QQ_5C45F7    时间: 2014-8-10 13:39
QQ_5C45F7 发表于 2014-8-10 13:29
其他代码都能看明白,就是如果我输入了正确的答案,比如我输入了123,程序是怎么判断直接执行最后一句了呢 ...

明白了明白了,不用回复了
作者: shixinglong    时间: 2014-10-14 10:40
crossin先生 发表于 2014-3-4 11:07
是的。
繁体的问题,不知道。。。不是你输入法的问题?

是不是WHILE语句里一定要有恒等式,变量不行?
比如,我刚开始就想当然的写:
N=input()
while N != 10:
     if N>10:
        print "BIG"
    if N<10:
        print "SMALL"
print "YES"
结果输入小于10的数字,就不停的刷SMALL,大于10的就不停刷BIG,只有输入10才出现一个YES。而且只能执行一次,如果可以的话,先生可否详述WHILE语句的执行原理?谢谢您。
作者: crossin先生    时间: 2014-10-14 11:12
shixinglong 发表于 2014-10-14 10:40
是不是WHILE语句里一定要有恒等式,变量不行?
比如,我刚开始就想当然的写:
N=input()

你的input是在while外面的,while里面没有重新改变n的地方,它自然是一直不停刷下去
作者: shixinglong    时间: 2014-10-14 11:52
crossin先生 发表于 2014-10-14 11:12
你的input是在while外面的,while里面没有重新改变n的地方,它自然是一直不停刷下去 ...

明白了,谢谢。
作者: kelvin    时间: 2015-4-13 13:16
crossin先生你好,最后一行 bingo=True报错,怎么回事啊?
情况如图。

捕获.PNG (40.28 KB, 下载次数: 612)

捕获.PNG


作者: crossin先生    时间: 2015-4-13 19:38
kelvin 发表于 2015-4-13 13:16
crossin先生你好,最后一行 bingo=True报错,怎么回事啊?
情况如图。

缩进没对齐
作者: kelvin    时间: 2015-4-13 22:33
crossin先生 发表于 2015-4-13 19:38
缩进没对齐

thanks!
作者: cross    时间: 2015-4-20 21:28
手绘流程图一点都不渣啊
作者: Hanami    时间: 2015-8-13 21:27
先生问一下,bingo=True,这一行有什么作用呢
num = 18
print'Guess what i think'
a=False

while a==False:
    answer=input()

    if answer<num:
        print'too small!'

    if answer>num:
        print'too big!'

    if answer==num:
        print'you re right!'

我这样写,运行后,感觉和加没加那一行代码没什么区别

作者: crossin先生    时间: 2015-8-16 15:44
Hanami 发表于 2015-8-13 21:27
先生问一下,bingo=True,这一行有什么作用呢
num = 18
print'Guess what i think'

你这个程序没法结束
作者: xueshan123    时间: 2015-10-13 20:10
while内套语句必须带有让while停止运行的语句
      
作者: catherinemic    时间: 2015-12-19 00:07
好棒!

Python5.png (3.94 KB, 下载次数: 611)

Python5.png


作者: suanshine    时间: 2016-3-14 10:00
我想请问一下,我用的是3.5,然后我这样输入
num = 10
print("Guess what I think?")
answer = input()

if answer < num:
    print('too small!')

if answer > num:
    print('too big!')

if answer == num:
    print ('BINGO!')
得到的结果是    if answer < num:
TypeError: unorderable types: str() < int()为什么啊?
C:\Users\sunshine\Desktop
作者: crossin先生    时间: 2016-3-14 12:41
suanshine 发表于 2016-3-14 10:00
我想请问一下,我用的是3.5,然后我这样输入
num = 10
print("Guess what I think?")

python3 的input获得的是一个字符串,相当于2的raw_input
所以跟数字比较前要做转换
比如写成
answer=int(input())
作者: 德坤    时间: 2016-3-22 09:50
为什么我输入一个值  么就无限刷屏输出  too big
作者: andyflash    时间: 2016-4-5 11:16
请教老师:我按照您的源码编写,运行时显示:

Traceback (most recent call last):
  File "D:/Program Files/mn", line 4, in <module>
    bingo = false
NameError: name 'false' is not defined

请问是怎么回事?谢谢


作者: andyflash    时间: 2016-4-5 11:18
QQ截图20160405111752.jpg

这是截图。
作者: crossin先生    时间: 2016-4-5 20:11
andyflash 发表于 2016-4-5 11:18
这是截图。

False,True 都要首字母大写

另外,你文件保存的时候没有用.py 结尾,所以没有高亮提示了
作者: crossin先生    时间: 2016-4-5 20:11
德坤 发表于 2016-3-22 09:50
为什么我输入一个值  么就无限刷屏输出  too big

无限输出,应该是你循环中没有input
作者: andyflash    时间: 2016-4-6 08:37
crossin先生 发表于 2016-4-5 20:11
False,True 都要首字母大写

另外,你文件保存的时候没有用.py 结尾,所以没有高亮提示了 ...

非常谢谢老师
作者: 追风    时间: 2016-4-29 09:19
取个名字真难 发表于 2013-9-29 21:37
关于最后的小游戏,我用的是第七课的办法,结果是刷屏输出判断结果:
num = 10
   print 'Guess what I th ...

对于这位同学的问题,我是这么想的:
       在这里,把 while 当成了 if  ,理解为   只是单纯的英文“当……时”的文字意思。没有搞清楚 while  作为程序语言的用法。课程讲的很清楚,while 是一个循环语句,有自己应该遵循的语法。
作者: 追风    时间: 2016-4-29 09:26
本帖最后由 追风 于 2016-4-29 09:57 编辑
珍妮晚上好 发表于 2014-4-2 10:13
帖子最后一张图片的最后一行,bingo=True我试了下,不写也没啥问题吧

如果没有这条语句就成了死循环,死循环在程序中是不被允许的。
作者: 追风    时间: 2016-4-29 09:35
萧风 发表于 2014-6-29 23:04

这样的话就是个死循环了,应该将while的判断条件修改一下。
作者: 追风    时间: 2016-4-29 09:43
shixinglong 发表于 2014-10-14 10:40
是不是WHILE语句里一定要有恒等式,变量不行?
比如,我刚开始就想当然的写:
N=input()

这个我思考过,N=input()应该是要放到 while 循环体里面的,这样的话,才能实现不断地输入。而把N=input()
放到while循环外面,意思是,我给你一个值,你去判断并且循环吧,这样当然不对啦。
作者: 追风    时间: 2016-4-29 09:46
kelvin 发表于 2015-4-13 13:16
crossin先生你好,最后一行 bingo=True报错,怎么回事啊?
情况如图。

其实上面已经说的很清楚,IndentationError是缩进错误的意思

作者: 追风    时间: 2016-4-29 10:03
crossin先生 发表于 2016-3-14 12:41
python3 的input获得的是一个字符串,相当于2的raw_input
所以跟数字比较前要做转换
比如写成

我觉得看懂错误提示很重要,尤其是我们这样的新手,看懂错误提示就可以自己找出错误了
作者: 追风    时间: 2016-4-29 10:05
德坤 发表于 2016-3-22 09:50
为什么我输入一个值  么就无限刷屏输出  too big

你是不是把 answer=input()放到while外面了?
作者: 追风    时间: 2016-4-29 10:19
andyflash 发表于 2016-4-5 11:16
请教老师:我按照您的源码编写,运行时显示:

Traceback (most recent call last):

我也是新手,有一个很好的建议分享给你,不知道你有没有注意到   错误提示。比如你的这个NameError: name 'false' is not defined
意思是:        命名错误:false没有被定义。没有被定义说的都是变量,那么,false就是被当作变量了,为什么会当作变量呢?到目前为止,我只发现了两点,字符串没有加引号,和像你这种书写错误
作者: crossin先生    时间: 2016-4-29 10:50
追风 发表于 2016-4-29 10:19
我也是新手,有一个很好的建议分享给你,不知道你有没有注意到   错误提示。比如你的这个NameError: name ...

说的挺对。我之前也在文章里写过,一定要试着去读报错信息,看多了就熟悉了
作者: mercury_wyh    时间: 2016-6-3 21:29
请问False和True在这个语句中起到的作用就是做一个已经defined的变量码?所以把False和True互换也是可以的吗?我试过,程序还是和可以运行的。不知道对不对呢。
作者: crossin先生    时间: 2016-6-4 22:35
mercury_wyh 发表于 2016-6-3 21:29
请问False和True在这个语句中起到的作用就是做一个已经defined的变量码?所以把False和True互换也是可以的 ...

False和True可以理解为就是0和1,不过严格来说他们是值不是变量。具体看bool类型里面提到的。这个程序里完全互换是可行的,就相当于你把一个开关反过来接
作者: liudaguo520    时间: 2016-7-19 11:08
老师您好,今天的这个例子我有点蒙圈!条件设为a=1了,为什么判断是等于0的时候才over!我不知道我这样说您是否能理解我的意思!
a = 1 #先a设为1
while a != 0: #a不等于0就一直做
 print "please input"
 a = input()
print "over"

作者: liudaguo520    时间: 2016-7-19 11:09
liudaguo520 发表于 2016-7-19 11:08
老师您好,今天的这个例子我有点蒙圈!条件设为a=1了,为什么判断是等于0的时候才over!我不知道我这样说您 ...

我试了一下while a==1:   输入什么都返回over
我也试了 while a != 1:    执行代码直接返回over
作者: crossin先生    时间: 2016-7-20 12:53
liudaguo520 发表于 2016-7-19 11:09
我试了一下while a==1:   输入什么都返回over
我也试了 while a != 1:    执行代码直接返回over ...

你把a的值写下来,自己在纸上每执行一步,看看那个判断条件该怎么执行,或者去这里:
http://pythontutor.com/visualize.html
看看代码执行的过程。

一开始a是1只是随便给一个非0的值,保证while可以执行。然后当有人输入0的时候,就结束。

“不等于0就进入while循环”和“等于0的时候才over”,不是一个意思吗
你把逻辑再理一理
作者: liudaguo520    时间: 2016-7-23 09:10
crossin先生 发表于 2016-7-20 12:53
你把a的值写下来,自己在纸上每执行一步,看看那个判断条件该怎么执行,或者去这里:
http://pythontutor ...

谢谢Crossin先生,我懂了!
作者: 十三才    时间: 2016-8-28 10:21
明白了,其实最后Bingo等于什么都行,只要使while的判断不成立就能跳出循环了。
作者: crossin先生    时间: 2016-8-28 15:46
十三才 发表于 2016-8-28 10:21
明白了,其实最后Bingo等于什么都行,只要使while的判断不成立就能跳出循环了。 ...


作者: 枫叶落时    时间: 2017-8-9 01:09
请问,开头bingo =False和最后的bingo = True 为什么不冲突?。
然后为什么中间需要两层缩进?小白求解。。
作者: woodumpling    时间: 2017-8-9 09:01
枫叶落时 发表于 2017-8-9 01:09
请问,开头bingo =False和最后的bingo = True 为什么不冲突?。
然后为什么中间需要两层缩进?小白求解。。 ...

最后bingo = True是为了结束循环,就是指直到猜中为止,才能终止循环。
两层缩进是因为第一层是while,第二层是条件判断。
作者: 枫叶落时    时间: 2017-8-9 12:04
woodumpling 发表于 2017-8-9 09:01
最后bingo = True是为了结束循环,就是指直到猜中为止,才能终止循环。
两层缩进是因为第一层是while,第 ...

好的,谢谢,那请问下,其中空出两行是为了什么?
作者: crossin先生    时间: 2017-8-9 22:38
枫叶落时 发表于 2017-8-9 12:04
好的,谢谢,那请问下,其中空出两行是为了什么?

空行没影响
作者: 枫叶落时    时间: 2017-8-9 23:26
噢噢,那空行只是为了方便看是吗?
作者: crossin先生    时间: 2017-8-10 11:54
枫叶落时 发表于 2017-8-9 23:26
噢噢,那空行只是为了方便看是吗?

是的
作者: 枫叶落时    时间: 2017-8-10 20:18
好的谢谢
作者: 渭城朝雨    时间: 2017-8-11 19:12
a = 1 #先a设为1
while a != 0: #a不等于0就一直做
 print "please input"
 a = input()
print "over"

请问使用while的时候为什么要a=1呢,它的意义和涵义是什么?(因为试过删掉第一排就显示错误了)
作者: 枫叶落时    时间: 2017-8-11 23:47
先生,可能是我能力有限,我想不到别的办法写出另一种办法。如果不用后面学的知识,只靠前面学的这些知识,感觉很难做不到不同。自己也试着写了,但是最后改了之后得到的,都和先生写的差不多。请问先生有别的吗?
作者: crossin先生    时间: 2017-8-11 23:50
渭城朝雨 发表于 2017-8-11 19:12
a = 1 #先a设为1
while a != 0: #a不等于0就一直做
 print "please input"

看你的while条件,必须得给个不等于0的值才能执行
作者: crossin先生    时间: 2017-8-11 23:52
枫叶落时 发表于 2017-8-11 23:47
先生,可能是我能力有限,我想不到别的办法写出另一种办法。如果不用后面学的知识,只靠前面学的这些知识, ...

while answer != num
作者: 枫叶落时    时间: 2017-8-12 00:20
num = 10
print "Guess what I think?"
bingo = False
a = 0


while a != num:
    a = input()


    if a < num:
        print " too small!"


    if a > num:
        print " too big!"


    if a == num:
        print "good!"
        bingo = True
        
        成功了,谢谢先生。不过还是觉得很类似先生给的例子。
作者: ghaof    时间: 2018-10-12 08:41
本帖最后由 ghaof 于 2018-10-12 09:10 编辑

D:\捕获.JPG

请问“crossin先生”:
第一个问题:为何输入“0”,不能结束(显示“over”)

捕获.JPG (40.48 KB, 下载次数: 534)

捕获.JPG


作者: ghaof    时间: 2018-10-12 09:13
本帖最后由 ghaof 于 2018-10-12 09:14 编辑

请问“crossin先生”:
第二个问题:为何TypeError: '<' not supported between instances of 'str' and 'int'

捕获.JPG (60.1 KB, 下载次数: 565)

捕获.JPG


作者: crossin先生    时间: 2018-10-12 10:15
ghaof 发表于 2018-10-12 09:13
请问“crossin先生”:
第二个问题:为何TypeError: '

input拿到的是字符串,要改成 int(input()) 转换下
作者: 土拨鼠    时间: 2018-10-17 16:03
a=18
print "猜猜我想的多少"
shuru=int(input())
while shuru<a:
    print "small"
    shuru=int(input())
while shuru>a:
    print "big"
    shuru = int(input())
if shuru==a:
    print "ok"
老师 我这个写法 和你的例子比起来有什么不足的
作者: ZZZZZ    时间: 2021-4-27 17:54
取个名字真难 发表于 2013-9-29 21:37
关于最后的小游戏,我用的是第七课的办法,结果是刷屏输出判断结果:
num = 10
   print 'Guess what I th ...

因为answer = input()只出现了一次,
所以输入数字后,while循环条件始终成立,
就会一直输出。

作者: ZZZZZ    时间: 2021-5-3 19:22
这样也可以:
  1. ......
  2. while True:
  3. ......
  4.     if answer == num:
  5.         print ‘BINGO’
  6.         break
复制代码





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5