「N體飯」python零基礎入門系列 9.回圈語句

2020-08-10 09:39:29

「N體飯」Python零基礎入門

作者:許立軒

簡介:

這是一個Python計算機語言由淺入深的教學;
如果您是計算機「小白」, 您可以跟着教學一步一步地瞭解到Python是什麼、能做什麼;
如果您是久經沙場的極客,您也可以從中有所收穫 :)

回圈語句

大綱

視訊地址https://www.bilibili.com/video/BV1LC4y1t7ua/

前言

請用python算出1+2+3的和

>>> 1+2+3
6

so easy

so_what

請再用python算出1+2+3.......+10的和

emm

>>> 1+2+3+4+5+6+7+8+9+10
55

請再用python算出1+2+3.......10000的和

逗我吗

所以這時候,回圈就派上用場了!

在python中,有兩種回圈,它們分別是for回圈與while回圈

for回圈語句

for回圈的格式是for 變數名 in 可迭代物件

在python的基本數據型別中,字串str、列表list、元組tuple、集合set、字典dict這5個皆爲可迭代型別(物件),也就是說,我們可以通過for...in回圈來遍歷其內成員(元素)

# 遍歷字串
for s in 'abc':
    # 字串內的每一個字元'a'、'b'、'c'都會依次賦值給變數s
    print(s)

# 遍歷列表
for i in [1,2,3]:
    # 列表內的成員1、2、3會依次賦值給變數i
    print(i)
    
# 遍歷元組、集合的效果和遍歷列表基本一致,就不舉例了
pass

# 與其它基本數據型別不一樣,遍歷字典時,會把字典的鍵賦值給變數,而不是字典的值
d = {'a':1, 'b':2}
for k in d:
    print(k) # 依次列印a與b
    print(d[k]) # 通過鍵獲取對應的值

# 可以通過字典的values方法,直接遍歷字典的值
for v in d.values():
    print(v) # 依次列印1、2
    
# 可以通過字典的keys方法,遍歷字典的鍵,這裏與直接遍歷字典的效果是一樣的
for k in d.keys():
    print(k) # 依次列印a與b
    
# 可以通過字典的items方法,同時遍歷字典的鍵與值
for k, v in d.items():
    print(k,v) # 先列印a與1,再列印b與2

這裏您可能不理解items那一段是什麼鬼,這裏涉及到python變數解包的知識

# 在<再論變數>一章中,我們學過多個變數的賦值
a, b = 1, 2
print(a, b) # 1 2
# ok, 沒問題

# 在<基本數據型別>那一章中,我們知道1,2這樣會被python直譯器當作是元組
c = 1, 2
print(c) # (1, 2)
print(type(c)) # <class 'tuple'>

# 所以一開始的a,b=1,2等價於
a, b = c
print(a, b) # 1 2

這就叫變數解包,我們知道了多個變數賦值的真相!

想表达什么

通過內建函數list,我們可以將可迭代物件轉化爲列表

d = {'a':1, 'b':2}
e = list(d.items())
print(e) # [('a', 1), ('b', 2)]

# 看到了嗎
# 一個列表裏,每個元素都是一個長度爲2的元組

# 這樣試試
for both in e:
    print(both) # 先列印('a', 1),再列印('b', 2)

# 加上我們的變數解包呢?
for key, value in e:
    print(key,value) 

# ok,現在明白了

for回圈的基友range

內建函數rangefor回圈的好基友,range是Range Rover(路虎)的range,它中文意思是一段範圍,我們可能暫時玩不起Range Rover,但是我們必須得把range給玩溜了,才能 纔能玩好for回圈

range函數有兩種格式,它們都返回一個可迭代物件

range(stop) -> range object
range(start, stop[, step]) -> range object

直接上例子

# 只給一個參數,表示結束位置(不包含),它表示[0~結束位置)這段範圍
print(list(range(3))) # [0, 1, 2]

