用if判断 =============== 小白把它做好的通讯录加上全班的联系方式后兴致勃勃地拿给班上的同学试用,同学只用了两秒钟就吼了起来: “Kao,这是什么啊?满屏幕的联系人你让我怎么找啊?我一看到它眼就花了。” 小白立马傻了,“不会吧?我这么辛辛苦苦写出来的通信录就这么就让人否定了?不过,这样也的确是太难用了,满屏幕的联系人我自己看着都眼花啊。对,应该做出一些改进了。”小白想。“对了,我的程序能不能实现用户自己输入联系人名后判断相关的联系人信息呢?如果用户输入的联系人和我变量中的联系人名匹配的话,就输出联系人信息,不匹配的话直接输出"无此联系人"这样的话,查询用户名不就方便很多了吗?那么,接下来,就是要找一找 Python 中有没有相关的语句了,有的话就方便多了。”小白思索着。“对了,不知道《简明的 Python 》有没有这样的语句呢?有的话就太方便了。”小白决定翻开简明进行查找......很快,他注意到了一个东西:if 语句,在第六章 控制流中。“if ?这不是英语中 如果 的意思吗?”小白想起自己平时大脑判断事物的过程,也基本是用 如果 ....(一个条件) 判断的。“那么这个会不会和我们要的判断语句有关联呢?”小白决定前去看看。 if 语句 ---------------------------------- .. image:: ../_static/snap/ch01-3-jm1.png 小白看了教程中的头一段,马上就被其中的描述吸引住了:“检验一个条件?这好像就是我想要的!如果我让用户输入一个联系人名,然后我拿这个联系人名和我的那些变量进行对比,如果是的话就 print ,如果不是的话就 print "无此联系人" 这不就 Ok 了吗, 哈哈,程序思路就是这样。我真是太聪明了。”小白又在脑中过了一遍思路,并为自己的聪明才智感到无比的震惊。 小白慢慢的翻看了一下《简明的 Python 教程》中的代码:“哇靠,这是什么一堆东西嘛!”小白吼了起来。“不过,想做一个真正的程序员,就要学会读别人的程序啊,我是不会轻易被困难击倒的!”小白决定一句一句按照自己的理解解读一遍这个程序: :: (该代码来自 《简明 Python》第6章 控制流 ) number = 23 guess = int(raw_input('Enter an integer : ')) '''这里应该就是获取用户输入了吧? 记得在第一节中舅舅告诉过我的,这里应该是获取用户输入后复制到 guess 变量, 可是中间的那个 raw_input 为什么要拿 int 括住呢? 还有raw_input 中间的那些 'Enter an integer : ' 又是什么东东呢?这看起来好像是个字符串。 ''' if guess == number: #这里应该就是判断用的语句了吧?意思应该就是如果 guess 变量 = number 变量的话,就执行下面的语句吧? print 'Congratulations, you guessed it.' #这里应该就是如果上面的那个 if 成立的话要执行的语句了 print "(but you do not win any prizes!)" elif guess < number: #elif?这个是什么意思呢?一会在 IDLE 里试一下 print 'No, it is a little higher than that' else: #这个我知道, else 是英文里的 “否则”的意思,这个应该是如果变量 guess 不等于变量 number 的话,就执行下面的语句吧? print 'No, it is a little lower than that' print 'Done' #程序执行完了打印句 Done? 读完程序后,他发现了有下面这几个问题是他看不明白的: 1. elif 是什么? 2. 判断条件的 if 为什么要和下面要执行的语句留出一些 空格 来呢? 3. raw_input 的 前面的 int() 是什么呢?有什么用呢?它为什么要把 raw_input() 括起来呢? 4. raw_input() 的括号里的那句 'Enter an integer : ' 是干什么用的呢? “对,我先运行一次程序,看看输出是什么,然后再把输出对应上上面的代码,不就可以知道代码是什么意思了吗?”小白想,说着就把程序打入 IDLE 中,F5 运行。 :: (小白使用的这段代码摘自 《简明 Python》第6章 控制流 ) Enter an integer : 70 No, it is a little lower than that Done >>> ================================ RESTART ================================ >>> Enter an integer : 10 No, it is a little higher than that Done >>> ================================ RESTART ================================ >>> Enter an integer : 23 Congratulations, you guessed it. (but you do not win any prizes!) Done 小白尝试着运行了一遍程序,果然,他找到了先前一些问题的答案: “原来,elif 是继续判断的意思啊,他应该是判断条件不符合 if 语句中的条件之后,就会实行的第二个判断。我刚刚输入了大于 number 变量的数之后,就执行了 elif 中的语句,如果程序判断输入的东西都不符合两个条件的话,就执行 else,而那一句:'Enter an integer : ' 则是一句提示。 ”小白为自己的聪明才智感到非常的兴奋。“可是,为什么判断条件的 if 为什么要和下面要执行的语句留出一些 空格 来呢?这个问题我还没有解决。咦?以前舅舅好像给我说过有一个叫 缩进 的问题,说我以后会用到的。缩进不就是一个一个空格吗?对,我想起来了,舅舅说空格是用来区分一块和另一块的语句块的。看起来好像与现在的情况相同。可是,我还没用过缩进啊,如果把那些空格去掉会怎么样呢?”小白突然突发奇想,想要试一试。 缩进: ---------------------------------- :: (小白使用的这段代码摘自 《简明 Python》第6章 控制流 ) number = 23 guess = int(raw_input('Enter an integer : ')) if guess == number: print 'Congratulations, you guessed it.' print "(but you do not win any prizes!)" elif guess < number: print 'No, it is a little higher than that' else: print 'No, it is a little lower than that' print 'Done' 小白把空格都去掉后,尝试了运行: .. image:: ../_static/snap/ch01-3-block.png “果然出错了。看来没有缩进是不行的。我明白了,就像前面舅舅说的那样:程序为了区分开来哪块搭哪块,所以一定要用到缩进!。这下这个 缩进 算是完全理解了。”小白兴奋道。 “可是,还有一个问题没解决呢,那个 int() 到底是干什么用的呢?”小白决定亲自到 IDLE 中试一试: int()? str()? : ---------------------------------- 小白在 IDLE 中进行了 int 的尝试。 :: >>> a=raw_input("hello:") hello:你好 >>> print a 你好 >>> b=int(a) Traceback (most recent call last): File "", line 1, in b=int(a) ValueError: invalid literal for int() with base 10: '\xc4\xe3\xba\xc3' >>> a=raw_input("hello:") hello:2 >>> print a 2 >>> b=int(a) >>> print b 2 >>> “咦?为什么输入 你好 的时候就出错了,输入数字 2 的时候就没有问题呢?小白觉得很奇怪,对,前面在变量一节曾经不是也探究过 int 和 str 的问题吗?当时我记得 int 是代表数字类型的,str 则是代表字符串类型的,现在这个难道和当时那个有关联?int(raw_input(...)) 看字面意思应该是把 raw_input()返回来的东西转换为 int 值吧?”小白决定验证下自己有没有猜错。 :: >>> a=raw_input("Input Number>") Input Number>1 >>> b=a+1 Traceback (most recent call last): File "", line 1, in b=a+1 TypeError: cannot concatenate 'str' and 'int' objects >>> c=int(a) >>> b=c+1 >>> print c 1 >>> print b 2 >>> “哈哈,果然是这样,成了!!”小白非常兴奋,“咦?既然 int() 可以把 str 转换为 int ,那么,对应的,就应该有 str() 这个东西,能把 int 转换为 str 的吧?”小白马上动起手来。 :: >>> a=2 >>> b="你" >>> c=b+str(a) >>> print c 你2 >>> “哈,成了!成功探索出 str ,int 互相转换的用法!”小白非常兴奋。他终于成功依靠自己的力量探索出了第一个 Python 用法!小白想:“对,用现在知道的知识就已经可以实现一个可以输入联系人的通信录吧!”。小白马上动手: :: _Name = raw_input("输入联系人名:") if _Name == "张三": print "电话:123456" elif _Name == "李四": print "电话:543210" else: print "无此联系人。" 运行一遍,看有没有错误: :: 输入联系人名:张三 电话:123456 >>> ================================ RESTART ================================ >>> 输入联系人名:李四 电话:543210 >>> ================================ RESTART ================================ >>> 输入联系人名:李三 无此联系人。 >>> “成功了。”小白异常兴奋,他一遍有一遍的调试着它的程序。很快,他发现使用他的通信录将会是个麻烦事,每次运行完一次通信录之后,程序都会自动退出,结果下次要使用的时候又要重新打开,这样的话如果是要想进行连续的查询时将会变得非常麻烦。小白想:“有没有一种什么东西能够重复执行某一段代码呢?如果我的这段代码能被重复执行的话,那么,就可以免除每次重复打开程序时候的痛苦了”小白决定到网上看看有没有可以重复执行某段语句的东东,小白打开 Google ,“输入:Python 重复执行”进行查找。突然,小白的眼球被搜索结果的第二项拉直了: .. image:: ../_static/snap/ch01-3-search1.png “什么?我要的东西就在简明里?”小白迅速翻开简明。 while 语句: ---------------------------------- “Kao,原来自己要找的东西就在 if 语句的下一节啊!”小白哀叫。 .. image:: ../_static/snap/ch01-3-while.png “"只要在一个条件为真的情况下, while 语句允许你重复执行一块语句。 while 语句是所谓 循环 语句的一个例子?"这是什么意思呢?我可不太理解啊,怎么个条件为真就循环呢?好,俺就先带着疑问读一遍这个实例吧,说不定读一遍实例后就能从实例中找到答案。” :: (小白解读的代码来自 《简明 Python》第6章 控制流 ) number = 23 running = True #在一个条件为真的情况下?这个 变量 应该就是设定条件的真假了吧 while running: #对呐,这个变量隐含了一个 True 的条件 guess = int(raw_input('Enter an integer : ')) #这里开始应该就是语句块的重复执行了吧? if guess == number: print 'Congratulations, you guessed it.' running = False #当 guess 变量等于 number 时,设定条件为假 elif guess < number: print 'No, it is a little higher than that' else: print 'No, it is a little lower than that' else: print 'The while loop is over.' # Do anything else you want to do here print 'Done' 小白对程序进行了一遍解读。“但是,True 和 False 条件在 While 语句中有什么用呢?难道真的是像简明中说得一样:"只要在一个条件为真的情况下,while语句允许你重复执行一块语句"?这我还是不太懂啊!还是在 IDLE 中试试运行看看结果如何,看着结果有时就能看出来代码是干什么用的了。”小白无比自信地打开了 IDLE。 :: Enter an integer : 32 No, it is a little lower than that Enter an integer : 32 No, it is a little lower than that Enter an integer : 55 No, it is a little lower than that Enter an integer : 23 Congratulations, you guessed it. The while loop is over. Done “哦,我明白了,果然和简明中说得是一样的,当 running 变量为 True 时,就会一直循环下去,而当程序达到条件:guess == number 时,设定 running 值 running = False,while 循环就会中断执行”小白摇头晃脑道“看来我的 IQ 还是很高的。“那么,咱就把这个 while语句 融入到我的通讯录程序中,让它拥有循环执行这一功能吧!”小白又动起手来。 :: run = True while run: _Name = raw_input("输入联系人名:") if _Name == "张三": print "电话:123456" elif _Name == "李四": print "电话:543210" elif _Name == "退出": print "Bey Bey" run = False else: print "无此联系人,请重新输入。" “好,程序做好了,运行一遍试试!” :: >>> 输入联系人名:张三 电话:123456 输入联系人名:李四 电话:543210 输入联系人名:张四 无此联系人,请重新输入。 输入联系人名:退出 Bey Bey >>> “哈哈,太棒了,我的程序已经拥有了循环查询功能了,我还给它加上了退出功能。”小白兴奋道。“可是?如果要实现多个联系人判断的话,就得这么一个一个的打 if... elif... 。这未免也太麻烦了吧?有没有一种新的办法可以使程序更简便呢?”小白又面临着一个新的挑战。 (第三节完)