這一部分待加強! (一)迭代器 一:簡介 迭代是Python最強大的功能之一,是訪問集合元素的一種方式。 迭代器是一個可以記住遍歷的位置的對象。 迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。 迭代器只能往前不會後退。 迭代器有兩個基本的方法:iter() 創建迭代器對象和 ne ...
這一部分待加強!
(一)迭代器
一:簡介
迭代是Python最強大的功能之一,是訪問集合元素的一種方式。
迭代器是一個可以記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。
迭代器只能往前不會後退。
迭代器有兩個基本的方法:iter() 創建迭代器對象和 next()訪問迭代器。
字典、字元串、列表或元組對象都可用於創建迭代器
二:迭代器的創建
①把一個類作為一個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__()
②__iter__() 方法返回一個特殊的迭代器對象,
這個迭代器對象實現了 __next__() 方法
並通過 StopIteration 異常標識迭代的完成。
③__next__() 方法(Python 2 里是 next())會返回下一個迭代器對象
三:迭代器協議的後臺機制
for element in (1, 2, 3):
print(element)
在後臺,for 語句在容器對象中調用 iter() 。
該函數返回一個定義了 __next__() 方法的迭代器對象,它在容器中逐一訪問元素。
沒有後續的元素時, __next__() 拋出一個 StopIteration 異常,
通知 for 語句迴圈結束。
可以用內建的 next() 函數調用 __next__() 方法;
瞭解了迭代器協議的後臺機制,就可以很容易的給自己的類添加迭代器行為。
定義一個 __iter__() 方法,使其返回一個帶有 __next__() 方法的對象。
如果這個類已經定義了 __next__() ,那麼 __iter__() 只需要返回 self:
三:迭代器使用的必要性
列表效率高,但是需要將內容一次性讀入,可能增加記憶體的負擔,
如果列表太大,記憶體溢出。
range 返回一個列表
xrange 返回一個對象
(二)生成器
一:簡介
①在 Python 中,使用了 yield 的函數被稱為生成器(generator)
跟普通函數不同的是,生成器是一個返回迭代器的函數,
只能用於迭代操作,更簡單點理解生成器就是一個迭代器
②在調用生成器運行的過程中,每次遇到 yield 時函數會暫停,
並保存當前所有的運行信息,返回 yield 的值,
併在下一次執行 next() 方法時從當前位置繼續運行。
二:創建生成器
①一個簡單的生成器:my_generator = (x*x for x in range(4))
和列表解析式只是括弧不同,大數據處理時代替列表解析式。
②和return的區別:一般的函數都是止於return,作為生成器的函數,由於有了yield,
遇到他則會暫時掛起,如果之後還有return,則直接拋出StopIteration異常。
三:本節最後一句:編程中可以不使用生成器。
1 # ---------------------------------------------------------------------# 2 # 迭代器的創建 3 # ---------------------------------------------------------------------# 4 import sys 5 print("----------------------------迭代器-----------------------------") 6 list1 = [1, 2, 3, 4] 7 it = iter(list1) # 創建迭代器對象 8 print(next(it)) # 輸出迭代器的下一個元素 9 10 # ---------------------------------------------------------------------# 11 # 迭代器的遍歷 12 # ---------------------------------------------------------------------# 13 # 遍歷方法一 14 list2 = [1, 2, 3, 4] 15 it = iter(list2) # 創建迭代器對象 16 for x in it: 17 print(x, end=" ") # 此處格式化輸出的形式 18 19 # 遍歷方法二 20 list3 = (1, 2, 3, 4) 21 it = iter(list3) # 創建迭代器對象 22 """ 23 24 25 while True: 26 try: 27 print(next(it), end=" ") 28 except StopIteration: # 用於標識迭代的完成,防止出現無限迴圈的情況 29 sys.exit() 30 """ 31 # ---------------------------------------------------------------------# 32 # 寫一個能夠迭代的對象(給自己的類添加迭代對象) 33 # ---------------------------------------------------------------------# 34 35 36 class MyNumbers: 37 def __init__(self, n): 38 self.i = 0 39 self.n = n 40 41 def __iter__(self): # 核心,返回了迭代器本身即實現了__iter__方法的對象 42 return self 43 44 def __next__(self): # 含有next的對象就是迭代器本身 45 if self.i < self.n: 46 result_i = self.i 47 self.i += 1 48 return result_i 49 else: 50 raise StopIteration 51 52 53 x = MyNumbers(7) 54 y = iter(x) 55 for i in y: 56 print(i) 57 58 59 print("# ----------------------------生成器----------------------------- #") 60 61 62 def fibonacci(n): # 生成器函數 - 斐波那契 63 a, b, counter = 0, 1, 0 64 while True: 65 if counter > n: 66 return 67 yield a 68 a, b = b, a + b 69 counter += 1 70 71 72 f = fibonacci(10) # f 是一個迭代器,由生成器返回生成 73 74 while True: 75 try: 76 print(next(f), end=" ") 77 except StopIteration: 78 sys.exit()