原創文章,歡迎轉載。轉載請註明:轉載自 祥的博客
原文鏈接:https://blog.csdn.net/humanking7/article/details/96965467
Python迭代和對象的可迭代性
Python文檔整理目錄: https://blog.csdn.net/humanking7/article/details/80757533
0. 環境
Python 3.6
1. 基礎概念
1.1. 引言
如果給定一個
list
或tuple
,我們可以通過for
循環來遍歷這個list
或tuple
,這種遍歷我們稱爲迭代(Iteration
)。
在Python
中,迭代是通過for ... in
來完成的,而很多語言比如C語言,迭代是通過下標完成的,eg:
int buf[100] = {...};
for(int i=0; i<100; 1++){
int a = buf[i]
// do something
}
1.2. 可迭代與迭代器的區別
可迭代:
在Python
中如果一個對象有__iter__( )
方法或__getitem__( )
方法,則稱這個對象是可迭代的(Iterable
);其中__iter__( )
方法的作用是讓對象可以用for ... in
循環遍歷,__getitem__( )
方法是讓對象可以通過“實例名[index]
”的方式訪問實例中的元素。換句話說,兩個條件只要滿足一條,就可以說對象是可迭代的。顯然列表List
、元組Tuple
、字典Dictionary
、字符串String
等數據類型都是可迭代的。當然因爲Python
的**“鴨子類型”**,我們自定義的類中只要實現了__iter__( )
方法或__getitem__( )
方法,也是可迭代的。
迭代器:
在Python
中如果一個對象有__iter__( )
方法和__next__( )
方法,則稱這個對象是迭代器(Iterator
);其中__iter__( )
方法是讓對象可以用for ... in
循環遍歷,__next__( )
方法是讓對象可以通過next(實例名)
訪問下一個元素。
注意:這兩個方法必須同時具備,才能稱之爲迭代器。列表List
、元組Tuple
、字典Dictionary
、字符串String
等數據類型雖然是可迭代的,但都不是迭代器,因爲他們都沒有next( )方法
。
2. 應用
2.1. 字典dict的迭代
只要是可迭代對象,無論有無下標,都可以迭代,比如dict
就可以迭代:
In [1]: d = {'a': 1, 'b': 2, 'c': 3}
- 默認情況下,
dict
迭代的是key
。
In [2]: for key in d:
...: print(key)
...:
a
b
c
- 如果要迭代
value
,可以用for value in d.values()
。
In [3]: for value in d.values():
...: print(value)
...:
1
2
3
- 如果要同時迭代
key
和value
,可以用for k, v in d.items()
。
In [4]: for k,v in d.items():
...: print('key:', k, ', value:', v)
...:
key: a , value: 1
key: b , value: 2
key: c , value: 3
注意: 因爲dict
的存儲不是按照list
的方式順序排列,所以迭代出的結果順序很可能不一樣。
2.2. 字符串str的迭代
In [5]: for ch in 'hello':
...: print('char is:%c' % ch)
...:
char is:h
char is:e
char is:l
char is:l
char is:o
3. 判斷對象的可迭代性和獲得獲取迭代索引
3.1. 判斷對象的可迭代性
由1.2節可知,如果對象類中含有__iter__( )
方法或__getitem__( )
方法,則稱這個對象是可迭代的(Iterable
),那麼如何判斷呢?方法是通過collections
模塊的Iterable
類型判斷:
In [7]: from collections import Iterable
In [8]: isinstance('hello', Iterable) # 字符串str可迭代
Out[8]: True
In [9]: isinstance([1, 2, 3], Iterable) # 列表list可迭代
Out[9]: True
In [10]: isinstance({}, Iterable) # 字典dict可迭代
Out[10]: True
In [11]: isinstance(996, Iterable) # 整型int 不可迭代
Out[11]: False
In [12]: isinstance(99.6, Iterable) # float 不可迭代
Out[12]: False
3.2. 迭代的同時獲得迭代索引(下標)
Python
內置的enumerate
函數可以把一個list變成索引-元素對,這樣就可以在for
循環中同時迭代索引
和元素本身
:
eg.1.
# d = {'a': 1, 'b': 2, 'c': 3}
In [15]: for i,key in enumerate(d):
...: print(i,' ',key)
...:
0 a
1 b
2 c
eg.2.
In [16]: for i, ele in enumerate(['a','b','c']):
...: print(i,' ',ele)
...:
0 a
1 b
2 c
eg.3.
In [17]: for i, ele in enumerate('hello'):
...: print(i,' ',ele)
...:
0 h
1 e
2 l
3 l
4 o
4. 參考文獻
廖雪峯Python教程:https://www.liaoxuefeng.com/wiki/1016959663602400/1017316949097888
OK!
以上,Enjoy~
i