Python系列 (6)迭代器、生成器

前言

本人自學了廖雪峯老師編寫的Python教程,將在學習過程中的一些心得、方法 成體系的寫成 本Python系列,所舉的部分例子可能會和廖雪峯老師舉的例子一致,本Python系列僅供大家學習參考,也相當於本人的學習筆記。

一、迭代

1、迭代概念

  • 迭代的定義:後一個元素跟前一個元素有必要關聯,也就是說前一個元素影響着後一個元素,比如把列表或元組用for循環來遍歷,這種遍歷就是迭代。
  • python中可迭代的對象:列表、元組、字典、字符串
  • 只要是可以被for循環遍歷的對象,就是可迭代的對象

2、判斷對象是否是可迭代對象

  • isinstance() 函數可判斷 變量 類型
from collections.abc import Iterable
li = [1,2,'3']
tup = ('a','b')
dic = {1:'first',2:'second'}

print(isinstance(li,Iterable))
print(isinstance('abc',Iterable))
print(isinstance(tup,Iterable))
print(isinstance(dic,Iterable))

3、迭代器

  • 可以被 next() 調用並不斷的返回下一個值的對象 稱爲迭代器(Iterator)
from collections.abc import Iterator
isinstance([],Iterator)
False
isinstance({},Iterator)
False
isinstance('ab',Iterator)
False

可以看到列表、字典、字符串都不是迭代器,但他們是可迭代對象

isinstance((i for i in range(10)),Iterator)
True

可以看到生成器都是迭代器

二、生成器(generator)

1、生成器概念

  • 在python中,一邊循環,一邊計算 的機制,叫做生成器

舉個例子:在python中,我要讀取一個列表,需要創建一個連續的內存空間,用來存儲列表中的所有的元素,在使用生成器的時候,就不需要一開始就讀取整個列表的所有元素,不需要向操作系統申請巨大的連續內存空間來存儲列表中的所有元素,因爲列表中的元素是按照某種算法推算出來的,在循環過程中,不斷的推算後續元素,節約了內存空間

2、創建生成器

方法一:

  • 把生成列表的 [] 換成 () 即可
gen = (i for i in range(10))

方法二:

  • 在函數中,用 yield 語句來定義要打印的變量
def fib(max):
    n,a,b = 1,0,1
    while n <= max:
        yield b
        a,b = b,a+b
        n=n+1
    return 'done'

函數型生成器,每次執行到 yield 語句時會停止,返回 yield 定義的變量,下一次next() 調用時,從 yield 語句的下一個語句開始執行

3、調用生成器

  • 生成器保留的是算法,next() 函數可以調用生成器,每調用一次就計算一次,直到計算到最後一個元素,再計算,拋出StopIteration的錯誤
gen =  (i for i in range(10))
next(gen)
0
next(gen)
1
next(gen)
2
  • 或者用for 循環遍歷
gen =  (i for i in range(10))
for i in gen:
    print(i)
    
0
1
2
3
4
5
6
7
8
9

三、小結

  • 凡是可以被用作 for 循環的對象都是可迭代(Iterable)對象
  • 凡是可以被 next() 函數調用的對象,都是 Iterator 類型,表示一個惰性計算序列
  • 集合數據類型(list,dict,str 等)是可迭代對象,不是迭代器,但是可以通過iter()獲取一個生成器對象
  • for 循環本質上就是不斷地調用 next() 函數實現的
for i in [1,2,3]
    pass
# 等價於
it=iter([1,2,3])        # 先變成 Iterator
while True:             # 循環
     try:
         x=next(it)     # 獲取下一個值
     except StopIteration: 
         break          # 遇到 StopIteration 報錯就退出循環
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章