💝💝💝歡迎來(lái)到我的博客,很高興能夠在這里和您見(jiàn)面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見(jiàn)解。
推薦:Linux運(yùn)維老紀(jì)的首頁(yè),持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老
導(dǎo)航劍指大廠系列:全面總結(jié) 運(yùn)維核心技術(shù):系統(tǒng)基礎(chǔ)、數(shù)據(jù)庫(kù)、網(wǎng)路技術(shù)、系統(tǒng)安全、自動(dòng)化運(yùn)維、容器技術(shù)、監(jiān)控工具、腳本編程、云服務(wù)等。
常用運(yùn)維工具系列:常用的運(yùn)維開發(fā)工具, zabbix、nagios、docker、k8s、puppet、ansible等
數(shù)據(jù)庫(kù)系列:詳細(xì)總結(jié)了常用數(shù)據(jù)庫(kù) mysql、Redis、MongoDB、oracle 技術(shù)點(diǎn),以及工作中遇到的 mysql 問(wèn)題等
懶人運(yùn)維系列:總結(jié)好用的命令,解放雙手不香嗎?能用一個(gè)命令完成絕不用兩個(gè)操作
數(shù)據(jù)結(jié)構(gòu)與算法系列:總結(jié)數(shù)據(jù)結(jié)構(gòu)和算法,不同類型針對(duì)性訓(xùn)練,提升編程思維,劍指大廠
非常期待和您一起在這個(gè)小小的網(wǎng)絡(luò)世界里共同探索、學(xué)習(xí)和成長(zhǎng)。💝💝💝 ?? 歡迎訂閱本專欄 ??
Python之?條件與循環(huán)
技能目標(biāo)
- 掌握條件語(yǔ)句 if
- 掌握循環(huán)語(yǔ)句 while
- 掌握循環(huán)語(yǔ)句 for
- 掌握循環(huán)控制語(yǔ)句break和continue
在程序的執(zhí)行過(guò)程中,經(jīng)常要使用條件判斷語(yǔ)句決定程序的執(zhí)行流轉(zhuǎn),還要使用循環(huán)語(yǔ)
句進(jìn)行相同代碼的重復(fù)執(zhí)行。它們?cè)谌魏握Z(yǔ)言中都是非常重要的組成部分,熟練掌握才能更
好的控制程序。
2.1 Python 條件判斷
條件判斷語(yǔ)句是指根據(jù)條件表達(dá)式的不同計(jì)算結(jié)果,使程序流轉(zhuǎn)到不同的代碼塊。
Python 中的條件語(yǔ)句是 if 語(yǔ)句和 if else 語(yǔ)句。
2.1.1 if 條件語(yǔ)句
if 語(yǔ)句用于判斷某個(gè)條件是否成立。如果成立,則執(zhí)行語(yǔ)句內(nèi)的程序;否則跳過(guò) if 語(yǔ)句,
執(zhí)行后面的內(nèi)容,語(yǔ)法格式如下。
語(yǔ)法:
if 條件表達(dá)式:
語(yǔ)句塊
語(yǔ)句塊是一組程序語(yǔ)句,Python 的語(yǔ)法中沒(méi)有用 java 等語(yǔ)言中的花括號(hào)表示一組語(yǔ)句,
而是采用空格縮進(jìn)的方式表示一組語(yǔ)句。通常用 4 個(gè)空格表示一組語(yǔ)句,使程序員在編碼
時(shí)減少了代碼的工作量。示例 1 展示了 if 的使用。
示例 1:使用 if 語(yǔ)句判斷輸出相關(guān)信息。
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
money = 100
if money > 99:
#冒號(hào)結(jié)尾
print ('賊有錢')
#縮進(jìn) 4 個(gè)空格
print ('窮瘋了')
#縮進(jìn) 4 個(gè)空格
#輸出結(jié)果
>>>
賊有錢
定義變量 money=100,使用 if 語(yǔ)句時(shí)條件表達(dá)式 money>99 的值是布爾值 True,執(zhí)
行下面的 2 條打印語(yǔ)句,這 2 條打印語(yǔ)句都是前面有 4 個(gè)空格,表示它們是一個(gè)語(yǔ)句塊。
下面通過(guò)一個(gè)比較復(fù)雜的示例,熟悉 if 語(yǔ)句的使用場(chǎng)景。
示例 2:接收學(xué)生的考試成績(jī),使用 if 語(yǔ)句判斷。如果考試成績(jī)大于等于 60 分,輸出“合
格”。
# coding=utf-8
print ('請(qǐng)輸入學(xué)生考試成績(jī)')
score = int(input())
print (score >= 60)
if score >= 60:
#冒號(hào)結(jié)尾
print ('合格')
#4 個(gè)空格縮進(jìn)
#輸出結(jié)果
>>>
請(qǐng)輸入學(xué)生考試成績(jī)
80
True
合格
示例 2 中,通過(guò)變量 score 保存鍵盤輸入的成績(jī) 80。當(dāng) if 語(yǔ)句判斷當(dāng)成績(jī)大于等于 60
時(shí),輸出“合格”。在 Python3 中,input 方法默認(rèn)返回為 str 類型。如果想要輸出 int 類型就
要改變輸出類型為 int。
2.1.2 條件表達(dá)式與關(guān)系運(yùn)算符
使用 if 語(yǔ)句時(shí),后面要用到條件表示式和關(guān)系運(yùn)算符,它們可以經(jīng)過(guò)運(yùn)算得到布爾值。
如前面示例的 score>=60 就是一個(gè)使用關(guān)系運(yùn)算符“>=”的條件表達(dá)式,表示:如果 score
大于等于 60,則表達(dá)式的結(jié)果是 True(真);否則為 False(假)。條件表達(dá)式的語(yǔ)法如下。
語(yǔ)法:
操作數(shù) 關(guān)系運(yùn)算符 操作數(shù)
關(guān)系運(yùn)算符的前后 2 個(gè)數(shù)值,條件表達(dá)式的計(jì)算結(jié)果是布爾值。常用的關(guān)系運(yùn)算符如
表 2-1 所示。
表 2-1 關(guān)系運(yùn)算符 關(guān)系運(yùn)算符 | 說(shuō)明 |
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
示例 3:關(guān)系運(yùn)算符的運(yùn)算結(jié)果。
>>> print (10 == 9)
False
>>> print (10 != 9)
True
>>> print (10 > 9)
True
>>> print (10 < 9)
False
>>> print (10 >= 9)
True
>>> print (10 <= 9)
False
條件表達(dá)式 10==9 是判斷“==”運(yùn)算符左右兩側(cè)的數(shù)值是否相等。因?yàn)?10 不等于 9,所
以,10==9 的運(yùn)行結(jié)果是 False。
條件表達(dá)式 10!=9 是判斷“!=”運(yùn)算符左右兩側(cè)的數(shù)值是否不相等。因?yàn)?10 不等于 9,所
以,10!=9 的運(yùn)行結(jié)果是 True。
其它的幾種也是采用相同的方式進(jìn)行判斷并得到運(yùn)算結(jié)果。
2.1.3 if-else 條件語(yǔ)句
if 語(yǔ)句還可以加上 else 關(guān)鍵字,根據(jù)條件判斷,決定執(zhí)行不同的語(yǔ)句塊。當(dāng)條件為真
時(shí),執(zhí)行語(yǔ)句塊 1。當(dāng)條件為假時(shí),執(zhí)行語(yǔ)句塊 2,語(yǔ)法如下。
語(yǔ)法:
if 條件表達(dá)式:
語(yǔ)句塊 1
else:
語(yǔ)句塊 2
示例 4:接收學(xué)生的考試成績(jī),使用 if 語(yǔ)句判斷。如果考試成績(jī)大于等于 60 分,輸出“合
格”;否則,輸出“需要努力”。
print ('請(qǐng)輸入學(xué)生考試成績(jī)')
score = int(input())
if score >= 60 :
print ('合格')
else:
print ('需要努力')
#輸出結(jié)果
>>>
請(qǐng)輸入學(xué)生考試成績(jī)
80
#執(zhí)行第 1 遍,輸入 80
合格
請(qǐng)輸入學(xué)生考試成績(jī)
50
#執(zhí)行第 2 遍,輸入 50
需要努力
第 1 遍執(zhí)行時(shí),輸入 80,條件為 True,執(zhí)行 print ‘合格’語(yǔ)句;第 2 遍執(zhí)行時(shí),輸入
50,條件為 False,執(zhí)行 print ‘需要努力’。if-else 語(yǔ)句是在根據(jù)條件決定程序需要執(zhí)行的內(nèi)
容時(shí)使用。語(yǔ)法上要注意 if 和 else 后面都是要使用冒號(hào),它們前面的空格縮進(jìn)是相同的,
表示它們是一個(gè)整體,而它們對(duì)應(yīng)的語(yǔ)句塊也是同級(jí)的,整體的代碼看起來(lái)比其它語(yǔ)言更加
簡(jiǎn)潔易懂。
2.1.4 多重 if 語(yǔ)句
使用 if-else 語(yǔ)句通過(guò)條件判斷使程序能夠有 2 條執(zhí)行路徑,但有時(shí)還需要更多條路徑進(jìn)行處理,這時(shí)可以加入 elif 關(guān)鍵字處理。
語(yǔ)法:
if 條件表達(dá)式 1:
語(yǔ)句塊 1
elif 條件表達(dá)式 2:
語(yǔ)句塊 2
elif 條件表達(dá)式 3:
語(yǔ)句塊 3
......
else:
語(yǔ)句塊
當(dāng)條件 1 成立時(shí),執(zhí)行條件 1 對(duì)應(yīng)的語(yǔ)句塊 1。當(dāng)條件 2 或條件 3 成立時(shí),則分別執(zhí)行
對(duì)應(yīng)的語(yǔ)句塊。當(dāng)前面的條件都不成功時(shí),執(zhí)行 else 對(duì)應(yīng)的語(yǔ)句塊。
示例 5:接收學(xué)生的考試成績(jī)。如果考試成績(jī)大于等于 90 分,則輸出“優(yōu)秀”。如果考
試成績(jī)小于 90 分且大于等于 70 分,則輸出“良好”。如果考試成績(jī)小于 70 分且大于等于 60
分,則輸出“合格”。如果考試成績(jī)小于 60 分,則輸出“需要努力”。
print ('請(qǐng)輸入學(xué)生考試成績(jī)')
score = int(input())
if score >= 90:
print ('優(yōu)秀')
elif score >= 70:
print ('良好')
elif score >= 60:
print ('合格')
else:
print ('需要努力')
#輸出結(jié)果
>>>
請(qǐng)輸入學(xué)生考試成績(jī)
100
優(yōu)秀
請(qǐng)輸入學(xué)生考試成績(jī)
80
良好
請(qǐng)輸入學(xué)生考試成績(jī)
60
合格
請(qǐng)輸入學(xué)生考試成績(jī)
50
需要努力
使用鍵盤輸入不同的值,執(zhí)行了不同的語(yǔ)句塊,輸出不同的結(jié)果。if 語(yǔ)句中,else 關(guān)鍵
字是可選項(xiàng),可以有也可以沒(méi)有,需要根據(jù)程序的需要靈活掌握。
2.1.5 if 語(yǔ)句的常見(jiàn)問(wèn)題
在使用 if 語(yǔ)句時(shí),常常會(huì)出現(xiàn)下面一些問(wèn)題。
(1)使用 if-elif-else 語(yǔ)句時(shí),容易出現(xiàn)邏輯錯(cuò)誤。因?yàn)闂l件是由上向下判斷,如果條件
成立,下面的條件判斷將不再執(zhí)行。示例 5 的代碼中,如果把條件表達(dá)式的順序顛倒,比
如把 score>=60 放到 score>=90 之前,那么輸入 100 時(shí),首先判斷的 score>=60 是成立
的,就不會(huì)再執(zhí)行 score>=90 條件表達(dá)式,程序?qū)o(wú)法按要求得到結(jié)果。以下代碼就是邏
輯錯(cuò)誤的典型情況:
score = int(input())
if score >= 60:
print ('合格')
elif score >= 70:
print ('良好')
elif score >= 90:
print ('優(yōu)秀')
(2)if 語(yǔ)句中,語(yǔ)句塊沒(méi)有縮進(jìn)也是容易犯的錯(cuò)誤,如下代碼直接報(bào)錯(cuò):
score = int(input())
if score >= 90:
print ('優(yōu)秀')
#沒(méi)有縮進(jìn)
編寫代碼時(shí),要保證同級(jí)語(yǔ)句縮進(jìn)的空格必須絕對(duì)一致。即使只有一個(gè)空格的差別,它
們已經(jīng)表示不同的語(yǔ)句塊了。如下代碼所示:
score = int(input())
if score >= 90:
print ('優(yōu)秀 1')
#沒(méi)有縮進(jìn)
print ('優(yōu)秀 2')
#多了一個(gè)空格
第 2 條輸出語(yǔ)句比第 1 條多了 1 個(gè)空格,執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。
(3)從其它程序設(shè)計(jì)語(yǔ)言轉(zhuǎn)為 Python 的程序員,由于習(xí)慣經(jīng)常會(huì)忘記表達(dá)式后面的冒
號(hào),需要多練習(xí)熟悉語(yǔ)法。
2.2 Python 的循環(huán)
編寫程序時(shí)經(jīng)常有一些代碼塊需要重復(fù)運(yùn)行,Python 提供了 while 和 for 語(yǔ)句實(shí)現(xiàn)循環(huán)
操作。
2.2.1 while 循環(huán)
下面講解 while 語(yǔ)句的語(yǔ)法和使用,在理解 while 語(yǔ)句的基礎(chǔ)上,會(huì)介紹 Python 字符
串的格式化輸出和注釋。
1. while 循環(huán)語(yǔ)句
while 循環(huán)可以根據(jù)條件表達(dá)式的判斷結(jié)果,決定是否要重復(fù)執(zhí)行語(yǔ)句塊,語(yǔ)法如下。
語(yǔ)法:
while 條件表達(dá)式:
循環(huán)操作語(yǔ)句
循環(huán)的條件表達(dá)式后面也要使用冒號(hào),然后縮進(jìn)寫循環(huán)操作語(yǔ)句。while 語(yǔ)句是先判斷
后執(zhí)行。即:先判斷條件表達(dá)式是否成立,如果條件表達(dá)式的值為 True,則執(zhí)行循環(huán)操作
語(yǔ)句。如果其值為 False,則跳出循環(huán),執(zhí)行 while 語(yǔ)句后面的語(yǔ)句。第 9 頁(yè) 共 24 頁(yè)
示例 6:當(dāng) count 值小于正整數(shù) 5 時(shí),執(zhí)行加 1 操作。當(dāng) count 大于等于 5 時(shí),輸出
count 的值。
count = 0
while (count < 5):
count = count + 1
print (count)
#輸出結(jié)果
>>>
5
變量 count 初始值是 0,當(dāng) count<5 時(shí),循環(huán)執(zhí)行 count=count+1 語(yǔ)句。如第 1 輪循
環(huán)執(zhí)行時(shí),首先判斷條件表達(dá)式 0<5,得到結(jié)果為 True。因?yàn)闂l件表達(dá)式 0<5 成立,則執(zhí)
行 count=count+1 語(yǔ)句,count 值變?yōu)?1。此時(shí)示例 6 的 while 循環(huán)中沒(méi)有其它語(yǔ)句同級(jí),
則進(jìn)入 while 語(yǔ)句第 2 輪循環(huán)。仍然是先判斷條件表達(dá)式 1<5,條件依然成立,則重新再執(zhí)
行 count=count+1,count 值變?yōu)?2。依此類推,當(dāng) count 等于 4 的時(shí)候,4<5 成立,執(zhí)行
count=count+1 語(yǔ)句,count 變?yōu)?5。在進(jìn)入第 6 輪循環(huán)之前,判斷條件表達(dá)式 5<5 為 False,
退出 while 循環(huán),最后的輸出結(jié)果是 5。
下面再來(lái)看一個(gè)復(fù)雜的示例,加深對(duì) while 循環(huán)的理解。
示例 7:輸入 5 門課程的考試成績(jī),計(jì)算平均分并輸出。
i= 1
sum = 0
while i <= 5:
#循環(huán)條件
print ('請(qǐng)輸入第%d 門課程的考試成績(jī)' % i)
#格式化,后面介紹
sum = sum + int(input())
#循環(huán)操作
i = i + 1
avg = sum / ( i - 1 )
print ('5 門課程的平均成績(jī)是%d' % avg)
#格式化,后面介紹
#輸出結(jié)果
>>>
請(qǐng)輸入第 1 門課程的考試成績(jī)
77
請(qǐng)輸入第 2 門課程的考試成績(jī)
請(qǐng)輸入第 3 門課程的考試成績(jī)
88
請(qǐng)輸入第 4 門課程的考試成績(jī)
56
請(qǐng)輸入第 5 門課程的考試成績(jī)
55
5 門課程的平均成績(jī)是 66
示例 7 中,用于控制循環(huán)的變量 i 初始值為 1,while 條件表達(dá)式是 i <= 5,循環(huán)語(yǔ)句塊
中 i = i + 1,說(shuō)明循環(huán)語(yǔ)句塊可以執(zhí)行 5 次。其中 print ('請(qǐng)輸入第%d 門課程的考試成績(jī)' %
i)語(yǔ)句使用了格式化輸出的形式,后面會(huì)介紹到。
2. 字符串的格式化輸出
示例 7 中有 2 處使用了字符串的格式化輸出,代碼如下:
print ('請(qǐng)輸入第%d 門課程的考試成績(jī)' % i)
print ('5 門課程的平均成績(jī)是%d' % avg)
字符串的格式化是將若干值插入帶有“%”替代符的字符串中,從而可以動(dòng)態(tài)地輸出字符
串。字符串中的”%d”,表示插入的是一個(gè)整型數(shù)據(jù),字符串后面的“% i”表示獲取變量 i 的值。
字符串格式化中可以使用的替代符除了“%d”外,還有其他的替代符,如表 2-2 所示。
表 2-2 常用的替代符
替代符 | 描述 |
%d | 格式化整型 |
%s | 格式化字符串 |
%f | 格式化浮點(diǎn)數(shù)字格式化浮點(diǎn)數(shù)字 |
示例 8:常用替代符的使用情況。
num = 5
numStr = "5"
numF = 5.55
print ("第%d 名" % num)
print ("第%s 名" % numStr)
print ("浮點(diǎn)數(shù)是:%f" % numF)#輸出結(jié)果
>>>
第 5 名
第 5 名
符數(shù)是:5.550000
字符串中使用對(duì)應(yīng)的替代符,把相應(yīng)的變量插入到了相應(yīng)的位置。
字符串中還可以使用多個(gè)替代符,對(duì)應(yīng)的變量使用元組即可,示例代碼如下。
first = 1
second = 2
print ("第%d 名和第%d 名" % (first, second))
#輸出結(jié)果
>>>
第 1 名和第 2 名
使用時(shí)要注意替代符和變量的順序,位置不能放錯(cuò);否則可能會(huì)出現(xiàn)類型不匹配的問(wèn)
題。
還可以使用字典格式化多個(gè)值,示例代碼如下:
num = {"first":1, "second":2}
print ("第%(first)d 名和第%(second)d 名" % num)
#輸出結(jié)果
>>>
第 1 名和第 2 名
因?yàn)樽值涫菬o(wú)序的,所以使用字典時(shí)通過(guò)鍵獲得與之對(duì)應(yīng)的值。
3. Python 的注釋
對(duì)于編寫好的代碼,經(jīng)過(guò)一段時(shí)間之后,有可能會(huì)忘記代碼的具體作用,所以代碼中
要寫一些注釋文字,以便于日后閱讀和修改代碼。Python 中使用“#”開頭表示注釋,可以在
代碼中添加注釋。
示例 9:添加了注釋的 Python 代碼
# 輸入 5 門課程的考試成績(jī),計(jì)算平均成績(jī)
i= 1
# 初始化循環(huán)計(jì)數(shù)器 i
sum = 0
# 初始化總成績(jī)變量 sum
while i <= 5:
# 重復(fù)執(zhí)行 5 次接收考試成績(jī),求和的操作
print ('請(qǐng)輸入第%d 門課程的考試成績(jī)' % i)
sum = sum + int(input())
# 每門課程計(jì)入總成績(jī)
i = i + 1
# 計(jì)數(shù)器 i 增加 1
avg = sum / ( i - 1 )
# 計(jì)算平均成績(jī)
print ('5 門課程的平均成績(jī)是%d' % avg)
# 輸出平均成績(jī)
對(duì)于“#+空格”開頭的文字,Python 解釋器不會(huì)做任何處理。而代碼中的注釋,可以提
高代碼的可讀性。
Python 注釋有兩種用法。一是,在行開頭就使用“#”的稱為單行注釋;二是,緊隨同行
代碼,以“#”開頭的稱為行內(nèi)注釋。注釋并不是在每一行都需要,只需要把不易讀的代碼做
注釋即可。
4. while 循環(huán)嵌套
在 while 語(yǔ)句中,可以包含另一個(gè) while 語(yǔ)句,即:使用 while 語(yǔ)句可以實(shí)現(xiàn)嵌套循環(huán)。
示例 10:使用 while 語(yǔ)句分別接收 2 名學(xué)生的 5 門課程考試成績(jī),計(jì)算并輸出每個(gè)人
的平均成績(jī)。
j = 1
#初始化外層循環(huán)計(jì)數(shù)器 j
prompt = '請(qǐng)輸入學(xué)生姓名:'
while j <= 2:
#外層循環(huán)
sum = 0
#每個(gè)人的總成績(jī)清零
i = 1
#初始化內(nèi)層循環(huán)計(jì)數(shù)器 i
name = input(prompt)
while i <= 5:
#內(nèi)層循環(huán)
print ('請(qǐng)輸入第%d 門課程的考試成績(jī)' % i)
sum = sum + int(input())
i = i + 1
avg = sum / ( i - 1 )
print ('%s 的 5 門課程的平均成績(jī)是:%d' % (name,avg))
j = j+1print ('學(xué)生成績(jī)輸入完成')
示例 10 代碼中,外層的 while 語(yǔ)句用于輸入學(xué)生名字,用變量 j 控制循環(huán)次數(shù),共 2
次。內(nèi)層的 while 語(yǔ)句用于輸入 5 門成績(jī),用變量 i 控制。也就是在外層循環(huán)輸入一個(gè)名字
后,需要輸入 5 門成績(jī),然后輸出這名學(xué)生的成績(jī)平均值,一共可以輸入 2 名學(xué)生。
示例 10 中,Python 的代碼結(jié)構(gòu)非常清晰,當(dāng)?shù)?3 行外層循環(huán)執(zhí)行時(shí),從第 4 行到 13
行是一個(gè)整體執(zhí)行。當(dāng)?shù)?7 行內(nèi)層循環(huán)執(zhí)行時(shí),第 8 行到 10 行是一個(gè)整體執(zhí)行,這種在循
環(huán)中還有循環(huán)的結(jié)構(gòu)稱為嵌套循環(huán)。嵌套循環(huán)是編寫程序時(shí)經(jīng)常使用的結(jié)構(gòu),嵌套可以有更
多層,但一般不會(huì)使用超過(guò)三層的嵌套。
注意:第 4 行的代碼 sum = 0 放在了外層循環(huán)里,是因?yàn)槊看屋斎胍粋€(gè)人的 5 門成績(jī)
后,sum 需要進(jìn)行清零處理。如果不這樣做,sum 的值就會(huì)保存,程序就無(wú)法達(dá)到預(yù)期的
目的。
2.2.2 for 循環(huán)
for 語(yǔ)句是另一種用于控制循環(huán)結(jié)構(gòu)的方式。Python 的 while 是使用條件判斷執(zhí)行循環(huán),
而 for 是使用遍歷元素的方式進(jìn)行循環(huán)。
1.for 循環(huán)的幾種方式
for 循環(huán)的語(yǔ)法結(jié)構(gòu)如下。
語(yǔ)法:
for 變量 in 集合:
語(yǔ)句塊
Python 的 for 語(yǔ)句有以下幾種使用方式。
(1)for 循環(huán)可以對(duì)字符串進(jìn)行遍歷,逐個(gè)獲得字符串的每個(gè)字符,示例代碼如下:
for letter in 'Python':
print ('Current letter:%s' % letter)
#輸出結(jié)果
>>>
Current letter:P
Current letter:y
Current letter:t
Current letter:h
Current letter:o
Current letter:n
語(yǔ)句“for letter in 'Python':”的作用是對(duì)’Python’字符串的字符逐個(gè)遍歷,把字符賦值給
變量 letter,然后執(zhí)行 for 對(duì)應(yīng)的語(yǔ)句塊。如第一輪執(zhí)行 for 語(yǔ)句時(shí),letter 的值是“P”,執(zhí)行
輸出語(yǔ)句。然后返回第二輪執(zhí)行 for 語(yǔ)句,letter 的值是“y”。依此類推,當(dāng)執(zhí)行完最后一個(gè)
字符“n”的語(yǔ)句塊后,for 循環(huán)已經(jīng)沒(méi)有字符再可以獲得,循環(huán)退出。
(2)for 循環(huán)可以對(duì)列表和元組進(jìn)行遍歷,示例代碼如下:
fruits = ["西瓜","蘋果","葡萄"]
for fruit in fruits:
print (fruit)
#輸出結(jié)果
>>>
西瓜
蘋果
葡萄
語(yǔ)句“for fruit in fruits:”的作用是遍歷列表 fruits 中的元素,把元素賦值給 fruit,輸出語(yǔ)
句每次輸出一個(gè)水果。
(3)需要循環(huán)操作相同的內(nèi)容時(shí),可以用 for 循環(huán)和 range()函數(shù)結(jié)合使用,先看看range()
函數(shù)的作用,示例代碼如下:
print (list(range(0,5)))
print (list(range(0,5,2)))
#輸出結(jié)果
>>>
[0, 1, 2, 3, 4]
[0, 2, 4]
在 Python3 版本中,range() 函數(shù)返回的是一個(gè)可迭代對(duì)象(類型是對(duì)象),而不是列表
類型,所以打印的時(shí)候不會(huì)打印列表。list() 函數(shù)是對(duì)象迭代器,把對(duì)象轉(zhuǎn)為一個(gè)列表。返
回的變量類型為列表,Range(0,5)輸出由第一個(gè)參數(shù) 0 開始,默認(rèn)每次加 1,當(dāng)大于等于第
二個(gè)參數(shù)值時(shí)結(jié)束,所以列表中不包括第二個(gè)參數(shù)值。而 Range(0,5,2)語(yǔ)句中多了第三個(gè)
參數(shù) 2,其作用是每次加 2,最后的列表值是“[0,2,4]”。所以 range()函數(shù)的作用是創(chuàng)建一個(gè)
迭代對(duì)象,取值范圍是從起始數(shù)字開始到結(jié)束數(shù)字之前的內(nèi)容。
for 語(yǔ)句可以對(duì)列表進(jìn)行遍歷,所以,它可以對(duì) range()函數(shù)的結(jié)果進(jìn)行遍歷。
示例代碼如下:
for i in range(0,5):
print ('北京歡迎您')
#輸出結(jié)果
>>>
北京歡迎您
北京歡迎您
北京歡迎您
北京歡迎您
北京歡迎您
range(0,5)是由 0-4 組成的列表,循環(huán)共執(zhí)行了 5 遍,輸出語(yǔ)句執(zhí)行了 5 遍,變量 i 的
值就是每次遍歷列表的元素值。
2.for 循環(huán)示例
示例 11:接收某個(gè)學(xué)生三門課程的考試成績(jī),計(jì)算輸出平均成績(jī)。
subjects = ('Python', 'MySQL', 'Linux')
sum = 0
for i in subjects:
print ('請(qǐng)輸入 %s 考試成績(jī):'% i)
score = int(input())
sum +=score
# 與 sum = sum+score 等價(jià)
avg = sum / len(subjects)
print ('小明的平均成績(jī)是 %d ' % avg)
#輸出結(jié)果
>>>
請(qǐng)輸入 Python 考試成績(jī):
11
請(qǐng)輸入 MySQL 考試成績(jī):
請(qǐng)輸入 Linux 考試成績(jī):
33
小明的平均成績(jī)是 22
示例 11 中,subjects 列表保存三門課程的名稱,使用 for 循環(huán)遍歷課程列表 subjects,
接收考試成績(jī)后使用變量 sum 累加,最后計(jì)算并輸出平均成績(jī)。
3.邏輯運(yùn)算符
任何語(yǔ)言中都有邏輯表達(dá)式,它是用邏輯運(yùn)算符和變量連接起來(lái)的表達(dá)式。表 2-3 是
Python 的邏輯運(yùn)算符。
表 2-3 邏輯運(yùn)算符
運(yùn)算符 | 名稱 | 描述 |
and | 邏輯與 | 如果兩個(gè)操作數(shù)都為 True,則表達(dá)式值為 True |
or | 邏輯或 | 如果兩個(gè)操作數(shù)中有一個(gè)為 True,則表達(dá)式值為 True |
not | 邏輯非 | 求反運(yùn)算,如果操作數(shù)值為 True,則表達(dá)式值為 False,如果操作數(shù)值為 False,則表達(dá)式值為 True |
下面演示邏輯運(yùn)算符的使用方法:
>>> print (not True)
False
>>> print (True and False)
False
>>> print (True or False)
True
? not 是求反運(yùn)算,所以 not True 的結(jié)果是 False;
? and 是與運(yùn)算,只要有一個(gè)值是 False,結(jié)果就是 False,所以(True and False)的結(jié)果
是 False;
? or 是或運(yùn)算,只要有一個(gè)值是 True,結(jié)果就是 True,所以(True or False)的結(jié)果是 True。
下面對(duì)成績(jī)做一個(gè)有效性的判斷,示例代碼如下:
>>> score =180
>>> if(score<0 or score >100):
print ('成績(jī)錯(cuò)誤,不能小于 0 或大于 100')
成績(jī)錯(cuò)誤,不能小于 0 或大于 100
>>> if(not (score>=0 and score <=100)):
print ('成績(jī)錯(cuò)誤,不能小于 0 或大于 100')
成績(jī)錯(cuò)誤,不能小于 0 或大于 100
代碼中,定義成績(jī)變量 score 值是 180,使用了 2 種邏輯表達(dá)式進(jìn)行判斷。第 1 種是使
用 if(score<0 or score >100),作用是判斷 score 小于 0 或者是大于 100 時(shí)條件成立。因?yàn)?
180 大于 100,所以程序會(huì)輸出錯(cuò)誤提示。第 2 種是使用 if(not (score>=0 and score <=100)),
同時(shí)使用 not 和 and 進(jìn)行的運(yùn)算。首先,計(jì)算(score>=0 and score <=100),判斷 score 值
是否在 1 到 100 之間。因?yàn)?score 值是 180,所以該表達(dá)式的結(jié)果是 False,再用 not 運(yùn)算
符對(duì)它進(jìn)行取反運(yùn)算,最終得到的結(jié)果是 True。此時(shí),if 語(yǔ)句的條件表達(dá)式成立,執(zhí)行輸出
語(yǔ)句。這 2 種方式的作用是相同的,但第 1 種方式更容易理解,實(shí)際編寫代碼時(shí)要根據(jù)情
況,選擇容易理解的方式。
4.for 循環(huán)嵌套
與 while 循環(huán)一樣,for 語(yǔ)句也可以使用嵌套的方式。
示例 12:使用 for 語(yǔ)句分別接收 2 名學(xué)生的 5 門課程考試成績(jī),計(jì)算并輸出每個(gè)人的
平均成績(jī)。
students =['小明','小張']
subjects = ('Python','MySQL','Linux')
for student in students:
#外層循環(huán)
sum = 0
for subject in subjects:
#內(nèi)層循環(huán)
print ('請(qǐng)輸入 %s 的 %s 考試成績(jī):'%(student,subject))
score = int(input())
sum +=score
avg = sum / len(subjects)
print ('%s 的平均成績(jī)是 %d ' %(student,avg))
#輸出結(jié)果
>>>
請(qǐng)輸入 小明 的 Python 考試成績(jī):
11
請(qǐng)輸入 小明 的 MySQL 考試成績(jī):
22
請(qǐng)輸入 小明 的 Linux 考試成績(jī):
33
小明的平均成績(jī)是 22
請(qǐng)輸入 小張 的 Python 考試成績(jī):
33
請(qǐng)輸入 小張 的 MySQL 考試成績(jī):
44
請(qǐng)輸入 小張 的 Linux 考試成績(jī):
55
小張的平均成績(jī)是 44
與 while 的方式基本相同,示例 12 代碼的外層循環(huán)用于控制對(duì)學(xué)生進(jìn)行遍歷,內(nèi)層循
環(huán)控制對(duì)課程遍歷。需要注意:for 語(yǔ)句的變量名沒(méi)有使用 i、j 這樣沒(méi)有意義的變量,而是
使用了 student、subject 這種見(jiàn)名知意的變量名,使程序的可讀性更強(qiáng),避免了引用變量時(shí)
出現(xiàn)引用錯(cuò)誤的情況。
2.2.3 循環(huán)控制
使用 while 和 for 語(yǔ)句執(zhí)行循環(huán)操作時(shí),有可能需要改變循環(huán)的正常執(zhí)行順序,這時(shí)就
需要用循環(huán)控制語(yǔ)句實(shí)現(xiàn),循環(huán)控制語(yǔ)句有 break 和 continue。
1.break 語(yǔ)句
在循環(huán)語(yǔ)句塊中使用 break 語(yǔ)句,可以跳出整個(gè)循環(huán)。
示例 13:對(duì)輸出平均成績(jī)的代碼進(jìn)行修改,當(dāng)成績(jī)無(wú)效時(shí),使用 break 退出循環(huán)。
students =['小明','小張']
subjects = ('Python','MySQL','Linux')
for student in students:
#外層循環(huán)
sum = 0
for subject in subjects:
#內(nèi)層循環(huán)
print ('請(qǐng)輸入 %s 的 %s 考試成績(jī):' % (student,subject))
score = int(input())
if(score < 0 or score > 100):
print ('輸入的成績(jī)需要大于 0 或小 100,循環(huán)退出')
break;
#break 退出內(nèi)層循環(huán)
sum += score
avg = sum / len(subjects)
print ('%s 的平均成績(jī)是 %d ' % (student,avg))
#輸出結(jié)果
>>>
請(qǐng)輸入 小明 的 Python 考試成績(jī):
111
輸入的成績(jī)需要大于 0 或小 100,循環(huán)退出
小明的平均成績(jī)是 0
請(qǐng)輸入 小張 的 Python 考試成績(jī):
示例 13 中的大部分代碼是前面示例的代碼,只是在第 8-10 行加入了對(duì)成績(jī)有效性的
判斷。如果不符合條件,則退出循環(huán)。當(dāng)輸入 111 時(shí),條件表達(dá)式 score<0 or score>100
的值為 True,程序執(zhí)行 8-10 行,break 退出 for 循環(huán)。
break 只和一個(gè) for 循環(huán)對(duì)應(yīng),雖然有 2 層循環(huán),但它只會(huì)結(jié)束離它最近的循環(huán),這里
就是第 2 層 for 循環(huán)。第 2 層循環(huán)結(jié)束后,接著執(zhí)行后面的第 12 行和 13 行代碼,第 1 層
的循環(huán)照常遍歷執(zhí)行,開始輸入第 2 個(gè)學(xué)生“小張”的成績(jī)。
2.continue 語(yǔ)句
continue 的作用和 break 不同,它不是結(jié)束整個(gè)循環(huán),而是跳過(guò)當(dāng)前一輪循環(huán)體的剩
余語(yǔ)句,重新測(cè)試循環(huán)狀態(tài),準(zhǔn)備進(jìn)入下一輪循環(huán)。
示例 14:分別接收 2 個(gè)學(xué)生 3 門課程('Python','MySQL','Linux')的考試成績(jī),要求成績(jī)
的取值范圍是大于等于 0 且小于等于 100;計(jì)算并輸出每個(gè)學(xué)生的平均成績(jī),示例 14 代碼
如下。
students =['小明','小張']
subjects = ('Python','MySQL','Linux')
for student in students:
#第 1 層 for 循環(huán)
sum = 0
i = 0
while(i < len(subjects)):
#第 2 層 while 循環(huán)
print ('請(qǐng)輸入 %s 的 %s 考試成績(jī):' % (student,subjects[i]))
score = int(input())
if(score < 0 or score > 100):
print ('輸入的成績(jī)需要大于 0 且小于 100,重新輸入')
continue
#跳到下一輪循環(huán)
sum += scorei = i + 1
avg = sum / len(subjects)
print ('%s 的平均成績(jī)是 %d ' % (student,avg))
#輸出結(jié)果
>>>
請(qǐng)輸入 小明 的 Python 考試成績(jī):
11
請(qǐng)輸入 小明 的 MySQL 考試成績(jī):
111
輸入的成績(jī)需要大于 0 或小 100,重新輸入
請(qǐng)輸入 小明 的 MySQL 考試成績(jī):
22
請(qǐng)輸入 小明 的 Linux 考試成績(jī):
33
小明的平均成績(jī)是 22
請(qǐng)輸入 小張 的 Python 考試成績(jī):
第 1 層使用的是 for 循環(huán)遍歷學(xué)生,第 2 層使用 while 循環(huán)遍歷成績(jī),使用 continue 是
跳到離它最近的循環(huán)的下一輪,也就是第 2 層的 while 循環(huán)的下一輪。因?yàn)閳?zhí)行 continue
后,第 13 行的 i= i+1 沒(méi)有執(zhí)行,而是重新又執(zhí)行第 6 行的 while 循環(huán),所以就是對(duì)當(dāng)前課
程的成績(jī)重新輸入。當(dāng)輸入 MySQL 的成績(jī)?yōu)?111 時(shí),提示數(shù)據(jù)有誤,然后又提示需要重新
輸入 MySQL 成績(jī),代碼更加健壯。
2.2.4 循環(huán)綜合案例
下面通過(guò) Python 語(yǔ)言實(shí)現(xiàn)用戶登錄示例,介紹循環(huán)語(yǔ)句在編程中的重要性。
1.需求描述
本案例的需求如下:
(1)顯示操作的菜單,有 3 個(gè)選項(xiàng),分別用字母 N、E、Q 表示。
(2)N 表示輸入新的用戶名和密碼。
(3)E 表示使用用戶名和密碼登錄。
(4)Q 表示退出程序。
2.編寫功能
整體代碼較多,為了演示清楚,采用分步完成功能的方式。
(1)首先輸出菜單,輸入字母 N、E、Q 后執(zhí)行相應(yīng)代碼塊,代碼如下:
kgc ={}
#字典,用于保存用戶名和密碼
1 prompt = '''
(N)ew User Login
(E)ntering User Login
(Q)uit
Enter choice:'''
2 while True:
#整體的循環(huán)制,只有輸入 q 時(shí)程序退出
3
choice = input(prompt).strip()[0].lower()
print ('\n--You picked : [%s]' % choice)
4
if choice not in 'neq':
print ('--invalid option,try again--')
else:
5
if choice=='n':
print ('input n')
elif choice=='e':
print ('input e')
else :
print ('quit')
6
break
變量 prompt 是顯示菜單的內(nèi)容,位置 3 的語(yǔ)句“input(prompt).strip()[0].lower()”的作用
是接收鍵盤輸入的字符串,使用 strip()函數(shù)去掉字符串前后的空格,然后獲取輸入字符串的
第一個(gè)非空的字符。函數(shù) lower()的作用是把字符變成小寫字母,為后面的條件判斷作準(zhǔn)備。
位置 2 的 while True 表示后面的語(yǔ)句塊會(huì)不停的重復(fù)執(zhí)行。只有當(dāng)用戶輸入字母“q”時(shí),
才會(huì)執(zhí)行位置 6 的 break 語(yǔ)句,退出 while 循環(huán)。
位置 4 是判斷用戶輸入的字符是不是“n”、“e”、“q”。如果不是這三個(gè)字母,則程序輸出
'--invalid option,try again--',重新返回位置 2 的代碼,再次執(zhí)行 while 循環(huán)。如果是“n”、“e”、
“q”中的任一個(gè)字母,則程序轉(zhuǎn)向執(zhí)行位置 5 的代碼,進(jìn)入條件表達(dá)式的判斷,并根據(jù)條件
表達(dá)式的結(jié)果執(zhí)行對(duì)應(yīng)的功能。
(2)在上面代碼的基礎(chǔ)上編寫 n 對(duì)應(yīng)的功能,代碼如下:
#省略前面的代碼
if choice=='n':
prompt1 = 'login desired:'
1
while True:
name = raw_input(prompt1)
2
if name in kgc:
prompt1 ='--name taken,try another:'
3
continue
else:
4
break
pwd = input('password:')
kgc[name] = pwd
elif choice=='e':
#省略
當(dāng)輸入 n 時(shí)進(jìn)行到代碼塊,位置 1 使用 while True 不停循環(huán),位置 2 用于判斷字典 kgc
中是不是已經(jīng)存在了用戶名,如果存在則執(zhí)行位置 3 的 continue 語(yǔ)句繼續(xù)下次循環(huán),讓用
戶重新輸入用戶名;不存在則執(zhí)行位置 4 的 break 語(yǔ)句,退出 while 循環(huán)。然后再輸入對(duì)應(yīng)
的密碼,把用戶名和密碼保存到字典中。
(3)字符 e 對(duì)應(yīng)的功能是登錄,代碼如下:
#省略前面的代碼
elif choice=='e':
name = input('login:')
pwd = input('password:')
1
password = kgc.get(name)
2
if password == pwd:
print ('--welcome back--',name)
else:
print ('--login incorrect--')
else :
print ('quit')
break
#省略
進(jìn)入字符 e 對(duì)應(yīng)的功能輸入用戶名 name 和密碼 pwd 后,在位置 1 處通過(guò)輸入的用戶
名在字典 kgc 中查找對(duì)應(yīng)的密碼 password。位置 2 用于判斷字典中的密碼和用戶輸入的密
碼是否相同,如果相同,輸出歡迎文字;如果不同,輸出登錄失敗的文字。
(4)通過(guò)上面的步驟可以清楚的理解整個(gè)程序的執(zhí)行流程,整體的代碼如下:kgc = {}
prompt = '''
(N)ew User Login
(E)ntering User Login
(Q)uit
Enter choice:'''
while True:
choice = input(prompt).strip()[0].lower()
print ('\n--You picked : [%s]' % choice)
if choice not in 'neq':
print ('--invalid option,try again--')
else:
if choice=='n':
prompt1 = 'login desired:'
while True:
name = input(prompt1)
if name in kgc:
prompt1 ='--name taken,try another:'
continue
else:
break
pwd = input('password:')
kgc[name] = pwd
elif choice=='e':
name = input('login:')
pwd = input('password:')
password = kgc.get(name)
if password == pwd:
print ('--welcome back--',name)
else:
print ('--login incorrect--')
else :
print ('quit')
break
#輸出結(jié)果
>>>
(N)ew User Login
(E)ntering User Login
(Q)uit
Enter choice:n
--You picked : [n]
login desired:marry
password:111
(N)ew User Login
(E)ntering User Login
(Q)uit
Enter choice:e
--You picked : [e]
login:marry
password:111
--welcome back-- marry
(N)ew User Login
(E)ntering User Login
(Q)uit
Enter choice:q
--You picked : [q]
quit
執(zhí)行程序時(shí)輸入 n 選擇,輸入新用戶 marry 和密碼 111;再輸入 e,使用用戶名 marry
和密碼 111 登錄,顯示的是“--welcome back—marry”;最后輸入 q 時(shí)程序退出,說(shuō)明程序
是執(zhí)行成功的。其它流程同學(xué)們也可以自行嘗試,理解程序的控制方式。