# 什麼是迭代器
指的是迭代取值的工具,迭代是乙個重複的過程,每次重複取值都是基於上一次的結果繼續的,單純的重複並不是迭代
while
true
:# 只是單純的循壞
for x in
range(5
):# 迭代
# 為何要有迭代器
可以迭代取值任意的值
1.字典不可以索引取值,但是可以for取值(無循序)
2.列表可以索引取值,常見的都是可以通過索引取值(有順序)
3.基礎資料型別的有序無序,python直譯器提供一種迭代器取值
#如何使用迭代器
1.只要內建有__iter__,都可以迭代是物件
str=
'sun'
str.__iter__(
)# 可迭代物件
lis =[1
,2]lis.__iter__(
)tu =(1
,2,3
)tu.__iter__(
)dic =
dic.__iter__(
)set
=set
.__iter__(
)with
open
(r'a.txt'
,mode=
'rt'
,encoding=
'utf-8'
)as f:
f.__iter__(
)# 呼叫迭代物件__iter__可生成乙個迭代器
dic =
new = dic.__iter__(
)print
(new.__next__())
print
(new.__next__())
print
(new.__next__())
abc# 可迭代物件(__iter__()):字串,列表,元組,字典,集合,檔案物件
#迭代器物件(__next__()):檔案物件
# 'aaa'.__len__() == len('aaa')
# g.__iter__() == iter(g)
# g.__next__() == next(g)
# 總結
優點: 1
.提供了一種不靠索引取值的通用迭代取值的方法
2.惰性計算,節省記憶體
缺點: 1
.取值麻煩
2.無法**值的長度
3.一次性
# 迭代器對同乙個物件取值,如果第一次被取完,那麼第二次就直接跳stopiteration,取不到值
dic =
d = dic.__iter__(
)while
true
:try
:print
(d.__next__())
except stopiteration
break
print
('******************************'
)while
true
:try
:print
(d.__next__())
except stopiteration
break12
3======
====
====
====
====
====
====
====
=# 第一次迭代完,第二次就娶不到字典中的key值
# for 也叫迭代迴圈
d =1.d.__iter__(
)得到乙個迭代器物件
2.迭代器物件.__next__(
)拿到乙個返回值,然後將該返回值賦值給k
3.迴圈往復步驟2,知道丟擲stopiteration異常,for迴圈會捕捉異常然後結束迴圈
for k in d:
print
(k)
# 生成器----》自定義迭代器
# 如何得到自定義的迭代器 yield
# 在函式內一旦存在yield關鍵字,呼叫函式並不會執行函式體**
# 返回乙個生成器物件,生成器即自定義迭代器
deffunc()
:print
('第一次'
)yield
1print
('第二次'
)yield
2print
('第三次'
)yield
3print
('第四次'
)g = func(
)# 生成器就是迭代器
# g.__iter__()
# g.__next__()
res1 =
next
(g)# 會觸發函式體**的執行,然後遇到yield停下來,將yield後的值當作本次呼叫的返回值返回結果
print(res1)
# yield 就是g.send()送來的變數值
defdog
(name)
:print
('{}準備吃食物啦'
.format
(name)
)while
true
: x =
yield
# x = '雞腿'
print
('{}吃了{}'
.format
(name, x)
)g = dog(
'egon'
)g.send(
none
)# 第一次執行生成器必須傳值,不然報錯 或者 輸入 next(g)
g.send(
'雞腿'
) g.close(
)# 關閉生成器以後不能使用了
# yield + 返回值 + 傳參
defdog
(name)
: new_list =
print
('{}準備吃食物啦'
.format
(name)
)while
true
: x =
yield new_list # x = '雞腿' res = new_list
print
('{}吃了{}'
.format
(name, x)
)return new_list
g = dog(
'egon'
)g.send(
none
)res = g.send(
'雞腿'
)print
(res)
# 無窮給值的迭代器
deffunc
(start, stop, step=1)
:while
true
:print
('start.....'
)if start < stop:
start += step
yield start
print
('end......'
)
g = func(1,
20)res1 = g.__next__(
)print
(res1)
res2 = g.__next__(
)print
(res2)
start...
..2end...
...start...
..3
# 生成器生成的倆種方式
1. 函式 +
yield
2.res =
(x for x in
range(10
))
生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...
迭代器 生成器
迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...