久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python迭代器

 網(wǎng)摘文苑 2023-02-12 發(fā)布于新疆

一,、可迭代對(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è)可以記住遍歷的位置的對(duì)象
  • 迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),,直到所有的元素被訪問(wèn)完結(jié)束,迭代器只能往前不會(huì)后退

迭代器有兩個(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__()方法,。

文章圖片1

iter() ----- __iter__()

next() ----- __next__()

2.用iter()創(chuàng)建迭代器

將字符串轉(zhuǎn)換為迭代器:

name = 'james'new_name = iter(name)print(type(name))  # <class 'str'>print(type(new_name))  # <class 'str_iterator'>print(isinstance(new_name, Iterator))  # True

將列表轉(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ò)for循環(huán)遍歷for i in new_name:    print(i)'''james'''

通過(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ě)法:

try:    print(new_list1.__next__())except StopIteration:    print('超過(guò)迭代器范圍')

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__方法,;

# 獲取迭代器對(duì)象的屬性列表list_2 = [1, 2, 3]print(dir(iter(list_2)))['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

通過(guò)打印結(jié)果中可以看出,,可迭代對(duì)象方法列表中既實(shí)現(xiàn)了__iter__方法,也實(shí)現(xiàn)了__next__方法,;

所以,,可以總結(jié)出迭代器(Iterator)與可迭代對(duì)象(Iterable)的區(qū)別:

  • 迭代器一定是可迭代對(duì)象,因?yàn)橥瑫r(shí)實(shí)現(xiàn)了__iter__方法和__next__方法,,可以通過(guò)next()方法獲取下一個(gè)值,,但是每個(gè)值只能獲取一次;
  • 但可迭代對(duì)象并不一定是迭代器,,例如列表,、字典、字符串,,它們只實(shí)現(xiàn)了__iter__方法,,如果想變成迭代器對(duì)象可以使用iter()進(jìn)行轉(zhuǎn)換;
  • 迭代器和可迭代對(duì)象都可以用作for循環(huán)遍歷;
  • 只要可以用for循環(huán)遍歷的都是可迭代對(duì)象,,只要可以用next()函數(shù)遍歷的都是迭代器對(duì)象,;

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é)

  • 迭代器一定是可迭代對(duì)象,,但可迭代對(duì)象不一定是迭代器,;
  • 要想自己實(shí)現(xiàn)迭代器,必須實(shí)現(xiàn)__iter__方法和__next__方法,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多