一,、可迭代對(duì)象1.迭代的概念通過(guò)for循環(huán)遍歷取值的過(guò)程叫做迭代。 2.可迭代對(duì)象能夠通過(guò)for循環(huán)遍歷取值的對(duì)象叫做可迭代對(duì)象,,比如字符串,、列表、元組、字典,、集合,、range都屬于可迭代對(duì)象。 可以通過(guò)isinstance函數(shù)來(lái)判斷對(duì)象是否為可迭代對(duì)象: from collections.abc import Iterableprint(isinstance([], Iterable)) # Trueprint(isinstance('', Iterable)) # Trueprint(isinstance({}, Iterable)) # Trueprint(isinstance((), Iterable)) # Trueprint(isinstance({'name': 'lucy'}, Iterable)) # True 二,、迭代器1.迭代器的概念
迭代器有兩個(gè)基本的方法:iter() 和 next(),,字符串,,列表或元組對(duì)象都可用于創(chuàng)建迭代器,迭代器對(duì)象可以使用常規(guī) for 語(yǔ)句進(jìn)行遍歷,,也可以使用 next() 函數(shù)來(lái)遍歷,。list、tuple等都是可迭代對(duì)象,,可以通過(guò)iter()函數(shù)獲取這些可迭代對(duì)象的迭代器,。然后我們可以對(duì)獲取到的迭代器不斷使用next()函數(shù)來(lái)獲取下一條數(shù)據(jù)。iter()函數(shù)實(shí)際上就是調(diào)用了可迭代對(duì)象的 __iter__ 方法,。next()實(shí)際調(diào)用了 __next__()方法,。 iter() ----- __iter__() next() ----- __next__() 2.用iter()創(chuàng)建迭代器將字符串轉(zhuǎn)換為迭代器:
將列表轉(zhuǎn)換為迭代器: list1 = [1, 2, 3, 4, 5]new_list1 = iter(list1)print(type(list1)) # <class 'list'>print(type(new_list1)) # <class 'list_iterator'>print(isinstance(new_list1, Iterator)) # True 3.遍歷迭代器通過(guò)for循環(huán)遍歷
通過(guò)next()函數(shù)遍歷# 通過(guò)next()函數(shù)遍歷, next()new_list1.__next__()print(next(new_list1)) # 1print(next(new_list1)) # 2print(next(new_list1)) # 3print(new_list1.__next__()) # 4print(new_list1.__next__()) # 5 next()函數(shù)獲取,按照從前往后的順序,,每次只獲取一個(gè),、每個(gè)值只能獲取一次,當(dāng)獲取次數(shù)超過(guò)總長(zhǎng)度時(shí)會(huì)報(bào)錯(cuò)StopIteration,,可使用如下寫(xiě)法:
4.可迭代對(duì)象 VS 迭代器對(duì)象先來(lái)打印一下可迭代對(duì)象和迭代器的屬性列表 # 獲取可迭代對(duì)象的屬性列表list_2 = [1, 2, 3]print(dir(list_2))['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] 通過(guò)打印結(jié)果中可以看出,,可迭代對(duì)象方法列表中實(shí)現(xiàn)了__iter__方法,但并沒(méi)有實(shí)現(xiàn)__next__方法,;
通過(guò)打印結(jié)果中可以看出,,可迭代對(duì)象方法列表中既實(shí)現(xiàn)了__iter__方法,也實(shí)現(xiàn)了__next__方法,; 所以,,可以總結(jié)出迭代器(Iterator)與可迭代對(duì)象(Iterable)的區(qū)別:
5.使用迭代器的意義使用for循環(huán)也可以遍歷列表、字典等可迭代對(duì)象,,列表,、字典等可迭代對(duì)象是一次性將所有元素都加載到內(nèi)存中,當(dāng)可迭代對(duì)象的長(zhǎng)度較長(zhǎng)時(shí),,會(huì)占用系統(tǒng)資源,,而使用迭代器,則是每次只獲取一個(gè),,返回一個(gè),不會(huì)造成資源浪費(fèi),,在性能上大大優(yōu)于未使用迭代器的場(chǎng)景 6.自定義一個(gè)迭代器自定義一個(gè)迭代器,,隨機(jī)生成10個(gè)0-100的整數(shù) class RandomIterator(object): def __init__(self): self.count = 0 # 只有使用__iter__方法才能使用for循環(huán)進(jìn)行遍歷,否則只能用next()獲取迭代對(duì)象 # 使用了__iter__方法的都是可迭代對(duì)象 def __iter__(self): return self # 使用了__next__方法的都是迭代器對(duì)象 def __next__(self): if self.count == 10: raise StopIteration number = random.randint(0, 100) self.count += 1 return numberrandom_iter = RandomIterator()for i in random_iter: print(i)'''49359247291123573857''' 小結(jié)
|
|
來(lái)自: 網(wǎng)摘文苑 > 《語(yǔ)言基礎(chǔ)》