# 傳入兩個參數,第一個參數表示起始位置(包含),第二個參數表示結束位置(不包含),它表示[起始位置~結束位置)這段範圍
print(list(range(1, 6)) # [1, 2, 3, 4, 5]

# 傳入三個參數,第一、二個參數和上面一樣,第三個表示步長,即每次跨多少步
# 當傳入兩個參數時,步長預設爲1
# 下面 下麪表示範圍從[1~10],步長爲2,所以得到了1到10內所有奇陣列成的列表
print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9]

# 與for回圈配合
for i in range(3):
    print(i) # 依次列印0~2

所以1+2+3.......10000的和,我們可以通過for與range的配合求出

# 一開始將總數設爲0
sum = 0

for num in range(1, 10001):
    # 將1~10000的每個數累加到sum上
    sum = sum + num

print(sum) # 50005000

解放雙手,美滋滋!

我們再通過觀察for回圈的每一步走向來更深一步瞭解它

for_demo

for回圈的又一基友enumerate

內建函數enumerate作用於可迭代物件,比如利用它,可以同時遍歷列表的數據和數據的下標(索引)

函數的格式長這樣

enumerate(iterable, start=0)

直接上例子

a = ['a', 'b', 'c']
for index, data in enumerate(a):
    print(index, data)
    # 順序列印
    # 0 a
    # 1 b
    # 2 c

將列表傳給函數enumerate後,它的返回值和字典的items方法返回值有點像

a = ['a', 'b', 'c']
b = enumerate(a)
# 利用內建函數list將可迭代物件轉爲列表看看
print(list(b)) # [(0, 'a'), (1, 'b'), (2, 'c')]

將enumerate的返回值轉成列表後,可以看出,這是所有元素都是長度爲2元組的列表,其中,元組第一個值爲列表元素的下標,第二個值爲對應的元素

while回圈語句

第二種回圈叫做while,它的格式長下面 下麪這樣

while 條件:
    語句1
    ...
    語句N

當條件滿足時,將不斷回圈執行程式碼塊內容,直至條件不滿足時正常退出回圈

比如同樣計算1+2+3.......10000的和,用while回圈的話,可以這樣

sum = 0
num = 1

while num <= 10000:
    sum = sum + num
    num = num + 1

print(sum) # 50005000

通過動畫來看流程是這樣的

while_demo

主動結束回圈

至今爲止,無論是for回圈還是while回圈,它的結束都是正常結束的,要麼可迭代物件已迭代完畢退出,要麼條件不滿足退出

我們可以通過break語句來主動退出回圈

當while的條件爲真時,將進行下一次回圈,如果while的條件永遠是True的話,就變成了死回圈,像下面 下麪一樣

while True:
    print('你好帥啊')

如果您有耐心,機器將會日夜不停地讚美您,如果您感到厭煩,可以通過按鍵Ctrl+C來終止它

利用break語句,當讚美了兩次後,主動退出回圈

times = 0
while True:
    if times == 2:
        # 當times變數等於2時,break退出回圈
        break
    print('你好帥啊')
    times = times + 1

print('謝謝,但是地球人都知道')

dead_while_break

跳過當前回圈

跳過當前回圈用continue語句,它表示繼續的意思,當在回圈中遇到continue後,其後的語句不會執行,而是繼續下一次回圈

例如,當數位等於2時,不進行列印

for i in range(1, 4):
    if i == 2:
        # 遇到continue後,其後的語句不會執行,而是繼續下一次回圈
        continue
    print(i)

通過動畫來看流程是這樣的

for_continue

鮮爲人知的else尾巴

話說"花心"的else不但可以與if條件語句進行搭配,它還可以與回圈進行搭配,所以我們揭開了兩種回圈的面紗,看到了它們的最終面貌

for回圈

for <variable> in <sequence>:
    <statements>
else:
    <statements>

while回圈

while <expr>:
    <statements>
else:
    <statements>

else下的程式碼塊只會在回圈正常退出時執行,所謂正常退出,是指非break主動退出回圈的情況下,回圈正常結束退出

我們在回圈中通過動畫看兩種回圈結束情況的執行邏輯

1.正常結束回圈

for_else_normal

2.break主動結束回圈

for_else_break

總結

熟練掌握條件判斷語句與回圈語句,將讓您的程式更有邏輯性