[Python]迭代和對象的可迭代性


原創文章,歡迎轉載。轉載請註明:轉載自 祥的博客
原文鏈接: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. 引言

如果給定一個listtuple,我們可以通過for循環來遍歷這個listtuple,這種遍歷我們稱爲迭代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}
  1. 默認情況下,dict迭代的是key
In [2]: for key in d:
   ...:     print(key)
   ...:
a
b
c
  1. 如果要迭代value,可以用for value in d.values()
In [3]: for value in d.values():
   ...:     print(value)
   ...:
1
2
3
  1. 如果要同時迭代keyvalue,可以用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~


讚賞碼New

i

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章