6:Python迭代對象與迭代器

可迭代(Iterable)對象

表面是:只要可以用 for…in…進行遍歷的對象就是可迭代對象
實際上:一個對象實現了__iter__方法,那麼這個對象就是可迭代(Iterable)對象。
我們還可以通過調用Python內置函數isinstance()來判斷一個對象是否屬於可迭代(Iterable)對象。

>>> from collections.abc import Iterable
>>> isinstance(['abc',1,8.5],Iterable)
True
>>> isinstance(('abc',1,8.5),Iterable)
True
>>> isinstance({1:'one',2:'two'},Iterable)
True
>>> isinstance({'one','two'},Iterable)
True
>>> isinstance('abcdefg',Iterable)
True
>>> isinstance(range(10),Iterable)
True
>>> isinstance(123,Iterable)
False

迭代器(Iterator)

集合實現了__iter__方法,但並未實現__next__方法,這些對象均不能稱爲迭代器(Iterator)。
 我們還是可以通過調用Python內置函數isinstance()來判斷一個對象是否屬於迭代器(Iterator)。

>>> from collections.abc import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance((),Iterator)
False
>>> isinstance({1:'one',2:'two'},Iterator)
False
>>> isinstance({'one','two'},Iterator)
False
>>> isinstance('abcdefg',Iterator)
False
>>> isinstance(range(10),Iterator)
False
>>> isinstance(123,Iterator)
False

無迭代器獲取迭代器

雖然列表、元組、字符串、字典、集合都是可迭代(Iterable)對象而不是迭代器(Iterator),但可以通過iter()函數獲得一個迭代器(Iterator)。

>>> from collections.abc import Iterator
>>> vehicle=['train','bus','car','ship']
>>> v=iter(vehicle)
>>> type(v)
<class 'list_iterator'>
>>> isinstance(v,Iterator) #是否迭代器(Iterator)
True
>>> v.__next__()
'train'

相關內置函數

1. enumerate()

格式:enumerate(iterable, start=0)
功能:enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合爲一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。第1個參數表示可迭代(Iterable)對象,第2個參數表示下標的開始值,默認從0開始。

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下標從 1 開始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
2. zip()

格式:zip(iter1 [,iter2 […]])
功能:將多個迭代器(Iterator)對象(或者可迭代(Iterable)對象)中的元素壓縮到一起,返回一個zip對象。
同樣通過幫助我們得知zip對象既是一個可迭代(Iterable)對象也是一個迭代器(Iterator)對象。

>>> vehicle=['train','bus','car','ship']
>>> vv1=zip('abcd',vehicle)
>>> list(vv1)
[('a', 'train'), ('b', 'bus'), ('c', 'car'), ('d', 'ship')]
>>> ('b', 'bus') in zip('abcd',vehicle)
True
>>> ('b', 'car') in zip('abcd',vehicle)
False
>>> vv2=zip('abcd',enumerate(vehicle))
>>> list(vv2)
[('a', (0, 'train')), ('b', (1, 'bus')), ('c', (2, 'car')), ('d', (3, 'ship'))]
>>> vv3=zip(range(2),vehicle)             #不同長短,匹配完短的結束
>>> list(vv3)
[(0, 'train'), (1, 'bus')]
>>> list(zip(vehicle))
[('train',), ('bus',), ('car',), ('ship',)]
3. map()

格式:map(func, *iterables)
功能:map() 會根據提供的函數對指定序列做映射。
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。

>>>def square(x) :            # 計算平方數
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   # 計算列表各個元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函數
[1, 4, 9, 16, 25]
 
# 提供了兩個列表,對相同位置的列表數據進行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
4. filter()

格式:filter(function or None, iterable)
功能:filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
該接收兩個參數,第一個爲函數,第二個爲序列,序列的每個元素作爲參數傳遞給函數進行判斷,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。

def is_odd(n):
    return n % 2 == 1
 
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章