跟老齐学Python之用while来循环


Posted in Python onOctober 02, 2014

在python中,它也有这个含义,不过有点区别的是,“当...时候”这个条件成立在一段范围或者时间间隔内,从而在这段时间间隔内让python做好多事情。就好比这样一段情景:

while 年龄大于60岁:-------->当年龄大于60岁的时候
    退休            -------->凡是符合上述条件就执行的动作
展开想象,如果制作一道门,这道门就是用上述的条件调控开关的,假设有很多人经过这个们,报上年龄,只要年龄大于60,就退休(门打开,人可以出去),一个接一个地这样循环下去,突然有一个人年龄是50,那么这个循环在他这里就停止,也就是这时候他不满足条件了。

这就是while循环。写一个严肃点的流程,可以看下图:

跟老齐学Python之用while来循环

再做猜数字游戏

本教程有一讲,是跟看官一同做一个小游戏,在里面做了一个猜数的游戏,当时遇到了一个问题,就是只能猜一两次,如果猜不到,程序就不能继续运行了。

前不久,有一个在校的大学生朋友(他叫李航),给我发邮件,让我看了他做的游戏,能够实现多次猜数,直到猜中为止。这是一个多么喜欢学习的大学生呀。

我在这里将他写的程序恭录于此,单元李航同学不要见怪,如果李航同学认为此举侵犯了自己的知识产权,可以告知我,我马上撤下此代码。

#! /usr/bin/env python

#coding:UTF-8          
import random
i=0

while i < 4:

    print'********************************'

    num = input('请您输入0到9任一个数:')       #李同学用的是python3
    xnum = random.randint(0,9)
    x = 3 - i
    if num == xnum:

        print'运气真好,您猜对了!'

        break

    elif num > xnum:

        print'''您猜大了!\n哈哈,正确答案是:%s\n您还有%s次机会!''' %(xnum,x)

    elif num < xnum:

        print'''您猜小了!\n哈哈,正确答案是:%s\n您还有%s次机会!''' %(xnum,x)

    print'********************************'
    i += 1

我们就用这段程序来分析一下,首先看while i<4,这是程序中为猜测限制了次数,最大是三次,请看官注意,在while的循环体中的最后一句:i +=1,这就是说每次循环到最后,就给i增加1,当bool(i<4)=False的时候,就不再循环了。

当bool(i<4)=True的时候,就执行循环体内的语句。在循环体内,让用户输入一个整数,然后程序随机选择一个整数,最后判断随机生成的数和用户输入的数是否相等,并且用if语句判断三种不同情况。

根据上述代码,看官看看是否可以修改?

为了让用户的体验更爽,不妨把输入的整数范围扩大,在1到100之间吧。

num_input = raw_input("please input one integer that is in 1 to 100:")    #我用的是python2.7,在输入指令上区别于李同学

程序用num_input变量接收了输入的内容。但是,请列位看官一定要注意,看到这里想睡觉的要打起精神了,我要分享一个多年编程经验,请牢记:任何用户输入的内容都是不可靠的。这句话含义深刻,但是,这里不做过多的解释,需要各位在随后的编程生涯中体验了。为此,我们要检验用户输入的是否符合我们的要求,我们要求用户输入的是1到100之间的整数,那么就要做如下检验:

输入的是否是整数
如果是整数,是否在1到100之间。
为此,要做:

if not num_input.isdigit():     #str.isdigit()是用来判断字符串是否纯粹由数字组成

    print "Please input interger."

elif int(num_input)<0 and int(num_input)>=100:

    print "The number should be in 1 to 100."

else:

    pass       #这里用pass,意思是暂时省略,如果满足了前面提出的要求,就该执行此处语句

再看看李航同学的程序,在循环体内产生一个随机的数字,这样用户每次输入,面对的都是一个新的随机数字。这样的猜数字游戏难度太大了。我希望是程序产生一个数字,直到猜中,都是这个数字。所以,要把产生随机数字这个指令移动到循环之前。

