# 1.可迭代物件
# 能被for迴圈遍歷取值的資料型別:list/str/tuple/dict/set
# 遍歷(迭代):可迭代物件使用for.. in..的迴圈語法從其中依次拿到資料使用的過程
# for i in 可迭代物件:
# li = [1, 2, 3]
# for i in li: # 遍歷取值
# print(i)
# 可迭代物件:
# 泛指一類物件, 滿足以下條件的物件可以成為可迭代物件:
# 1.物件實現了__iter__方法
# 2.__iter__方法返回了迭代器物件
# 2.for迴圈工作原理
# 1.在內部對可迭代物件呼叫__iter__方法, 獲取到迭代器物件
# 2.再一次次的通過迭代器物件,呼叫__next__方法獲取結果
# tu = ('a', 'b', 'c') # 可迭代物件
# for i in tu:
# print(i)
# 3. 如果判斷乙個物件是否可以迭代 --- isinstance()
# 可迭代物件:iterable
# isinstance()
# 可迭代物件其實都是collections模組裡面的iterable類建立出來的例項
from collections.abc import iterable # 匯入模組
# name = 'jiuge'
# print(isinstance(name, iterable)) # 該物件是可迭代物件,返回為true
# print(isinstance(123, iterable)) # 該物件不是可迭代物件,返回為false
# 4.迭代器 iterator
# 迭代器就是實現了__iter__和 __next__方法的物件
# 迭代器有兩個函式: iter() 和 next()
# 遍歷取值步驟:
# 1.先呼叫物件的iter函式:
# iter()直接呼叫該物件的__iter__方法,並把該方法的返回結果作為自己的返回值
# 2.再使用next()函式來呼叫__next__方法
# 3.元素取完後,__next__方法會引發stopiteration異常
li = ['大海星辰', '活出自己', '好男人不止是曾小賢', '原來是美男吖']
# 建立迭代器物件
# it = iter(li) # 1.通過iter方法轉換迭代器物件
# print(it)
# 輸出元素
# print(next(it)) # 2.對獲取到的迭代器物件不斷使用next方法獲取下一條資料
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it)) # 3.取完元素後,再去取引發stopiteration異常
tu = (1, 2, 3, 4)
ut = tu.__iter__()
# print(ut)
# print(ut.__next__())
# print(ut.__next__())
# print(ut.__next__())
# print(ut.__next__())
# try:
# while true:
# print(ut.__next__())
## except:
# print('資料已經取完了')
# 5.可迭代物件和迭代器物件
# 可迭代物件:iterable
# 迭代器物件:iterator
# isinstance()判斷的函式
from collections.abc import iterable, iterator # 匯入模組
st = 'python'
# print(isinstance(st, iterable)) # true st是可迭代物件
# print(isinstance(st, iterator)) # false st不是迭代器物件
it = iter(st)
# print(it) #
print(isinstance(it, iterable)) # true it是可迭代物件
print(isinstance(it, iterator)) # true it是迭代器物件
# 總結:
# 迭代器物件一定是可迭代物件,可迭代物件不一定是迭代器物件
# 可迭代物件可以通過方法變成迭代器物件 (水果可以通過工廠變成水果罐頭)
# 1.迭代器協議
# 條件:
# 1.物件實現__next__方法
# 2.next方法放了某個資料
# 3.資料取完的時候,丟擲stopiteration異常
# 迭代器物件是實現了迭代器協議的物件
# 2.自定義迭代器類
# 需要有兩個特性:
# 2.1 具有iter方法,返回迭代器物件本身(類中定義了iter方法,這個類的例項就是乙個迭代器物件)
# 2.2 具有next方法,返回下乙個元素或者丟擲stopiteration異常
# 自定義類,例項化的物件不能使用for迴圈遍歷取值
class test:
def __init__(self):
self.n = 0 # 定義乙個初始值n
def funa(self): # 例項方法
# print('這是funa方法')
self.n += 1
return self.n
# # 例項化物件
# te = test()
## for i in te: # typeerror: 'test' object is not iterable
# print(i)
# 修改後,例項物件可以通過for迴圈遍歷取值
class test2:
# 返回迭代器物件
def __iter__(self):
self.n = 0
return self # 返回的是當前的例項物件,也就是迭代器物件
# 返回的是要取的資料
def __next__(self):
# 第二種:
if self.n == 6: # 設定條件,n的值為6時,丟擲異常
# 丟擲異常
raise stopiteration('超出範圍了')
self.n += 1
return self.n
te2 = test2()
# 直接呼叫next方法報錯,沒有呼叫iter方法,例項屬性self.n沒有生成
it = iter(te2)
while true:
print(next(it))
# 第一種:
# for迴圈中加結束條件
# for i in te2:
# if i <= 10:
# print(i)
# else:
# break
# 第二種:
# for i in te2:
# print(i)
# 1.生成器函式
# 生成器就是一種自定義的迭代器,本質是迭代器
# 定義方式:
# 1.1 生成器表示式:類似列表推導式
li = [i*2 for i in range(3)] # 列表推導式
# print(li) # [0, 2, 4]
li2 = (i*2 for i in range(3)) # 生成器表示式
# print(li2) # at 0x000002631b3a7dc8>
# print(next(li2))
# for i in li2:
# print(i)
# 1.2 生成器函式
# yield:每次返回乙個結果,在每個結果中間,掛起函式,以便下次從它離開的地方繼續執行
# yield使函式中斷,並儲存中斷的狀態,中斷後**可以繼續往下執行,過一段時間還可以重新呼叫這個函式
def test():
print('開始了...')
yield 123 # 返回乙個值'a', 暫停函式
yield 'b'
yield 'c'
t = test() # t是生成器物件
# print(t) #
# print(next(t))
# print(next(t))
# print(next(t))
# print(next(t))
# for i in t:
# print(i)
# 2. return和yield
# 如果生成器函式中有return,return返回的值是stopiteration異常的說明
def funa():
yield 123
return '這是return'
a = funa()
print(next(a))
print(next(a))
# 大概還有6節課
# 關於考試重點:資料型別,函式、物件導向,檔案操作
# 考試題型:選擇題、**題
迭代器與生成器
可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...
生成器與迭代器
迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...
生成器與迭代器
通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...