Python語法速查: 6. 循環與迭代

返回目錄html

 

 (1)while循環與for循環

while僅能用於普通循環,而for除了能夠作循環外,還能夠遍歷序列、集合、字典、迭代器等。python

須要注意的是,在相似:for i in somelist: 的循環中,迭代變量 i 的做用域並不是for語句私有,循環結束後迭代變量依然保留最後一個值。有時候for能夠用於直接迭代對象,以下2個例子所示:app

 

直接迭代字典函數

for key in d:    # 直接對字典進行迭代至關於 for key in d.keys():
    print(key, d[key])

 

直接迭代文件工具

f = open('a.txt')
for line in f:    # 迭代文件對象中的每一行
    print(line)

 

● breakui

可用於跳出while或for循環。break和下面的continue語句僅應用於正在執行的最內層循環,若是要跳出多層嵌套循環結構,可以使用raise()拋出異常。spa

 

● continuecode

結束本循環的當前輪,跳到本循環的下一輪開始。htm

 

● else對象

與while或for循環配對的else代碼段,僅在本循環中沒有調用過break時執行。

for i in range(0,100):
    if i > 100:
        break;
else:
    print('running else.')
    
# 結果爲:running else.

 

 

 

  (2)一些迭代工具

 

● 並行迭代

使用內建zip()函數,它能夠把兩個序列「壓縮」在一塊兒,返回一個元組列表。 當兩個序列長度不等時,以短的那個迭代完就會中止。zip()還支持同時對多個(3個及以上)列表進行迭代。

a = 'abc'
b = [1,2,3]
for x,y in zip(a,b):
    print(x,y)
# 結果每次迭代依次顯示:a 一、b 二、c 3

以上代碼至關於:

for i in range(min(len(a),len(b)):
    print(a[i],b[i])

 

● 編號迭代

使用內建的enumerate()函數,能夠在迭代的同時,同時獲取迭代的次數索引。

a = 'abc'
for i,x in enumerate(a):
    print('i=%d,x=%s' %(i,x)) 
# 結果依次顯示:i=0,x=a、i=1,x=b、i=2,x=c

 

 

 

  (3)列表推導與序列解包

 

● 列表推導(list comprehension)

「列表推導」是利用for循環來快速建立新列表的一種方法。

 

a. 基本用法:

[ x運算表達式 for x in 迭代器 ]

舉例:

[x*2 for x in range(5)]    # 結果生成新序列:[0,2,4,6,8]

 

b. 條件判斷用法:

每次迭代時,只有當「條件表達式」的值爲真時,纔會對x進行運算,並將結果放入新序列。語法以下:

[ x運算表達式 for x in 迭代器 if 條件表達式 ]

舉例:

[x for x in range(10) if x%2]    # 取出range(10)範圍內的全部奇數,結果爲:[1,3,5,7,9]

 

c. 完整用法:

能夠同時使用多個嵌套的for循環並對每一個循環使用if條件表達式,語法以下:

[ i_1,i_2,...,i_n運算表達式 for i_1 in iter1 if 條件表達式1 
                          for i_2 in iter2 if 條件表達式2
                          ...... 
                          for i_n in itern if 條件表達式n ]

以上語法大體至關於以下等價代碼:

s = []
for i_1 in iter1:
    if 條件表達式1:
        for i_2 in iter2:
            if 條件表達式2:
                ......
                for i_n in itern:
                    if 條件表達式n:
                        s.append(i_1,i_2,...,i_n運算表達式)

舉例:

a = 'abc'
b = [1,2,3]
[(i1,i2) for i1 in a 
         for i2 in b if i2 % 2]    
# 結果爲:[('a',1), ('a',3), ('b',1), ('b',3), ('c',1), ('c',3) ]

 

 

 

● 迭代序列解包(sequence unpacking)

當可迭代對象返回元組時,這個特性比較有用。例如須要獲取字典中的鍵-值對時,可以使用序列解包方法:

for k,v in d.items():   # 每次循環同時取出字典中的鍵與值,分別放入k與v中
    print(k,v)

 

 

 

  (4)迭代器

可使一個普通對象也支持迭代操做,此時須要爲這個對象實現__iter__()方法和__next__()方法。

 

● __iter__()方法:

本方法要求返回一個迭代器對象(一般可直接返回對象自身,詳見下例)。

 

● __next__()方法:

__next__()方法由剛纔經過__iter__()方法返回的迭代器對象進行調用,其做用是計算並返回迭代的下一個對象。當迭代器已迭代完全部的內容時,__next__()方法應該引起一個StopIteration異常,以通知外部的調用者結束迭代。

 

如下代碼實現一個相似於 「列表[1,2,3,4,5]」 的迭代器:

class MyIterator:
    v = 0
    def __iter__(self):
        return self
    def __next__(self):
        self.v += 1
        if self.v > 5:
            raise StopIteration
        return self.v

myiter = MyIterator()
for i in myiter:
    print(i)
    
# 運行結果爲,依次顯示:一、二、三、四、5

 

● 迭代的外部原理:

上例中,當運行for語句進行迭代時,等效於運行如下代碼:

_iter = myiter.__iter__()
while 1:
    try:
        i = _iter.__next__()
    except StopIteration:
        break
    print(i)  # 本句即爲 for 循環中用戶本身寫的循環內容

從上面的代碼中能夠看到,迭代是使用__iter__()返回的對象來調用__next__()方法的,因此能夠不必定是self。另外,內置函數iter()能夠從可迭代的對象中得到迭代器,內置函數next()能夠自動訪問可迭代對象的__next__()方法。

所以,上面的第1行和第4行語句可等效爲:

_iter = iter(s)    # 至關於 _iter = myiter.__iter__()
i = next(_iter)    # 至關於 i = _iter.__next__(),甚至直接寫成:i = next(myiter) 也是能夠的

 

● 將迭代和序列互相轉換:

用list()的構造方法能顯式地將迭代器轉換爲列,也能用內置函數iter()將序列轉換爲迭代器。

# ......
# 前面已定義MyIterator類

myiter = MyIterator()
s = list(myiter)
print(s)

# 結果爲:[1,2,3,4,5]

 

 

 

返回目錄

相關文章
相關標籤/搜索