Python | 控制流

一辆童、什么是控制流

編程語言中的控制流語句用于控制各操作執(zhí)行的順序。
一段沒有控制流的程序的操作順序應(yīng)當是這樣的:

image.png

但是實際生活中惠赫,順序操作并不總是能夠滿足我們的需求把鉴,我們可能需要對流程中的一些步驟加入控制。

舉個例子儿咱,當我們在揉面團的時候庭砍,我們首先加入面粉,再倒入一點點水混埠,之后我們還要 判斷 目前的加入的水量是否合適怠缸,如果過干,需要再加入一點點水钳宪,循環(huán) 這個步驟揭北,直到我們認為面粉和水的配比合適為止。


image.png

上面的這個流程中就包含了 判斷 和 循環(huán) 兩種控制流處理使套。

本章學習重點:

  1. conditional statements
  2. for and while loops
  3. break and continue
  4. useful built-in functions
  5. 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則相反惨远,永遠都不會運行

學習地址:https://classroom.udacity.com/courses/ud1110/lessons/e91dc8c3-aed0-4c0c-9a43-438c36df7b0f/concepts/69bfbde2-3f63-41ed-8793-aabf0f6a4bab


# 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()
  1. len(cities) 是 4
  2. range(len(cities))是0贺氓、1蔚叨、2、3
  3. index 在range(len(cities))中循環(huán)辙培,分別是0蔑水、1、2扬蕊、3
  4. 最后搀别,在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使用rangefunction
而使用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)系迅矛,知恥而后勇

分析這段代碼有什么問題

  1. x 沒有被定義就使用了
  2. limit也沒有被定義
    如何修改呢?
  3. 首先潜叛,將x定義一下 num = 0
  4. 定義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)昔穴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镰官,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吗货,更是在濱河造成了極大的恐慌泳唠,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宙搬,死亡現(xiàn)場離奇詭異笨腥,居然都是意外死亡,警方通過查閱死者的電腦和手機勇垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門脖母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闲孤,你說我怎么就攤上這事谆级。” “怎么了讼积?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵肥照,是天一觀的道長。 經(jīng)常有香客問我勤众,道長舆绎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任们颜,我火速辦了婚禮吕朵,結(jié)果婚禮上猎醇,老公的妹妹穿的比我還像新娘。我一直安慰自己边锁,他們只是感情好姑食,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茅坛,像睡著了一般音半。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贡蓖,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天曹鸠,我揣著相機與錄音,去河邊找鬼斥铺。 笑死彻桃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晾蜘。 我是一名探鬼主播邻眷,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剔交!你這毒婦竟也來了肆饶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤岖常,失蹤者是張志新(化名)和其女友劉穎驯镊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竭鞍,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡板惑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了偎快。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冯乘。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晒夹,靈堂內(nèi)的尸體忽然破棺而出往湿,到底是詐尸還是另有隱情,我是刑警寧澤惋戏,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站他膳,受9級特大地震影響响逢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棕孙,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一舔亭、第九天 我趴在偏房一處隱蔽的房頂上張望些膨。 院中可真熱鬧,春花似錦钦铺、人聲如沸订雾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼哎。三九已至,卻和暖如春沼本,著一層夾襖步出監(jiān)牢的瞬間噩峦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工抽兆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留识补,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓辫红,卻偏偏與公主長得像凭涂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贴妻,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351