python循環語句用數據做判斷:布爾值和布爾運算
更深入的學習循環語句的用法:
用數據做判斷:布爾值 和 布爾運算
之前我們提到,計算機利用數據有三種方式:1.直接使用數據,2.計算和加工數據,3.用數據做判斷。
計算機的邏輯判斷,只有兩種結果,就是True(英文意思是「真」)和False(英文意思是「假」),沒有灰色地帶。這個計算真假的過程,叫做【布爾運算】。
而True和False,也就叫做【布爾值】。
我們舉個例子,請你運行以下代碼,看看結果是True還是False:
print(3<5)
print(3>5)
print('長安'=='長安')
print('長安'!='金陵')
終端(輸入完畢後請按回車鍵)
True
False
True
True
print()括號內的計算其實就是【布爾運算】。終端上出現的True和False我們稱為【布爾值】。
第1行和第2行代碼很簡單啦。我們看後面兩行:兩個字符串'長安'相等,結果正確,所以列印為True。而字符串'長安'和字符串'金陵'做比較,結果不相等,!=代表不等號,結果正確,列印為True。
只有當條件判斷為True時,if和while後面的子句才會執行下去。
好,現在我們來體驗一下上面出現過的這段奇怪的代碼,你會發現它執行後,終端上不顯示任何結果:
while False:
print('while False')
終端(輸入完畢後請按回車鍵)
這是因為while循環執行,必須要while後的條件為「真」,而【布爾值】False本身就是「假」,所以這個循環一次都沒運行就結束了。
現在我們知道了什麼是布爾運算以及布爾值的作用,我們接著學習【布爾運算】的三種方式。其中的第一種,就是作比較。
兩個數值做比較
用兩個數值做比較的【布爾運算】,主要包含以下情況:
python中的比較運算符
等於 == 不等於 != 大於 > 小於 < 大於等於 >= 小於等於 <=
主要記住前兩種==和!=,這兩種在條件判斷中用得非常多。還有大於>和小於<了,這都屬於數學常識了。
另外,特別提醒大家一點:在代碼中,A == B表示A和B相等,==表示相等關係;而=表示給變量賦值。=和==雖然長得相似,但沒有任何關係。
對於=和==,初學者很容易混淆寫錯,導致報錯。請你來修改一下下面的代碼,讓它能正確運行:
password = input('請輸入密碼:')
if password = 'abc': #修改這裡為==
print('密碼正確!')
else:
print('密碼錯誤!')
終端(輸入完畢後請按回車鍵)
我們接著看布爾運算的第二種方式:直接用數值做運算。
直接用數值做運算
請看這段代碼:
# 直接運行代碼即可
if 1:
print('熊貓')
終端(輸入完畢後請按回車鍵)
熊貓
終端列印出了一個字符串熊貓。我們看看這兩行代碼,這是一段使用了條件判斷的代碼。因為終端列印出了'熊貓',說明 if 後面的條件為真。
可是怪就怪在,if後面接的不像是一個「條件」,而是一個數字。
其實,整數1在這裡就是作為一個條件,被判斷為真(True)。這就是數值本身作為一個條件,被判斷真假的情況。
那為什麼可以這樣操作呢?
因為在Python中已經設定好什麼數據為真,什麼為假。假的是有限的,那麼除了假的,就都是真的。請看下圖:
請看"python 中的真假判斷"圖片
這個表的左側一列,它們在Python中被判定為假,比如False、0、'' (空字符串)等等。假的東西是有限的,那麼除了假的,其他就都是真的。比如上一個例子中出現的整數1,就是真的。
至於None,它代表的是【空值】,自成一派,數據類型是NoneType。要注意它和0的區別,0是整數0,可並非什麼都沒有。
好,現在請看這段代碼,然後回答問題:
if '開心':
print('熊貓')
if '':
print('熊貓')
請問執行這段程序時,終端會顯示什麼?
A 什麼都不顯示
B 顯示一個'熊貓'字符串。
C 顯示兩個『熊貓』字符串。
我選擇了 C
不對噢,'開心'這個字符串作為一個條件時,被判定為真,所以if後面的條件滿足,計算機會執行if的下一行代碼;而 ''(空字符串)本身作為一個條件時,被判定為假,if後面的條件為假,計算機不會執行if的下一行代碼。
我們可以使用bool()函數來查看一個數據會被判斷為真還是假。這個函數的用法與type()函數相似(還有印象吧~),在bool()函數括號中放入我們想要判斷真假的數據,然後print出來即可。
我們來做個試驗,用bool()函數把前面我們提到的各種數據都放進去判斷一下,列印出來看看。請閱讀代碼後再直接運行:
# 請閱讀代碼後再直接運行
print('以下數據判斷結果都是【假】:')
print(bool(False))
print(bool(0))
print(bool(''))
print(bool(None))
print('以下數據判斷結果都是【真】:')
print(bool(True))
print(bool(1))
print(bool('abc'))
終端(輸入完畢後請按回車鍵)
以下數據判斷結果都是【假】:
False
False
False
False
以下數據判斷結果都是【真】:
True
True
True
好啦,現在你明白了「直接用數值做布爾運算」是怎麼一回事,再來看看第三種情況。
--------------------------------------------------------------------------------------
布爾值之間的運算
你會接觸到and、or、not、in、not in五種運算,別怕,只是看起來多,我保證不難。
還是用例子來說明吧。我們先看看【and】和【or】。請先閱讀代碼,然後直接運行:
# 請先閱讀代碼,然後直接運行
a = 1
b = -1
print('以下是and運算')
if a==1 and b==1: # 【b實際上是-1】
print('True')
else:
print('False')
print('以下是or運算')
if a==1 or b==1: # 【b實際上是-1】
print('True')
else:
print('False')
終端(輸入完畢後請按回車鍵)
以下是and運算
False
以下是or運算
True
注意到屏幕上的結果了麼?
a==1 and b==1的意思是【a=1並且b=1】,要兩個條件都滿足,才能判斷為True,而a==1 or b==1的意思是【a=1或者b=1】,只要兩個條件滿足一個,就能判斷為True。
布爾值的運算--and
true and true 為真
true and false 為假
false and true 為假
false and false 為假
------------------------------
布爾值的運算--or
true or true 為真
true or false 為真
false or true 為真
false or false 為假
--------------------------------
我們來做道練習題鞏固一下,請看代碼,判斷終端執行結果:
a = 5
b = -1
c = 0
d = 7
if a<b and c<d:
print('True')
else:
print('False')
終端(輸入完畢後請按回車鍵)
false
答對啦~ a<b為假,c<d為真,兩個條件都要滿足才行,所以判斷為假,會print出False。
接下來我們看看【not】運算。這個運算很簡單,表示翻轉的意思。not True就等於False,not False就等於True。
布爾值的運算--not
not True 為假
not False 為真
--------------------------------
最後,我們講一下【in】和【not in】兩種運算。
【in】的意思是「判斷一個元素是否在一堆數據之中」,【not in】反之。這個超簡單的。
list = [1,2,3,4,5]
a = 1
b = 6
c = 0
你用肉眼就能判斷a,b,c三個變量在不在(in或是not in)列表list裡面了對吧?來簡單運行一個試試唄。
# 直接運行代碼即可
list = [1,2,3,4,5]
a = 1
# 做一次布爾運算,判斷「a是否在列表list之中」
print(bool(a in list))
print(bool(a not in list))
終端(輸入完畢後請按回車鍵)
True
False
如果涉及到的數據集合是字典的話,【in】和【not in】就可以用來判斷字典中是否存在某個【鍵】:
#運行結果會是什麼你應該很清楚啦,看看就好~
dict = {'法國':'巴黎','日本':'東京','中國':'北京'}
a = '法國'
print(bool(a in dict))
到這裡,我們學完了5種布爾值的運算方式,不難,就是有點多,我還有點囉嗦,對吧~
讓我們對所有的布爾計算方式做個總結。連續點擊回車後你會擁有3張總結圖,不用細看,保存下來整理成你自己的筆記吧~
找圖:
第一種計算:兩個數值做比較的布爾計算方式總結
第二種計算:直接用數值做運算的布爾計算方式總結
第三種計算:布爾值之間的運算的布爾計算方式總結
掌握了布爾值,以後我們可以寫出更加簡潔的while循環。
--------------------------------------------------------------------------------------
比如說,昨天用while循環重複執行100遍任務,代碼會這樣寫:
i = 1
while i<101 :
print('把這句話列印100遍')
i = i+1
今天理解布爾運算原理後,可以把這段代碼改造成更「程式設計師」的方式:
i = 100
while i:
print('把這句話列印100遍')
i = i-1
你看懂了為什麼這兩種寫法效果是一樣的麼?
A 我看懂了。
B 請老師再解釋解釋。
我選B
我再解釋一下。第二種寫法,一開始i是100,while i的布爾運算結果是True。然後每次循環,第4行代碼會讓i的數值減1。
直到i減少到0的時候,0的布爾運算結果是False,導致while 0會結束循環。所以這樣的whlie循環也能正好重複一百遍。這種方式對計算機來說是更簡單的,因為計算次數減少了(減少了計算i<100,i<99……這個過程),這也是程式設計師在寫代碼時的思考方式。
我們以後還會經常看到布爾運算和布爾值在代碼中的運用,今天對布爾值的講解就到這裡。
接下來,是本關的第二個主題:循環裡的四種新語句
--------------------------------------------------------------------------------------
四種新的語句
這4種新語句配合for循環和while循環,可以讓循環發揮更多的功能。我們逐個來看。
break語句
我們先來看看break語句。break的意思是「打破」,是用來結束循環的,一般寫作if...break。它的寫法長這樣:
# break語句搭配for循環
for...in...:
...
if ...:
break
# break語句搭配while循環
while...(條件):
...
if ...:
break
在這裡,if...break的意思是如果滿足了某一個條件,就提前結束循環。記住,這個只能在循環內部使用。
我們運行一下代碼來理解這一點。下面是一個for循環代碼,本來會循環5次,但循環到第4次的時候就被break語句打斷,然後結束循環了。
# 請運行代碼體驗效果
for i in range(5):
print('明日復明日')
if i==3: # 當i等於3的時候觸發
break # 結束循環
終端(輸入完畢後請按回車鍵)
明日復明日
明日復明日
明日復明日
明日復明日
--------------------------------------------------------------------------------------
下面是一個while循環代碼,本來會循環5次,但循環到第3次的時候就被break語句打斷,然後結束循環了。
# 請運行代碼體驗效果
i = 0
while i<5:
print('明日復明日')
i = i+1
if i==3: # 當i等於3的時候觸發
break # 結束循環
終端(輸入完畢後請按回車鍵)
明日復明日
明日復明日
明日復明日
小小地提醒你,break前面一共縮進了【8個空格】。
這是因為if之下的語句要縮進4個空格(按一次Tab鍵),這裡的if...break又嵌套在while或for循環中,而循環語句本身又要縮進4個空格。這樣一來,break就縮進了【4+4=8】個空格(按兩次Tab鍵)。【注】:Tab鍵和空格鍵不能同時混用。
接下來,看個輕鬆點的小說案例,鞏固一下知識。
《西遊記》裡面有一個車遲國,車遲國裡面有個陳家莊,陳家莊的河裡有一個鯉魚精,每一年都要陳家莊上供一對童男童女給自己吃,莊裡的人家真是苦不堪言。
這種年復一年的循環狀態,在唐僧師徒來到這裡後,結束了。因為孫悟空制服了這個鯉魚精,百姓再也不用受苦了!真好。
如果用Python來展示這個故事:
while True:
print('上供一對童男童女')
t = input('孫悟空來了嗎')
if t == '來了':
break
print('孫悟空制服了鯉魚精,陳家莊再也不用上供童男童女了')
來運行看看這段代碼:我希望你隨便輸入幾個數據,點擊enter,圍觀程序循環;然後再輸入「來了」,點擊enter,結束循環。
while True:
print('上供一對童男童女')
t = input('孫悟空來了嗎')
if t == '來了':
break
print('孫悟空制服了鯉魚精,陳家莊再也不用上供童男童女了')
終端(輸入完畢後請按回車鍵)
孫悟空來了嗎sdfdf
上供一對童男童女
孫悟空來了嗎sdfsdf
上供一對童男童女
孫悟空來了嗎sdfdsf
上供一對童男童女
孫悟空來了嗎來了
孫悟空制服了鯉魚精,陳家莊再也不用上供童男童女了
第1行代碼:while True我們在上面見過了,這個條件為真,就會開啟無限循環。而while True常和break語句搭配使用,你也可以學著使用這種寫法。
第2行代碼:列印上供一對童男童女的字符串。
第3行代碼:請用戶輸入一個信息。
第4行代碼:如果用戶輸入的信息是 「來了」,那麼if後面的條件被滿足,執行下面的代碼break;如果沒有,回到while True 繼續循環。
第5行代碼:break表示結束循環,然後去執行循環外部的代碼,即第6行代碼,列印孫悟空制服了鯉魚精的字符串。
【練習時間來咯】接下來是你表現的機會!我們來練習一下break語句的編程。
我想請你寫下這樣一個程序,功能是請用戶輸入密碼,如果輸入了錯誤的密碼,就一直循環請用戶繼續輸入;如果輸入了正確的密碼,就結束循環。設定這個密碼為'小龍女'。(其實之前做過這題,有印象嗎?)
while True:
p = input('請輸入你的密碼:')
if p == '小龍女':
break
print('通過啦')
終端(輸入完畢後請按回車鍵)
請輸入你的密碼:小龍女
通過啦
第1行:用while True 開啟了一個無限循環。你也可以用while 1 或其他形式開啟一個無限循環。
第2行:用input() 函數獲取到了一個數據。
第3行:如果這個數據等於之前設定的密碼,
那麼就第4行:結束循環。如果這個數據不等於之前設定的密碼,那就回到第1行while True繼續循環。
第5行:結束循環後,就列印--通過啦。這已經是循環外部的代碼了,所以沒有縮進噢。
break子句,咱們就講到這裡。接下來「繼續」,continue語句。
--------------------------------------------------------------------------------------
continue語句
continue的意思是「繼續」。這個子句也是在循環內部使用的。當某個條件被滿足的時候,觸發continue語句,將跳過之後的代碼,直接回到循環的開始。
它的寫法是這樣的:
# continue語句搭配for循環
for...in...:
...
if ...:
continue
...
# continue語句搭配while循環
while...(條件):
...
if ...:
continue
...
請觀察代碼,然後運行代碼看看是什麼結果:
# 觀察代碼,然後運行代碼看看是什麼結果
# continue語句搭配for循環
for i in range(5):
print('明日復明日')
if i==3: # 當i等於3的時候觸發
continue # 回到循環開頭
print('這句話在i等於3的時候列印不出來')
print('***********************************') #列印分劃線
# continue語句搭配while循環
i = 0
while i<5:
print('明日復明日')
i = i+1
if i==3: # 當i等於3的時候觸發
continue # 回到循環開頭
print('這句話在i等於3的時候列印不出來')
終端(輸入完畢後請按回車鍵)
明日復明日
這句話在i等於3的時候列印不出來
明日復明日
這句話在i等於3的時候列印不出來
明日復明日
這句話在i等於3的時候列印不出來
明日復明日
明日復明日
這句話在i等於3的時候列印不出來
***********************************
明日復明日
這句話在i等於3的時候列印不出來
明日復明日
這句話在i等於3的時候列印不出來
明日復明日
明日復明日
這句話在i等於3的時候列印不出來
明日復明日
這句話在i等於3的時候列印不出來
上面的代碼,當i==3的時候會觸發continue語句,於是回到了循環開頭,跳過了一句print語句。
這樣的數字遊戲是不是有點無聊?不如再用一個小說例子來解解悶吧。
《天龍八部》裡面有這樣一個情節:西夏公主招親選婿,吸引了許許多多的青年才俊。
西夏公主挑駙馬的方式是,是問這些青年3個問題。
這三個問題,只有連續答對,才能判定他就是西夏公主的意中人;否則,只要有任何一題錯,都要換人從頭開始回答問題。
事實上,西夏公主曾和她的意中人虛竹邂逅於一個黑暗的冰窖之中,但兩人不知對方姓名,只互稱呼「夢姑」和「夢郎」,兩人也看不清彼此的臉。因此,西夏公主為了找到虛竹,才進行招親,並對候選者問出這三個問題。
如果用Python來描述這個故事,我想應該是這樣的:
while True:
q1 = input('第一問:你一生之中,在什麼地方最是快樂逍遙?')
if q1 != '黑暗的冰窖':
continue
print('答對了,下面是第二問:')
q2 = input('你生平最愛之人,叫什麼名字?')
if q2 != '夢姑':
continue
print('答對了,下面是第三問:')
q3 = input('你最愛的這個人相貌如何?')
if q3 == '不知道':
break
print('都答對了,你是虛竹。')
別怕哈,表面上看這個代碼老長老長,其實不難,我們先看1-5行代碼
第1、2行我就不說了,從第3行開始,當第一問的答案不是「黑暗的冰窖」時,就說明答錯了,必須從頭開始,所以使用continue提前開始循環,回到第1行代碼。
如果在第3行,有人回答對了,那麼if q1的條件為假,就會繼續執行第5行的代碼。之後的代碼都是同樣的道理。
再看10-13行代碼,到了最後一行,如果答對,就可以用break結束循環。答錯的話,重新開始,這裡就不需要continue了。
為了讓你更好地理解,請你運行下面的代碼:①你可以隨便輸入,感受一下循環的邏輯,比如第一個答案對,第二個答案錯;或者第一、二個答案對,第三個答案錯。②當你玩得差不多了,請依次輸入『黑暗的冰窖』,點擊enter,再輸入『夢姑』,點擊enter,再輸入『不知道』,點擊enter,就能結束循環。
while True:
q1 = input('第一問:你一生之中,在什麼地方最是快樂逍遙?')
if q1 != '黑暗的冰窖':
continue
print('答對了,下面是第二問:')
q2 = input('你生平最愛之人,叫什麼名字?')
if q2 != '夢姑':
continue
print('答對了,下面是第三問:')
q3 = input('你最愛的這個人相貌如何?')
if q3 == '不知道':
break
print('都答對了,你是虛竹。')
終端(輸入完畢後請按回車鍵)
第一問:你一生之中,在什麼地方最是快樂逍遙?鬼地
第一問:你一生之中,在什麼地方最是快樂逍遙?鬼地在
第一問:你一生之中,在什麼地方最是快樂逍遙?黑暗的冰窖
答對了,下面是第二問:
你生平最愛之人,叫什麼名字?你
第一問:你一生之中,在什麼地方最是快樂逍遙?黑暗的冰窖
答對了,下面是第二問:
你生平最愛之人,叫什麼名字?夢姑
答對了,下面是第三問:
你最愛的這個人相貌如何?知道
第一問:你一生之中,在什麼地方最是快樂逍遙?黑暗的冰窖
答對了,下面是第二問:
你生平最愛之人,叫什麼名字?夢姑
答對了,下面是第三問:
你最愛的這個人相貌如何?不知道
都答對了,你是虛竹。
好,你可以看到continue的作用就是就是當某個條件為真時,又提前回到循環,而不會執行下面的代碼。
關於continue語句,我就講到這裡。接下來是pass語句。
--------------------------------------------------------------------------------------
pass語句
pass語句就非常簡單了,它的英文意思是「跳過」。
我們舉個例子,請你運行代碼體驗一下:
#請你運行代碼體驗一下
a = int(input('請輸入一個整數:'))
if a >= 100:
pass
else:
print('你輸入了一個小於100的數字')
終端(輸入完畢後請按回車鍵)
請輸入一個整數:111
這個代碼的意思是:當a>=100的時候,跳過,什麼都不做。其他情況,也就是a<100的時候,執行一個print語句。
如果沒有pass來佔據一個位置表示「什麼都不做」,以上的代碼執行起來會報錯:(請你先體驗一下報錯,然後把pass語句加上。)
# 請體驗一下報錯,然後把pass語句加上
a = int(input('請輸入一個整數:'))
if a > 100:
else:
print('你輸入了一個小於100的數字')
終端(輸入完畢後請按回車鍵)
else:
^
IndentationError: expected an indented block
好,pass語句就是這麼簡單,pass!
--------------------------------------------------------------------------------------
else語句
最後一種else語句,我們在條件判斷語句見過【else】,其實,else不但可以和if配合使用,它還能跟for循環和while循環配合使用。
舉一個例子;
for i in range(5):
a = int(input('請輸入0來結束循環,你有5次機會:'))
if a == 0:
print('你觸發了break語句,循環結束,導致else語句不會生效。')
break
else:
print('5次循環你都錯過了,else語句生效了。')
以上這段代碼,請你做兩種嘗試:1.連續五次不輸入零;2.輸入一次0跳出循環。完成一種嘗試後,你可以點擊【重做】按鈕,再來一次嘗試。
for i in range(5):
a = int(input('請輸入0結束循環,你有5次機會:'))
if a == 0:
print('你觸發了break語句,導致else語句不會生效。')
break
else:
print('5次循環你都錯過了,else語句生效了。')
終端(輸入完畢後請按回車鍵)
請輸入0結束循環,你有5次機會:123
請輸入0結束循環,你有5次機會:24
請輸入0結束循環,你有5次機會:2
請輸入0結束循環,你有5次機會:54
請輸入0結束循環,你有5次機會:12
5次循環你都錯過了,else語句生效了。
所以,用一句話總結,當循環中沒有碰到break語句,就會執行循環後面的else語句,否則就不會執行。
--------------------------------------------------------------------------------------
在while循環中,else的用法也是如此,格式一模一樣:
while...(條件):
...
else:
...
我們來做一個練習:把之前那段for循環的代碼改成while循環,要求運行起來效果一模一樣。
i = 0
while i<5:
a = int(input('請輸入0結束循環,你有5次機會:'))
i = i+1
if a == 0:
print('你觸發了break語句,導致else語句不會生效。')
break
else:
print('5次循環你都錯過了,else語句生效了。')
--------------------------------------------------------------------------------------
到這裡我們4種語句都學完了,我們做個總結:
break 語句 從循環內跳出(必須和if語句連用)
continue 語句 跳躍到循環開頭(必須和if語句連用)
pass 語句 什麼都不做(常用在if語句下)
else 語句 用在循環語句後,如果正常結束循環就執行else語句(沒有遇到break)
--------------------------------------------------------------------------------------
由於循環的知識很重要,所以最後和大家再共同完成一個例題。
secret = 24 #設定秘密數字
while True:
guess = input('你來猜猜我的秘密數字是多少:') #輸入猜測數字
if int(guess)==secret: #數字對比
print('正確!你很棒哦。')
break
elif int(guess)>secret:
print('你猜的太大了,請重新猜猜~')
else:
print('你猜的太小了,請重新猜猜~')
終端(輸入完畢後請按回車鍵)
來猜猜我的秘密數字是多少:32
你猜的太大了,請重新猜猜~
你來猜猜我的秘密數字是多少:2
你猜的太小了,請重新猜猜~
你來猜猜我的秘密數字是多少:24
正確!你很棒哦。
第一行代碼完成了秘密數字的設定,即設定變量secret,並把賦值給它。
第二行代碼,while True意味這是一個無限循環,需要想辦法結束。冒號後的幾行代碼就是執行語句,邏輯順序是先輸入猜測的數字,再用if進行判斷。
猜錯了則會進入下一次循環,需要再次輸入猜測的數字並用if進行判斷。猜對了則會結束遊戲。
那要怎麼在猜對的時候結束遊戲呢?這就用到了break語句
假如我們改變一下題目:一個人在心裡想好一個數,比如24,然後讓另一個人猜。如果他猜的數比24小,告訴他「太小了」,如果他猜的數比24大,告訴他「太大了」,這個遊戲只能猜3次,3次都猜不中,就告訴他「失敗了」。
請你再思考一下,這時候的解決方法應該是什麼?
這次的挑戰更難一些了,請思考「??」處應該用什麼知識解決問題,然後再嘗試編程吧(老地方有提示哈):
secret = 24
for i in range(3):
guess = input('guess which number is my secret:')
if int(guess) ==secret:
print('正確!你很棒哦。') #輸出結果
break
elif int(guess)>secret:
print('你猜的太大了,請重新猜猜~')
else:
print('你猜的太小了,請重新猜猜~')
else:
print('給你3次機會都猜不到,你失敗了。')
終端(輸入完畢後請按回車鍵)
guess which number is my secret:123
你猜的太大了,請重新猜猜~
guess which number is my secret:1
你猜的太小了,請重新猜猜~
guess which number is my secret:22
你猜的太小了,請重新猜猜~
給你3次機會都猜不到,你失敗了。
既然是三次機會,那麼我們就利用range(3)生成0,1,2的序列,三次循環之後即會結束。
這裡我們重點看兩個地方:一是break,二是倒數第二句的else。
在for...in...循環中也可以使用break,正常情況下,三次機會用完之後就結束循環,但如果第一次就猜對了,也需要結束循環。前者我們能用range(3)解決,後者則依靠break語句。
for...in...可以和else語句搭配使用。意思是在for...in...循環結束之後,執行else語句裡的命令。不過如果for...in...是因為break結束的就不會執行else語句裡的命令。
所以如果第一次就猜對了,break會結束循環,計算機會告訴你right,但不會列印出else裡面的「給你3次機會都猜不到,你失敗了。」
其實編程就是這樣,不斷拆解,不斷動手,不斷接受失敗,於是不斷成長。
好啦,關於「循環」的學習就告一段落了,最後送給同學們一句話:
為不斷學習新知識的各位感到驕傲,大家快去完成練習吧~我們下一關見!
練習目標:
我們會通過今天的作業,綜合運用while True循環和 break。
練習要求:
假設有兩名囚徒A和B因為合夥犯罪被抓捕,因沒有確鑿可以指認罪行的證據,審判者準備單獨審判兩位囚徒。
若兩人都認罪,則兩人各判10年;若一個認罪一個抵賴,則認罪的人判1年,抵賴的人判20年;若兩人都抵賴,則各判3年。
現在,請寫個代碼:當兩人都抵賴時,列印判決,代碼結束;若為其他結果,則在列印判決後繼續循環。
while True:
a=input('囚徒A:選擇認罪或抵賴:')
b=input('囚徒B:選擇認罪或抵賴:')
if a=='認罪' and b=='認罪':
print('兩人都認罪,各判10年。')
continue
if a=='抵賴' or b=='抵賴':
if a == '認罪':
print('囚徒A,認罪被判1年!,囚徒B,認罪被判20年!')
continue
elif b == '認罪':
print('囚徒B,認罪被判1年!,囚徒A,認罪被判20年!')
continue
else:
print('兩人都抵賴,各判決3年。')
break
終端(輸入完畢後請按回車鍵)
囚徒A:選擇認罪或抵賴:抵賴
囚徒B:選擇認罪或抵賴:認罪
囚徒B,認罪被判1年!,囚徒A,認罪被判20年!
囚徒A:選擇認罪或抵賴:認罪
囚徒B:選擇認罪或抵賴:抵賴
囚徒A:選擇認罪或抵賴:認罪
囚徒B:選擇認罪或抵賴:抵賴
囚徒A,認罪被判1年!,囚徒B,認罪被判20年!
囚徒A:選擇認罪或抵賴:認罪
囚徒B:選擇認罪或抵賴:認罪
兩人都認罪,各判10年。
囚徒A:選擇認罪或抵賴:抵賴
囚徒B:選擇認罪或抵賴:抵賴
兩人都抵賴,各判決3年。
-----------------------------------------------------------------------------------
老師這代碼有BUG,只能參考!
while True:
a = input('A,你認罪嗎?請回答認罪或者不認')
b = input('B,你認罪嗎?請回答認罪或者不認')
if a == '認罪' and b == '認罪':
print('兩人都得判10年,唉')
elif a == '不認' and b == '認罪':
print('A判20年,B判1年,唉')
elif a == '認罪' and b == '不認':
print('A判1年,B判20年')
else:
print('都判3年,太棒了')
break # 當滿足開頭提到的條件時,跳出循環。
-------------------------------------------------------------------------------------
上一個練習,我們將「囚徒困境」寫成了代碼,讓程序收集兩名囚犯的認罪情況,進而決定他們的判決:
兩人都認罪,則各判10年;一個認罪一個抵賴,則前者判1年,後者判20年;兩人都抵賴,各判3年。只有兩人都不認罪,程序才會停止。
現在有一個社會學家,在不同的人群中做這個實驗,一旦遇到都不認罪的情況,就停止該人群中的實驗。
同時,他希望程序能記錄每一對實驗者的選擇,以及記錄第幾對實驗者都選擇不認罪。請你幫幫他吧。
為了記錄每一對實驗者的選擇,需要用一個可拓展的「容器」來存放這些數據;
為了記錄是第幾對實驗者做了最優選擇,需要用一個變量來計數;
為了將每一對實驗者的選擇再列印出來,需要寫一個循環。
# 需要的變量放到開頭,明顯一些。
y = []
n = 0
while True:
n+=1 ####n= n + 1
a=input('A:你認罪嗎?請回答認罪或不認:')
b=input('B:你認罪嗎?請回答認罪或不認:')
y.append([a,b])
if a == '認罪' and b == '認罪':
print('A、B兩人都認罪,各判決10年。')
elif a == '不認' or b == '不認':
if a == '認罪':
print('A:被判決1年,B:被判決20年。')
elif b == '認罪':
print('B:被判決1年,A:被判決20年。')
else:
print('兩人都不認,各判決3年。')
break
print('第'+str(n)+'對實驗者最優選擇!')
for i in range(n):
###i = i + 1
print('第' + str(i+1) + '對實驗者的選擇是:' + str(y[i]))
終端(輸入完畢後請按回車鍵)
A:你認罪嗎?請回答認罪或不認:234
B:你認罪嗎?請回答認罪或不認:222
A:你認罪嗎?請回答認罪或不認:564
B:你認罪嗎?請回答認罪或不認:..
A:你認罪嗎?請回答認罪或不認:i
B:你認罪嗎?請回答認罪或不認:w
A:你認罪嗎?請回答認罪或不認:不認
B:你認罪嗎?請回答認罪或不認:認罪
B:被判決1年,A:被判決20年。
A:你認罪嗎?請回答認罪或不認:認罪
B:你認罪嗎?請回答認罪或不認:不認
A:被判決1年,B:被判決20年。
A:你認罪嗎?請回答認罪或不認:認罪
B:你認罪嗎?請回答認罪或不認:認罪
A、B兩人都認罪,各判決10年。
A:你認罪嗎?請回答認罪或不認:不認
B:你認罪嗎?請回答認罪或不認:不認
兩人都不認,各判決3年。
第7對實驗者最優選擇!
第1對實驗者的選擇是:['234', '222']
第2對實驗者的選擇是:['564', '..']
第3對實驗者的選擇是:['i ', 'w ']
第4對實驗者的選擇是:['不認', '認罪']
第5對實驗者的選擇是:['認罪', '不認']
第6對實驗者的選擇是:['認罪', '認罪']
第7對實驗者的選擇是:['不認', '不認']
--------------------------------------------------------------------------------------
此代碼很不錯,可以運用!
while True:
a = input('A:你認罪嗎?請回答認罪或不認。:')
while a != '認罪' and a != '不認':
a = input('please:')
b = input('B:你認罪嗎?請回答認罪或不認。:')
while b != '認罪' and b != '不認':
b = input('please:')
if a == '認罪' and b == '認罪':
print('兩人都被判決10年,唉')
elif a == '不認' and b == '認罪':
print('A:被判決20年,B:被判1年,唉')
elif a == '認罪' and b == '不認':
print('A:被判決1年,B:被判決20年,唉')
elif a == '不認' and b == '不認':
print('兩人都被判決3年,太棒了!')
break
--------------------------------------------------------------------------------------
y = []
n = 0
while True:
n += 1
a = input('A:你認罪嗎?請回答認罪或不認。:')
while a != '認罪' and a != '不認':
a = input('please!請回答:')
b = input('B:你認罪嗎?請回答認罪或不認。:')
while b != '認罪' and b != '不認':
b = input('please!請回答:')
y.append([a,b])
if a == '認罪' and b == '認罪':
print('兩人都被判決10年,唉')
elif a == '不認' and b == '認罪':
print('A:被判決20年,B:被判1年,唉')
elif a == '認罪' and b == '不認':
print('A:被判決1年,B:被判決20年,唉')
elif a == '不認' and b == '不認':
print('兩人都被判決3年,太棒了!')
break
print('第' + str(n) + '對實驗者最優選擇!')
for i in range(n):
print('第' + str(i+1) + '對實驗者的選擇是:' + str(y[i]))
終端(輸入完畢後請按回車鍵)
A:你認罪嗎?請回答認罪或不認。:認尖
please!請回答:23我
please!請回答:認罪
B:你認罪嗎?請回答認罪或不認。:234田
please!請回答:
please!請回答:不認
A:被判決1年,B:被判決20年,唉
A:你認罪嗎?請回答認罪或不認。:不認
B:你認罪嗎?請回答認罪或不認。:認罪
A:被判決20年,B:被判1年,唉
A:你認罪嗎?請回答認罪或不認。:認罪
B:你認罪嗎?請回答認罪或不認。:認罪
兩人都被判決10年,唉
A:你認罪嗎?請回答認罪或不認。:不認
B:你認罪嗎?請回答認罪或不認。:不認
兩人都被判決3年,太棒了!
第4對實驗者最優選擇!
第1對實驗者的選擇是:['認罪', '不認']
第2對實驗者的選擇是:['不認', '認罪']
第3對實驗者的選擇是:['認罪', '認罪']
第4對實驗者的選擇是:['不認', '不認']
--------------------------------------------------------------------------------------
通過這個練習,你會學會綜合使用循環、數據提取和條件判斷。
我很喜歡看電影,我回憶了一下,這兩年我覺得還不錯的國產電影。
下面,會將電影的影片名和主演放在字典裡,如movie = {'妖貓傳':['黃軒','染谷將太']}。
需要你補充一些代碼,讓其他人只要輸入演員名,就列印出:××出演了電影××。
movies = {
'妖貓傳':['黃軒','染谷將太'],
'無問西東':['章子怡','王力宏','祖峰'],
'超時空同居':['雷佳音','佟麗婭'],
}
actor = input('你想查詢哪個演員?')
for i in movies: # 用 for 遍歷字典
a = movies[i] # 讀取各個字典的主演表
if actor in a:
print(actor + '出演了電影' + i)
終端(輸入完畢後請按回車鍵)
你想查詢哪個演員?黃軒
黃軒出演了電影妖貓傳