Python迭代器與生成器
列表生成式
列表生成式也叫做列表推導式,它本身還是列表,只不過它是根據我們定義的規則來生成一個真實的列表。
list2 = [x for x in range(10)] print(list2)
下面是一個復雜的列子:
list1 = [x * y for x in range(1, 5) if x > 2 for y in range(1, 4) if y < 3] # 上面的列表生成式等同于下面的代碼 list4 = [] for x in range(1, 5): if x > 2: for y in range(1, 4): if y < 3: list4.append(x * y)
生成器
如果要創建一個100萬個元素的列表,你使用上面的方式無疑非常占用內存,這時候就用到了生成器,它其實是保存一個你定義的規則,在需要用到元素的時候按照規則去生成一個,而不是保存好一大堆元素,這樣就減少內存占用。不過生成器的元素只能順序依次獲取不能像真正列表那樣可以按位置獲取而且不能回退。
創建一個生成器,生成器保存的是一個算法,而不是具體的內容。可以看到和列表生成式的區別是就是把[]換成(),generator = (x for x in range(10))。
其實生成器就是一個迭代器,只不過它是一種特殊的迭代器:
print("generator是否是迭代器:", isinstance(generator, Iterator)) # 結果為 True print("generator是否是可迭代對象:", isinstance(generator, Iterable)) # 結果為 True
如果要想獲取生成器元素就只能通過next來獲取下一個元素,必須順序獲取,當沒有元素的時候拋出 StopIteration 異常。print(generator.__next__()) # 也可以這樣來使用 next(generator)。
用生成器實現斐波那契數列:
def fib(length): """ 生成器定義一個斐波那契數列,生成器本身就是yield + next實現。外部調用next來觸發一次計算 函數遇到yield返回,然后下一次next則繼續從上一次yield的地方向下執行,直到遇到某個結束條件 :param length: """ n, a, b = 0, 0, 1 while n < length: yield b """ a, b = b, a + b 等于 t = (b, a + b) a=t[0] b=t[1] 當計算b = a + b的時候, 這里的a并不是之前 a = b 之后a值,而是之前的a值,所以它是先做 = 右邊的計算,然后賦值給左邊的 """ a, b = b, a + b n = n + 1 return 'done' for i in fib(10): print(i)
迭代器
可以用next()函數調用來獲取下一個元素的對象叫做迭代器。生成器就可以,但是普通集合類比如list、dict、str就不可以。集合類的對象比如list、dict、set、str;還有生成器都是可迭代對象,也就是可以遍歷的。但是它們并不一定都是迭代器。list、dict、str等數據類型不是Iterator。
list1 = [1, 2, 3, 4, 5, 6] print("list1是否是迭代器:", isinstance(list1, Iterator)) # 結果為 False print("list1是否是可迭代對象:", isinstance(list1, Iterable)) # 結果為 True print("list1的長度:", len(list1)) # 結果為具體長度 if hasattr(list1, "__next__"): print("list1是迭代器")
把list1變成迭代器:
interObj = iter(list1) print("list1是否是迭代器:", isinstance(interObj, Iterator)) # 結果為 True print("list1是否是可迭代對象:", isinstance(interObj, Iterable)) # 結果為 False # print("interObj的長度:", len(interObj)) # 無法獲取長度 if hasattr(interObj, "__next__"): print("interObj是迭代器")
可遍歷的對象不一定是迭代器,但是肯定是可迭代對象。
迭代器同時一定也是可迭代對象。生成器是一種特殊的迭代器,所以也是可迭代對象。
可迭代對象和迭代器最大的區別就是前者可以通過len()獲取長度而后者不能
且迭代器一定可以通過next()函數(說明該對象包含__next__內置方法)獲取下一個元素,而可迭代對象不一定。
-
生成器
+關注
關注
7文章
322瀏覽量
21499 -
python
+關注
關注
56文章
4821瀏覽量
85687 -
迭代器
+關注
關注
0文章
45瀏覽量
4418
原文標題:Python迭代器與生成器
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
了解Python數據結構迭代對象、迭代器、生成器的概念

評論