#迭代器即迭代的工具,那什麼是迭代呢?#迭代是乙個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值
while true: #只是單純地重複,因而不是迭代
print('===>')
l=[1,2,3]
count=0
while count < len(l): #迭代
print(l[count])
count+=1
1#1、為何要有迭代器?
2對於序列型別:字串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器34
#2、什麼是可迭代物件?
5 可迭代物件指的是內建有__iter__方法的物件,即obj.__iter__
,如下6
'hello
'.__iter__
7 (1,2,3).__iter__
8 [1,2,3].__iter__
9 .__iter__
10 .__iter__
11 open('
a.txt
').__iter__
1213
#3、什麼是迭代器物件?
14 可迭代物件執行obj.__iter__
()得到的結果就是迭代器物件
15而迭代器物件指的是即內建有__iter__又內建有__next__方法的物件
1617
檔案型別是迭代器物件
18 open('
a.txt
').__iter__
()19 open('
a.txt
').__next__
()20
2122
#4、注意:
23 迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件
1 dic=2 iter_dic=dic.__iter__() #
得到迭代器物件,迭代器物件即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
3 iter_dic.__iter__() is iter_dic #
true45
print(iter_dic.__next__()) #
等同於next(iter_dic)
6print(iter_dic.__next__()) #
等同於next(iter_dic)
7print(iter_dic.__next__()) #
等同於next(iter_dic)8#
print(iter_dic.__next__()) #丟擲異常stopiteration,或者說結束標誌910
#有了迭代器,我們就可以不依賴索引迭代取值了
11 iter_dic=dic.__iter__
()12
while 1:
13try
:14 k=next(iter_dic)
15print
(dic[k])
16except
stopiteration:
17break
1819
#這麼寫太醜陋了,需要我們自己捕捉異常,控制next,python這麼牛逼,能不能幫我解決呢?能,請看for迴圈
#基於for迴圈,我們可以完全不再依賴索引去取值了dic=
for k in dic:
print(dic[k])
#for迴圈的工作原理
#1:執行in後物件的dic.__iter__()方法,得到乙個迭代器物件iter_dic
#2: 執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體**
#3: 重複過程2,直到捕捉到異常stopiteration,結束迴圈
#優點:- 提供一種統一的、不依賴於索引的迭代方式
- 惰性計算,節省記憶體
#缺點:
- 無法獲取長度(只有在next完畢才知道到底有幾個值)
- 一次性的,只能往後走,不能往前退
#只要函式內部包含有yield關鍵字,那麼函式名()的到的結果就是生成器,並且不會執行函式內部**def func():
print('====>first')
yield 1
print('====>second')
yield 2
print('====>third')
yield 3
print('====>end')
g=func()
print(g) #
g.__iter__g.__next__
#2、所以生成器就是迭代器,因此可以這麼取值
res=next(g)
print(res)
函式 生成器 迭代器
1.函式 1 函式的好處就是能將固定功能的模組封裝起來,在需要多次實現這個功能的時候就呼叫函式避免 的重複書寫,過於冗長 2 傳參 依次往後放這是規定 num,args,a 2,kwargs 中間兩個交換位置不影響 位置引數 引數關鍵字引數 引數 3 返回值函式執行沒遇到return返回值一定為no...
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...