import random
number = random.randint(1,100)
while True:             #不限制用户的次数了

    ...

观察李同学的程序,还有一点需要向列位显明的,那就是在条件表达式中,两边最好是同种类型数据,上面的程序中有:num>xnum样式的条件表达式,而一边是程序生成的int类型数据,一边是通过输入函数得到的str类型数据。在某些情况下可以运行,为什么?看官能理解吗?都是数字的时候,是可以的。但是,这样不好。

那么,按照这种思路,把这个猜数字程序重写一下:

#!/usr/bin/env python

#coding:utf-8
import random
number = random.randint(1,100)
guess = 0
while True:
    num_input = raw_input("please input one integer that is in 1 to 100:")

    guess +=1
    if not num_input.isdigit():

        print "Please input interger."

    elif int(num_input)<0 and int(num_input)>=100:

        print "The number should be in 1 to 100."

    else:

        if number==int(num_input):

            print "OK, you are good.It is only %d, then you successed."%guess

            break

        elif number>int(num_input):

            print "your number is more less."

        elif number<int(num_input):

            print "your number is bigger."

        else:

            print "There is something bad, I will not work"

以上供参考,看官还可改进。

break和continue

break,在上面的例子中已经出现了,其含义就是要在这个地方中断循环,跳出循环体。下面这个简要的例子更明显:

#!/usr/bin/env python

#coding:utf-8
a = 8

while a:

    if a%2==0:

        break

    else:

        print "%d is odd number"%a

        a = 0 

print "%d is even number"%a

a=8的时候,执行循环体中的break,跳出玄幻,执行最后的打印语句,得到结果:

8 is even number

如果a=9,则要执行else里面的的print,然后a=0,循环就在执行一次,又break了,得到结果:

9 is odd number

0 is even number

而continue则是要从当前位置(即continue所在的位置)跳到循环体的最后一行的后面(不执行最后一行),对一个循环体来讲,就如同首尾衔接一样,最后一行的后面是哪里呢?当然是开始了。

#!/usr/bin/env python

#coding:utf-8
a = 9

while a:

    if a%2==0:

        a -=1

        continue    #如果是偶数,就返回循环的开始

    else:

        print "%d is odd number"%a #如果是奇数,就打印出来

        a -=1

其实,对于这两东西,我个人在编程中很少用到。我有一个固执的观念,尽量将条件在循环之前做足,不要在循环中跳来跳去,不仅可读性下降,有时候自己也糊涂了。

while...else

这两个的配合有点类似if ... else,只需要一个例子列为就理解了,当然,一遇到else了,就意味着已经不在while循环内了。

#!/usr/bin/env python
count = 0

while count < 5:

    print count, " is  less than 5"

    count = count + 1

else:

    print count, " is not less than 5"

执行结果:

0 is less than 5

1 is less than 5

2 is less than 5

3 is less than 5

4 is less than 5

5 is not less than 5
Python 相关文章推荐
python中的五种异常处理机制介绍
Sep 02 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
3分钟学会一个Python小技巧
Nov 23 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
在Python中append以及extend返回None的例子
Jul 20 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
Python实现分数序列求和
Feb 25 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 Python
跟老齐学Python之复习if语句
Oct 02 #Python
python中pycurl库的用法实例
Sep 30 #Python
python采用getopt解析命令行输入参数实例
Sep 30 #Python
Python实现115网盘自动下载的方法
Sep 30 #Python
python打开网页和暂停实例
Sep 30 #Python
Python解析网页源代码中的115网盘链接实例
Sep 30 #Python
python网络编程之读取网站根目录实例
Sep 30 #Python
You might like
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
详解Django框架中用context来解析模板的方法
2015/07/20 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
读书伴我成长演讲稿
2014/05/07 职场文书
小学运动会班级口号
2014/06/09 职场文书
爱护公物标语
2014/06/24 职场文书
公证委托书格式
2014/09/13 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书