python迭代器

迭代器

迭代器:迭代的工具,迭代是更新換代,就像傳宗接代同樣。單純的重複就不算迭代。迭代的每一次結果都是基於上一次結果來的。函數

1、可迭代對象

python中一切皆對象,如工具

# 可迭代(具備__iter__方法)   對象

x = 1  # 不可迭代對象(數字類型爲不可迭代對象)

s = 'nick'  # 可迭代對象
s.__iter__()
lt = [1, 2, 3]  # 可迭代對象
dic = {'a': 1, 'b': 2}  # 可迭代對象
tup = (1,)  # 元組只有一個元素必須得加逗號# 可迭代對象
se = {1, 2, 3}  # 可迭代對象
f = open('time.py')  # 可迭代對象(文件類爲可迭代器對象)


def func():  # 不可迭代對象
    pass

總結:code

有__iter__()方法的對象就是可迭代對象,而後出了數字類型和函數以外都是可迭代對象,經過__next__進行迭代對象

# 迭代器對象: 具備__iter__以及__next__方法的叫作迭代器對象
s = 'nick'  # 可迭代對象,不屬於迭代器對象, 基於索引(基於上一次結果)經過__next__進行迭代
s.__iter__()
lt = [1, 2, 3]  # 可迭代對象,不屬於迭代器對象
dic = {'a': 1, 'b': 2}  # 可迭代對象,不屬於迭代器對象
tup = (1,)  # 元組只有一個元素必須得加逗號# 可迭代對象,不屬於迭代器對象
se = {1, 2, 3}  # 可迭代對象,不屬於迭代器對象
f = open('time.py')  # 可迭代對象,迭代器對象

# 只有文件是迭代器對象

2、可迭代器對象

只有字符串和列表都是依賴索引取值的,而其餘的可迭代對象都是沒法依賴索引取值的。所以咱們得找到一個方法能讓其餘的可迭代對象不依賴索引取值。索引

在找到該方法前,首先咱們給出迭代器對象的概念:可迭代的對象執行__iter__方法獲得的返回值。而且可迭代對象會有一個__next__方法。內存

總結:字符串

迭代器對象:執行可迭代對象的__iter__方法,拿到的返回值就是迭代器對象。it

特色:io

  1. 內置__next__方法,執行該方法會拿到迭代器對象中的一個值
  2. 內置有__iter__方法,執行該方法會拿到迭代器自己
  3. 文件自己就是迭代器對象。

缺點:

  1. 取值麻煩,只能一個一個取,而且只能日後取,值取了就沒了
  2. 沒法使用len()方法獲取長度

3、for循環原理

由於迭代器使用__iter__後仍是迭代器自己,所以for循環不用考慮in後的對象是可迭代對象仍是迭代器對象。

因爲對可迭代對象使用__iter__方法後變成一個迭代器對象,這個迭代器對象只是佔用了一小塊內存空間,他只有使用__next__後纔會吐出一個一個值。如lis = [1,2,3,4,5,...]至關於一個一個雞蛋,而lis = [1,2,3,4,5,...].__iter__至關於一隻老母雞,若是你須要蛋,只須要__next__便可。

lt = [1,2,3]
lt_iter = lt.__iter__()
while 1:
    try:
        print(lt_iter.__next__())
    except StopIteration:
        break
# 1. 首先使用iter把lt變成迭代器對象;對於文件也要使用iter方法吧文件再一次iter下
# 2. 而後使用next方法進行迭代取值
# 3. 判斷StopIteration異常,遇到異常終止
相關文章
相關標籤/搜索