0_Let's_Play_a_Game
在上一篇文章中,我们学习了input
,print
,while
,for
。在这篇文章中,我们将使用已经学到的这些知识,搭配if...else...
来制作一个猜数机器人。效果如下图:
功能如下:
- 在设置的范围内寻找玩家的数字
- 在玩家故意乱按的时候发出友好的问候
1_If_I...
我们首先介绍今天要用到的if...else...
,Python中if语句的一般形式如下所示:
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
。注意:
- 每个条件后面要使用冒号
:
,表示接下来是满足条件后要执行的语句块。 - 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
- 在Python中没有switch – case语句。
下面为示例代码:
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语句的常用判断操作符
操作符 | 描述 |
---|---|
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
== | 等于,比较两个值是否相等 |
!= | 不等于 |
下面的代码演示了判断符号的输出内容:
# 使用数字
print(5 == 6)
# 使用变量
x = 5
y = 8
print(x == y)
>>>False
>>>False
在嵌套 if 语句中,可以把 if...elif...else 结构放在另外一个 if...elif...else 结构中。
if 表达式1:
语句
if 表达式2:
语句
elif 表达式3:
语句
else:
语句
elif 表达式4:
语句
else:
语句
2_Loooooop
在学习了if
判断语句后,我们将它和while循环结合使用。在开始之前,我们先介绍这个小游戏用到的算法——折半查找法。
在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
来自百度百科——折半查找法
下图展示了从1-64中搜索55的实现过程:
在知道思路后我们开始着手代码部分。首先,我们通过上面的动图可以知道,这个查找需要用到循环。我们还是用while来实现。
min = 0
max = 20
while True:
num = int((min+max)/2)
print("这个数是 %d"% num)
以上,我们实现了一半的二分法算法。接下来我们需要完善他,怎么才能让程序知道自己猜没猜对该往哪边二分呢?我们可以看到我们的循环条件使用的是True
,也就是说我们的循环将一直运行,直到出现一个外部中断。
回想上一篇文章,我们知道可以使用break
去跳出循环,那么我们稍加改进,得到:
min = 0
max = 20
while True:
num = int((min+max)/2)
if num == min or num == max:
break
通过这条判断语句,就可以使程序在运行到可二分的最小值时,跳出循环。已经可以把循环停下来了,那怎么判断二分的方向呢?这个要猜的数字是在玩家的脑子里,没法写入到程序用if判断,那么就只有让用户自己按按钮告诉程序,它是猜对了,或者这个数比程序给的数字大或者小。
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="密码上课公布"]
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()
可视化运行:
!!!