這一部分待增強!
(一)迭代器
一:簡介
迭代是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()