Loading... ## 0_Let's_Play_a_Game 在上一篇文章中,我们学习了`input`,`print`,`while`,`for`。在这篇文章中,我们将使用已经学到的这些知识,搭配`if...else...`来制作一个猜数机器人。效果如下图:  功能如下: 1. 在设置的范围内寻找玩家的数字 2. 在玩家故意乱按的时候发出友好的问候 ## 1_If_I... 我们首先介绍今天要用到的`if...else...`,Python中if语句的一般形式如下所示: ```python if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 ``` - 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句 - 如果 "condition_1" 为False,将判断 "condition_2" - 如果"condition_2" 为 True 将执行 "statement_block_2" 块语句 - 如果 "condition_2" 为False,将执行"statement_block_3"块语句  Python 中用 `elif` 代替了 `else if`,所以if语句的关键字为:`if – elif – else`。注意: 1. 每个条件后面要使用冒号 `:`,表示接下来是满足条件后要执行的语句块。 2. 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。 3. 在Python中没有switch – case语句。  下面为示例代码: ```python var1 = 100 if var1: print ("1 - if 表达式条件为 true") print (var1) var2 = 0 if var2: print ("2 - if 表达式条件为 true") print (var2) print ("Good bye!") >>>1 - if 表达式条件为 true >>>100 >>>Good bye! ``` 下面列出if语句的常用判断操作符 | 操作符 | 描述 | | ------ | ------------------------ | | < | 小于 | | <= | 小于或等于 | | > | 大于 | | >= | 大于或等于 | | == | 等于,比较两个值是否相等 | | != | 不等于 | 下面的代码演示了判断符号的输出内容: ```python # 使用数字 print(5 == 6) # 使用变量 x = 5 y = 8 print(x == y) >>>False >>>False ``` 在嵌套 if 语句中,可以把 if...elif...else 结构放在另外一个 if...elif...else 结构中。 ```python if 表达式1: 语句 if 表达式2: 语句 elif 表达式3: 语句 else: 语句 elif 表达式4: 语句 else: 语句 ``` ## 2_Loooooop 在学习了`if`判断语句后,我们将它和while循环结合使用。在开始之前,我们先介绍这个小游戏用到的算法——**折半查找法**。 > 在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。<br>搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。<br>来自百度百科——[折半查找法](https://baike.baidu.com/item/%E6%8A%98%E5%8D%8A%E6%9F%A5%E6%89%BE%E6%B3%95/5413383?fr=aladdin) > 下图展示了从1-64中搜索55的实现过程: >  在知道思路后我们开始着手代码部分。首先,我们通过上面的动图可以知道,这个查找需要用到循环。我们还是用while来实现。 ```python min = 0 max = 20 while True: num = int((min+max)/2) print("这个数是 %d"% num) ``` 以上,我们实现了一半的二分法算法。接下来我们需要完善他,怎么才能让程序知道自己猜没猜对该往哪边二分呢?我们可以看到我们的循环条件使用的是`True`,也就是说我们的循环将一直运行,直到出现一个外部中断。 回想上一篇文章,我们知道可以使用`break`去跳出循环,那么我们稍加改进,得到: ```python min = 0 max = 20 while True: num = int((min+max)/2) if num == min or num == max: break ``` 通过这条判断语句,就可以使程序在运行到可二分的最小值时,跳出循环。已经可以把循环停下来了,那怎么判断二分的方向呢?这个要猜的数字是在玩家的脑子里,没法写入到程序用if判断,那么就只有让用户自己按按钮告诉程序,它是猜对了,或者这个数比程序给的数字大或者小。 ```python min = 0 max = 20 while True: num = int((min+max)/2) if num == min or num == max: break print("你想的是%d么?"% num) flag = int(input("是按1,大于它按2,小于它按3:")) if flag == 1: print("猜对了,我真弔!") break elif flag == 2: min = num elif flag == 3: max = num ``` 我们在这里用到了一个 `flag`,我们用它作为一个判断的依据,当flag等于不同的值,程序作出不同的响应。当输入2,玩家的数字比程序给的数字大,那么就把程序的最小值赋值为当前值,然后再次二分;输入3的情况同理。 最后稍作优化得到我们的成品代码: [ppblock ex="密码上课公布"] ```python def guess(): print("请想一个0-20之间(不含0,20)的整数...") k = input("按回车以继续...") min = 0 max = 20 while True: num = int((min+max)/2) if num == min or num == max: print("你猜你马呢") break print("你想的是%d么?"% num) flag = int(input("是按1,大于它按2,小于它按3:")) if flag == 1: print("猜对了,我真弔!") break elif flag == 2: min = num elif flag == 3: max = num if __name__ == "__main__": guess() ``` 可视化运行: !!! <a href="http://www.pythontutor.com/visualize.html#code=def%20guess%28%29%3A%0A%20%20%20%20print%28%22%E8%AF%B7%E6%83%B3%E4%B8%80%E4%B8%AA0-20%E4%B9%8B%E9%97%B4%EF%BC%88%E4%B8%8D%E5%90%AB0,20%EF%BC%89%E7%9A%84%E6%95%B4%E6%95%B0...%22%29%0A%20%20%20%20k%20%3D%20input%28%22%E6%8C%89%E5%9B%9E%E8%BD%A6%E4%BB%A5%E7%BB%A7%E7%BB%AD...%22%29%0A%20%20%20%20min%20%3D%200%0A%20%20%20%20max%20%3D%2020%0A%20%20%20%20while%20True%3A%0A%20%20%20%20%20%20%20%20num%20%3D%20int%28%28min%2Bmax%29/2%29%0A%20%20%20%20%20%20%20%20if%20num%20%20%3D%3D%20min%20or%20num%20%3D%3D%20max%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22%E4%BD%A0%E7%8C%9C%E4%BD%A0%E9%A9%AC%E5%91%A2%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20print%28%22%E4%BD%A0%E6%83%B3%E7%9A%84%E6%98%AF%25d%E4%B9%88%EF%BC%9F%22%25%20num%29%0A%20%20%20%20%20%20%20%20flag%20%3D%20int%28input%28%22%E6%98%AF%E6%8C%891%EF%BC%8C%E5%A4%A7%E4%BA%8E%E5%AE%83%E6%8C%892%EF%BC%8C%E5%B0%8F%E4%BA%8E%E5%AE%83%E6%8C%893%EF%BC%9A%22%29%29%0A%20%20%20%20%20%20%20%20if%20flag%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22%E7%8C%9C%E5%AF%B9%E4%BA%86%EF%BC%8C%E6%88%91%E7%9C%9F%E5%BC%94%EF%BC%81%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20elif%20flag%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20min%20%3D%20num%0A%20%20%20%20%20%20%20%20elif%20flag%20%3D%3D%203%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20max%20%3D%20num%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20guess%28%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" target="_blank" rel="nofollow noopener noreferrer"> <button class="btn-download" type="button">Python Tutor</button></a> !!! <hr> !!! <span> <p><h3>源代码下载</h3> <a href="https://pan.mrdeng.cn/TB/Python/SourceCode/3_Teller_Machine.rar" target="_blank" rel="nofollow noopener noreferrer"> <button class="btn-download" type="button">鄧先森网盘</button></a> </p> </span> !!! [/ppblock] 最后修改:2024 年 09 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