课时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 布尔”与” ——如果aFalse(a and b)返回False,否则它返回b的计算值。
or 布尔”或” —— 如果aTrue(a or b)返回True,否则它返回b的计算值。
not 布尔”非” —— 如果aTruenot a 返回False。如果aFalsenot 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 操作符。

逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。
这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation),这种行为同样也应用与 or 操作符,这个后边的课程小甲鱼会讲到,不急。
实际上,Python 的做法是如果 x 为假,表达式会返回 x 的值(0),否则它就会返回 y 的值(例子参考楼上那题)。

 

值得注意的是 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。脑阔痛。

 

posted @ 2018-07-24 19:31  那是个好男孩  阅读(1243)  评论(0编辑  收藏  举报