課時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。腦闊痛。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM