一辆童、什么是控制流
編程語言中的控制流語句用于控制各操作執(zhí)行的順序。
一段沒有控制流的程序的操作順序應(yīng)當是這樣的:
但是實際生活中惠赫,順序操作并不總是能夠滿足我們的需求把鉴,我們可能需要對流程中的一些步驟加入控制。
舉個例子儿咱,當我們在揉面團的時候庭砍,我們首先加入面粉,再倒入一點點水混埠,之后我們還要 判斷 目前的加入的水量是否合適怠缸,如果過干,需要再加入一點點水钳宪,循環(huán) 這個步驟揭北,直到我們認為面粉和水的配比合適為止。
上面的這個流程中就包含了 判斷 和 循環(huán) 兩種控制流處理使套。
本章學習重點:
- conditional statements
- for and while loops
- break and continue
- useful built-in functions
- list comprehensions
二罐呼、條件語句
if phone_balance < 5:
phone_balance += 10
bank_balance -= 10
If、Elif侦高、Else
- Elif is short for else if
總結(jié)一下:Indentation非常重要,Indentation告訴了代碼厌杜,哪些代碼是在if條件內(nèi)奉呛,哪些代碼是不在if條件內(nèi)
請編寫一個 if 語句,使競爭者能夠根據(jù)自己的得分知道獲得了哪個獎品夯尽,得分存儲在整型變量 points 中瞧壮。
有的上下限都包含在內(nèi),points 只能是正整數(shù)匙握,最大值為 200咆槽。
在你的 if 語句中,將一個根據(jù) points 的值存儲相應(yīng)消息的字符串賦值給 result 變量圈纺。如果贏得了獎品秦忿,消息內(nèi)容應(yīng)該是 "Congratulations! You won a [prize name]!",“[prize name]”應(yīng)替換成相應(yīng)的獎品蛾娶。如果沒有贏得獎品灯谣,消息內(nèi)容應(yīng)該是 "Oh dear, no prize this time."
points = 174 # use this input to make your submission
# write your if statement here
if points >= 1 and points <= 50:
result = 'Congratulations! You won a wooden rabbit!'
elif points >= 50 and points <= 150:
result = 'Oh dear, no prize this time.'
elif points >= 151 and points <= 180:
result = 'Congratulations! You won a wafer-thin mint!'
elif points >= 181 and points <= 200:
result = 'Congratulations! You won a wooden penguin!'
print(result)
上述是我的代碼,查看了一下答案蛔琅,順道將答案也貼上來
points = 174
if points <=0:
result = " Invalid score."
elif points <= 50:
result = "Congratulations! You won a wooden rabbit!"
elif points <= 150:
result = "Oh dear, no prize this time."
elif points <= 180:
result = "Congratulations! You won a wafer-thin mint!"
elif points <= 200:
result = "Congratulations! You won a penguin!"
else:
result = " Invalid score."
print(result)
三胎许、條件布爾表達式
if
語句有時候會使用更加復(fù)雜的條件布爾表達式,可能包括多個比較運算符、邏輯運算符辜窑、甚至包括算式钩述。
??不要使用以下代碼表達
if True 或者 if False
原因:True是一個有效的布爾表達式,但是不是有用的條件穆碎。因為它始終為 True牙勘。因此縮進代碼始終都要運行,F(xiàn)alse則相反惨远,永遠都不會運行
# establish the default prize value to None
prize = None
# use the points value to assign prizes to the correct prize names
if points <= 50:
prize = 'wooden rabbit'
if prize = None:
Result = "Oh dear, no prize this time."
else:
result = 'Congratulations! You won a' + prize.
elif points <= 150:
prize = None
if Prize = None:
result = "Oh dear, no prize this time."
else:
elif points <=180:
prize = 'wafer-thin mint'
if prize = None:
result = "Oh dear, no prize this time."
else:
result = 'Congratulations! You won a' + prize.
else:
prize = 'penguin'
if prize = None:
result = "Oh dear, no prize this time."
else:
result = 'Congratulations! You won a' + prize.
# use the truth value of prize to assign result to the correct prize
print(result)
上面是我寫的谜悟,但是我去看了一下官方給的答案~不由地感嘆一聲,官方給的教程北秽,寫得真的太好了葡幸,貼出來
prize = None
if points <= 50:
prize = "a wooden rabbit"
elif 151 <= points <= 180:
prize = "a wafer-thin mint"
elif points >= 181:
prize = "a penguin"
if prize:
result = "Congratulations! You won " + prize + "!"
else:
result = "Oh dear, no prize this time."
print(result)
四、For 循環(huán)
cities = ['new york city', 'moutain view', 'chicago', 'los angeles']
for index in range(len(cities)):
cities[index] = cities[index].title()
- len(cities) 是 4
- range(len(cities))是0贺氓、1蔚叨、2、3
- index 在range(len(cities))中循環(huán)辙培,分別是0蔑水、1、2扬蕊、3
- 最后搀别,在cities這個list中來查找
在實際工作中,我們會經(jīng)常使用到 range
這個函數(shù)尾抑,來做一些需要重復(fù)工作的工作歇父。
練習:創(chuàng)建用戶名
寫一個遍歷 names 列表以創(chuàng)建 usernames 列表的 for 循環(huán)。要為每個姓名創(chuàng)建用戶名再愈,使姓名全小寫并用下劃線代替空格榜苫。對以下列表運行 for 循環(huán):
names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]
應(yīng)該會創(chuàng)建列表:
usernames = ["joey_tribbiani", "monica_geller", "chandler_bing", "phoebe_buffay"]
- 先看一下我寫的代碼
names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]
usernames = []
for i in names:
i = usernames[i].lower().replace(" ", "_")
接著就有報錯了,報錯信息如下
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-2bff8f8274d5> in <module>
1 for i in names:
----> 2 i = usernames[i].lower().replace(" ", "_")
TypeError: list indices must be integers or slices, not str
TyperError說明了什么呢翎冲,他在說 list垂睬,也就是列的索引,不能是字符串抗悍,必須是整數(shù)驹饺,或者切片。
那么我們?nèi)绾卧诹欣锩孢M行for loop呢檐春?我們可以使用整數(shù)索引法則逻淌,使用整數(shù)索引法則可以借助
range()
修改一下上述代碼
usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]
for i in range(len(usernames)):
usernames[i] = usernames[i].lower().replace(" ", "_")
print(usernames)
練習:標記計數(shù)器
寫一個 for
循環(huán),用于遍歷字符串列表 tokens
并數(shù)一下有多少個 XML 標記疟暖。XML 是一種類似于 HTML 的數(shù)據(jù)語言卡儒。如果某個字符串以左尖括號“<”開始并以右尖括號“>”結(jié)束田柔,則是 XML 標記。使用 count
記錄這種標記的數(shù)量骨望。
你可以假設(shè)該字符串列表不包含空字符串硬爆。
看一下我寫的代碼
tokens = ['<greeting>', 'Hello World!', '</greeting>']
count = 0
# write your for loop here
for i in range(len(tokens)):
if (tokens[i][0] = '<') and (tokens[i][-1] = '>'):
count = count + 1
print(count)
??查看了一下答案,發(fā)現(xiàn)自己犯了一個很低級的錯誤擎鸠,判斷是否相等應(yīng)該是 ==
缀磕,這個小知識點,之前學的時候劣光,覺得很簡單袜蚕,但是用起來,還是經(jīng)常容易出問題绢涡。
五牲剃、While 循環(huán)
對list使用for 循環(huán),會對list中的每個元素執(zhí)行一次操作雄可。for loop使用range
function
而使用while凿傅,是一直循環(huán),直到某個條件被滿足数苫。
pop
method 和append剛好相反聪舒,pop會移除list中的最后一個,并且返回被移除的值虐急。
練習:最接近的平方數(shù)
寫一個 while 循環(huán)箱残,用于計算比整數(shù) limit 小的最大平方數(shù),并將其存儲在變量 nearest_square 中止吁。平方數(shù)是整數(shù)乘以自己后的積疚宇,例如 36 是一個平方數(shù),因為它等于 6*6赏殃。
例如,如果 limit 是 40间涵,你的代碼應(yīng)該將 nearest_square 設(shè)為 36仁热。
看一下我寫的代碼
nearest_square = []
## 平方數(shù)
while x * x < limit:
nearest_square.append(x)
print(nearest_square[-1])
(誒,有時候勾哩,分享自己的代碼抗蠢,感到羞恥,自己太菜了思劳,不過沒關(guān)系迅矛,知恥而后勇
分析這段代碼有什么問題
- x 沒有被定義就使用了
- limit也沒有被定義
如何修改呢? - 首先潜叛,將x定義一下 num = 0
- 定義limit秽褒,參考題中給的40
num = 0
nearest_square = []
while num **2 <40:
num = num + 1
nearest_square.append(num**2)
print(nearest_square)
但是上述代碼運行之后壶硅,是49,49好像比40 大了销斟,我們再分析一下為什么出錯庐椒。
注意看我們的while
條件語句,這里是判斷num的平方是否小于40蚂踊,當num為6時候约谈,while為true,就不會運行語句nearest_square.append(num**2)
犁钟,而是會num +
棱诱,接著就是num = 7,這個時候涝动,不滿足while條件迈勋,因此會等于49。所以呢捧存?這段代碼有兩個改法粪躬?
解法1
num = 0
nearest_square = []
while (num +1)**2 <40:
num = num + 1
nearest_square.append(num**2)
print(nearest_square)
解法2
num = 0
nearest_square = []
while num **2 <40:
num = num + 1
nearest_square.append((num-1)**2)
print(nearest_square)
六、Break & Continue
Break terminates a for or while loop / break 會結(jié)束while 或for 循環(huán)昔穴。