课时4:改进我们的小游戏
目录:
一、改进我们的小游戏
二、条件分支
三、while循环
四、引入外援
五、课时04课后习题及答案
**************************
一、改进我们的小游戏
**************************
很多鱼油对改善这个游戏提出了建议,小甲鱼做了一下总结,大概有以下几个方面需要改进:
>猜错的时候程序应该给点提示,例如告诉用户输入的值是大了还是小了。
>每运行一次程序只能猜一次,应该提供多次机会给用户猜测。
>每次运行程序,答案可以是随机的。因为程序答案固定,容易导致答案外泄。
****************
二、条件分支
****************
第一个改进要求:猜错的时候程序提示用户当前的输入比答案大了还是小了。
例如:
1 >>> 1<3 2 True 3 >>> 1 < 3 4 True 5 >>> 1 <= 3 6 True 7 >>> 1 == 3 8 False 9 >>> 1 != 3 10 True
这里1和3进行比较,判断1是否小于3,在小于号左右分别留了一个空格,这不是必需的,但是代码量一多,看上去会美观很多。
Python的条件分支语法:
****************
三、while循环
****************
第二个改进要求:程序应该提供多次机会给用户猜测,专业点来讲就是程序需要重复运行某些代码。
temp =input("不妨猜一下小甲鱼现在心里想的是哪个数字:") guess = int(temp) while guess!=8: temp = input("猜错了哦,重新猜一猜:") guess = int(temp) if guess == 8: print("哇草,你是小甲鱼心里的蛔虫吗?") print("哼,猜中了也没有奖励") else: if guess > 8: print("哥,大了大了~~") else: print("嘿,小了!小了!!") print("游戏结束,不玩啦~~")
说一说自己对这一段代码的理解:while循环条件为假的话,运行最后一行的代码。为真的话运行while循环里缩进的内容。值得一提的是,循环体内if-else的guess变量是重新赋值了的。
运用了if-else的嵌套结构。看代码时首先把大的缩进代码区域判断清楚,在判断好每个小的缩进代码区域,这样有便于理清思路。
这里的代码好像跟第2个要求有点不同,后面会进行完善。这里我们给大家的提示是:使用and逻辑操作符Python的and逻辑操作符可以将任意表达式连接在一起,并得到一个布尔类型的值。
****************
四、引入外援
****************
第三个改进要求:每次运行程序产生的答案是随机的。
我们需要引入外援:random模块
这个random模块里边有一个函数叫做:randint(),Ta会返回一个随机的整数。
我们可以利用这个函数来改造我们的游戏!
import random secret = random.randint(1,10) temp =input("不妨猜一下小甲鱼现在心里想的是哪个数字:") guess = int(temp) while guess!=secret: temp = input("猜错了哦,重新猜一猜:") guess = int(temp) if guess > secret: print("哥,大了大了~~") else: print("嘿,小了!小了!!") if guess == secret: print("哇草,你是小甲鱼心里的蛔虫吗?") print("哼,猜中了也没有奖励") print("游戏结束,不玩啦~~")
*******************************
五、课时04课后习题及答案
*******************************
测试题:
0. 请问以下代码会打印多少次“我爱鱼C!”
while 'C': print('我爱鱼C!')
1.请问以下代码会打印多少次“我爱鱼C!”
i = 10 while i: print('我爱鱼C!') i = i - 1
每经过循环体一次,循环体内的i减去1,因而i-=1写在print语句前和语句后都一样!
2.请写出与10 < cost < 50等价的表达式
3.Python3中,一行可以书写多个语句吗?
4.Python3中,一个语句可以分成多行书写吗?
5.请问Python的and操作符和C语言的&&操作符有何不同?
6.听说过“短路逻辑(short-circuitlogic)”吗?
动动手:
0. 完善第二个改进要求(为用户提供三次机会尝试,机会用完或者用户猜中答案均退出循环)并改进视频中小甲鱼的代码。
1.尝试写代码实现以下截图功能:
2.尝试写代码实现以下截图功能:
答案:
测试题:
0. 请问以下代码会打印多少次“我爱鱼C!”
死循环,会一直打印“我爱鱼C!”(嗯,这也算是永远支持鱼C的方法之一),直到崩溃或者用户按下快捷键 CTRL + C(强制结束)
造成死循环的原因是 while 后边的条件永远为真(True),在 Python 看来,只有以下内容会被看作假(注意冒号括号里边啥都没有,连空格都不要有!):False None 0 "" '' () [] {}
其他一切都被解释为真!
不妨试试:
while '': print('进入循环') print('退出循环')
while Flase: print('进入循环') print('退出循环')
或者:
while 0: print('进入循环') print('退出循环')
1.请问以下代码会打印多少次“我爱鱼C!”
10次,每次循环i减1,10次后i=0,while语句不成立,停止打印。
2.请写出与10 < cost < 50等价的表达式
(cost > 10) and (cost < 50)
3.Python3中,一行可以书写多个语句吗?
可以。如果有括号(小括号{}、中括号[]、大括号()),可以在任意地方断行。如果没有,需要在断开的地方添加 \
字符,表示这一行尚未结束。例如:
>>> d={ 1, 2 } >>> d {1, 2} >>> print(d) {1, 2} >>> a=1;b=2 >>> c=a+\ b >>> c 3
一行过长的语句可以使用反斜杠或者括号分解成几行,不妨试试
>>> 3 < 4 and 1 < 2 True >>> 3 < 4 and \ 1 < 2 True >>> (3 <4 and 1 < 2) True
4.Python3中,一个语句可以分成多行书写吗?
可以。
5.请问Python的and操作符和C语言的&&操作符有何不同?
and 布尔”与” ——如果a
为False
,(a and b)
返回False
,否则它返回b
的计算值。
or 布尔”或” —— 如果a
是True
,(a or b)
返回True
,否则它返回b
的计算值。
not 布尔”非” —— 如果a
为True
,not a
返回False
。如果a
为False
,not a
返回True
。
在C中,0&&3 = 0
,1&&3 = 1
。在python中,,0 and 3 = 0,1 and 3 = 3。
>>> 0 and 3 0 >>> 1 and 3 3 >>> 1 or 3 1 >>> 0 or 3 3
6.听说过“短路逻辑(short-circuitlogic)”吗?
逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。举个例子,表达式 a and b,需要 a 和 b 两个变量同时为真(True)的时候,结果才为真。 因此,如果当 a 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 b 变量的值。 这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation) 这种行为同样也应用与 or 操作符。
值得注意的是 0 代表的是False。and式子是同真为真,or式子是有真为真。
也就是说,判断式子是否为真,and 式子中a都为false了,还管b干嘛,无论它是真是假,and式子都为假了。or式子中a都为true了,还管b干嘛,无论它是真是假,or式子都为真了。
动动手:
0. 完善第二个改进要求(为用户提供三次机会尝试,机会用完或者用户猜中答案均退出循环)并改进视频中小甲鱼的代码。
import random secret = random.randint(1,10) i = 3 temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:") number = int(temp) while i > -1: #并不意味着在这里 i=0 时,判断语句就会为False;单独写个 while 0: 才是False。 if number == secret: print("哇草,你是小甲鱼心里的蛔虫吗?") print("哼,猜中了也没有奖励") break else: if number < secret: print("小了小了") else: print("大了大了") #次数的判断 就可以用if-else语句!!! if i != 0: temp = input("请重新猜,还有"+ str(i) +"机会:") number = int(temp) else: print("三次机会已用完,游戏结束") i = i - 1 #为什么i>-1 因为i=1 时还要有一次机会,这里执行了i-1 此时i等于0 要使判断语句为True。
!!!! if 不是循环体!!!!!
以下是大佬提供的简化版本,学习了。
import random secret = random.randint(1,10) i = 3 number = int(input("不妨猜一下小甲鱼现在心里想的是哪个数字:")) while i > -1: if number == secret: print("哇草,你是小甲鱼心里的蛔虫吗?\n哼,猜中了也没有奖励") break else: print("小了小了") if number < secret else print("大了大了") number = int(input("请重新猜,还有"+ str(i) +"机会:")) if i != 0 else print("三次机会已用完,游戏结束") i -= 1
使用了三元运算符和自运算等等的简化版本。
最好少用三元运算符,因为这是个不好的习惯,这会导致你的代码可读性极差。
以下是小甲鱼的代码!
import random times = 3 secret = random.randint(1,10) print('------------------我爱鱼C工作室------------------') # 这里先给guess赋值(赋一个绝对不等于secret的值) guess = 0 # print()默认是打印完字符串会自动添加一个换行符,end=" "参数告诉print()用空格代替换行! # 嗯,小甲鱼觉得富有创意的你应该会尝试用 end="JJ"? print("不妨猜一下小甲鱼现在心里想的是哪个数字:", end=" ") while (guess != secret) and (times > 0):# 先前定义guess为0 有此妙用 直接可以输入一次数字。将接下来两行代码纳入循环体系,减少了代码量。 temp = input() #因为end=“ ” 所以在print输出到屏幕的语句后面直接输入 guess = int(temp) times = times - 1 # 用户每输入一次,可用机会就-1 if guess == secret: print("我草,你是小甲鱼心里的蛔虫吗?!") print("哼,猜中了也没有奖励!") else: if guess > secret: print("哥,大了大了~~~") else: print("嘿,小了,小了~~~") if times > 0: print("再试一次吧:", end=" ") else: print("机会用光咯T_T") print("游戏结束,不玩啦^_^")
值得学习的思维方式有两点:其一 在while循环外用print,并用了end,循环体内用了input(),后面的代码print("再试一次",end" "),与input很好的切合,以便于在用户输入数字前可以写不同的说明语句。其二 while判断语句中 and的用法 同时结合了guess等于0 这一妙用。其实这里不必要用and也可以实现。总有条件下可以用到的,学到啦!!
通过实践证明,在if-else中,先判断输入是否一样,会方便许多。
1. 尝试写代码实现以下截图功能:
temp = input('请输入一个整数:') number = int(temp) i = 1 while number: print(i) i = i + 1 number = number - 1
2. 尝试写代码实现以下截图功能:
temp = input('请输入一个整数:') number = int(temp) while number: i = number - 1 while i: print(' ', end = '') i = i - 1 j = number while j: print('*', end = '') j = j - 1 print() number = number - 1
谈一谈我对这一段程序的理解:先观察最终实现的效果图,结合代码,很清楚的知道,3个循环体分别代表的含义,外循环表明有多少行,内循环,一个循环打出空格,一个循环打出*(星号),各个循环自成一体,所以都会有类似于 i -= 1的代码,以便终止当前循环。而end = " ",因为空格和*是一个一个循环打出的,所以是避免换行。而两次内循环的结束,print()语句实现了换行。
简化版本:
temp = input("输入一个数字:") number = int(temp) while number: print(" "*(number-1) + "*"*number) number -= 1
补充:
称述:在写程序的时候,不小心将 -=写成了 =- 因而程序并没有得到想要的结果,过后我查阅了相关的资料,可以借鉴这一网址:网址(多看两遍就明白了)
>>> a = 2 >>> b = a >>> id(a) 140728562340928 >>> id(b) 140728562340928 >>> a = a + 3 >>> id(a) 140728562341024 >>> id(b) 140728562340928 >>> c = 5 >>> d = 5 >>> id(c) 140728562341024 >>> id(d) 140728562341024 >>> c += 1 >>> id(c) 140728562341056 >>> id(d) 140728562341024
这一部分首先要理解python内存机制,Python中万物皆对象。
对于不可变对象,改变了原来的值,其别名(变量名)绑定到了新值上面,id肯定会改变
>>> aa = [3,4,5] >>> bb = aa >>> id(aa) 3007589114056 >>> id(bb) 3007589114056 >>> aa = aa + [10] >>> id(aa) 3007588801672 >>> id(bb) 3007589114056 >>> aa [3, 4, 5, 10] >>> bb [3, 4, 5]
对于可变对象,+ 操作改变了值,id肯定会变,而+= 是本地操作,其值原地修改
>>> aa = [3,4,5]
>>> bb = aa
>>> id(aa)
1985188852296
>>> id(bb)
1985188852296
>>> aa += [10]
>>> aa
[3, 4, 5, 10]
>>> bb
[3, 4, 5, 10]
>>> id(aa)
1985188852296
>>> id(bb)
1985188852296
>>> cc = [2,3,4] >>> dd = [2,3,4] >>> id(cc) 3007586184840 >>> id(dd) 3007589046728 >>> cc += [0] >>> cc [2, 3, 4, 0] >>> id(cc) 3007586184840 >>> dd = dd + [0] >>> dd [2, 3, 4, 0] >>> id(dd) 3007589105160
对于+号操作,可变对象和不可变对象调用的都是__add__操作
对于+=号操作,可变对象调用__add__,不可变对象调用的是__iadd__(不可变对象没有__iadd__) __iadd__是原地修改
总结一下:对于不可变的对象,例如数字啥的,你用 a = a + 10,亦或者用 a += 10的形式 其id值都会发生改变。而对于可变的对象,例如列表之类的,这里有另种情况要讨论,<1>aa = bb的前提下,aa 和bb的id是相同的,用 aa = aa + [10] 的形式只会改变aa的id,bb的id还是原来的id,不会改变;倘若用aa += [10]的形式,aa和bb的值会同时发生改变,但aa和bb的id还是原来的味道,不会改变!!!<2>cc = [2,3,4] dd = [2,3,4]的前提下,虽然两者的值相同,但是他俩的id是不同的,不同的!!!不明白的看看上面的例子就懂了。好绕,多看两遍就记在心中了,emmm。脑阔痛。