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

  • 2020 年 3 月 10 日
  • 筆記

原創文章

文章目錄

  • @[toc]

  • 0. 環境
  • 1. 基礎概念
    • 1.1. 引言
    • 1.2. 可迭代與迭代器的區別
  • 2. 應用
    • 2.1. 字典dict的迭代
    • 2.2. 字元串str的迭代
  • 3. 判斷對象的可迭代性和獲得獲取迭代索引
    • 3.1. 判斷對象的可迭代性
    • 3.2. 迭代的同時獲得迭代索引(下標)
      • eg.1.
      • eg.2.
      • eg.3.
  • 4. 參考文獻

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~