---恢復內容開始---
① dir(被測物件) 如果它含有 __iter__,那這個物件叫做可迭代物件,遵循可迭代協議。
② 可迭代物件:iterable 可以轉換 迭代器(如何實現:都像內部定義乙個 __iter__()方法)
迭代器(iterator)遵循迭代器協議
1,只含有__iter__方法的資料是課迭代的物件
l = [1,2,3,4]print('
__iter__
'in dir(l))
2,含有__iter__方法,並且含有__next__方法的資料是迭代器。
print(dir([1,2].__iter__()))
① 迭代器節省記憶體
② 迭代器有惰性機制
③ 迭代器不能反覆,一直向下執行。
for 可以迴圈有: 字串,列表,元祖,字典,集合,說明它們都是可以被迭代的。
在for迴圈中,就是在內部呼叫了__next__方法才能取到乙個乙個的值。
那接下來我們就用迭代器的next方法來寫乙個不依賴for的遍歷。
l = [1,2,3,4]l_iter = l.__iter__
()item = l_iter.__next__
(item)
item = l_iter.__next__
(item)
item = l_iter.__next__
(item)
item = l_iter.__next__
(item)
item = l_iter.__next__
()print(item)
這是一段會報錯的**,如果我們一直取next取到迭代器裡已經沒有元素了,就會丟擲乙個異常stopiteration,告訴我們,列表中已經沒有有效的元素了。
這個時候,我們就要使用異常處理機制來把這個異常處理掉
l = [1,2,3,4]l_iter = l.__iter__
()while
true:
try:
item = l_iter.__next__
()
(item)
except
stopiteration:
break
那現在我們就使用while迴圈實現了原本for迴圈做的事情,我們是從誰那兒獲取乙個乙個的值呀?是不是就是l_iter?好了,這個l_iter就是乙個迭代器。
1,內部含有__iter__方法,他會將可迭代物件先轉化成迭代器,然後在呼叫__next__方法。
2,它有異常處理方法
驗證range 是不是迭代器
print('__next__
'in dir(range(12))) #
檢視'__next__'是不是在range()方法執行之後內部是否有__next__
print('
__iter__
'in dir(range(12))) #
檢視'__next__'是不是在range()方法執行之後內部是否有__next__
from collections import iterable
from collections import
iterator
print(isinstance(range(100000000),iterable))
print(isinstance(range(100000000),iterator)) #
驗證range執行之後得到的結果不是乙個迭代器
2,生成器的特點:
①可以用生成器函式寫
②可以用各種推導式構建迭代器
③可以通過資料轉化
3,return 和 yield 的區別
① return 返回給呼叫者值,並結束此函式
② yiled 返回給呼叫者值,並將指標停留在當前位置
importtime
defgenrator_fun1():
a = 1
print('
現在定義了a變數')
yield
a b = 2
print('
現在又定義了b變數')
yield
bg1 =genrator_fun1()
print('
g1 :
',g1) #
列印g1可以發現g1就是乙個生成器
print('
-'*20) #
我是華麗的分割線
(next(g1))
time.sleep(1) #
sleep一秒看清執行過程
print(next(g1))
1,給上乙個 yiled 整體傳送乙個值
2, send 不能給最後乙個 yiled 傳送值
3, 獲取第乙個值的時候,不能用 send 只能用 next
defgenerator():
print(123)
content = yield 1
print('
*****==
',content)
print(456)
yield2
g =generator()
ret = g.__next__
()print('
***'
,ret)
ret = g.send('
hello
') #
send的效果和next一樣
print('
***',ret)
---恢復內容結束---
Python 函式(迭代器 生成器)
只要能被for迴圈的資料型別,就一定擁有 iter 方法,for迴圈其實就是在使用迭代器 只要是迭代器就一定可以迭代 可迭代物件.iter 迭代器 迭代器中的 next 方法可以乙個乙個的獲取值 迭代器物件可以使用常規for語句進行遍歷 list 1,2,3,4 it iter list 建立迭代器...
python之路 生成器
顧名思義,列表生成式就是通過某種方式來生成乙個列表,那麼 ok,我們可以通過哪幾種方式來生成呢?from collections import iterable list 1 0,1,2,3,4,5,6,7,8,9 defadd x return x 2 result map add,list 1 ...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...