日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

[TimLinux] Python 迭代器(iterator)和生成器(generator)

發(fā)布時間:2023/11/30 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [TimLinux] Python 迭代器(iterator)和生成器(generator) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 可迭代對象

from collection import Iterableclass Iterable(metaclass=ABCMeta):...def __iter__(self): # 只實(shí)現(xiàn)了__iter__ 方法while False:yield None

能夠在 for ... in obj:中使用的對象(obj)就是一個可迭代對象。

2. 迭代器

from collections import Iteratorclass Iterator(Iterable): # Iterable的子類 ...def __next__(self): # 實(shí)現(xiàn)了 __next__raise StopIterationdef __iter__(self): # 也實(shí)現(xiàn)了 __iter__return self

能夠使用.next() 或者 .__next__() 方法,在沒有下一個元素時,返回 StopIteration 異常的對象,都是迭代器,可迭代對象轉(zhuǎn)換成迭代器的方法是: iter(obj) 返回的就是一個迭代器。

>>> a = [] >>> a [] >>> s = iter(a) >>> s <list_iterator object at 0x7feac859b048> >>> s.next() # 這個方法不存在,拋出的是屬性錯誤異常 Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: 'list_iterator' object has no attribute 'next' >>> s.__next__ <method-wrapper '__next__' of list_iterator object at 0x7feac859b048> >>> s.__next__() # 這個方法存在,拋出的是 StopIteration 異常 Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration >>>

實(shí)現(xiàn)自己的迭代器:

class Reverse:def __init__(self, data):self.data = dataself.index = len(data)def __iter__(self):return selfdef __next__(self): # py2: next()方法if self.index == 0:raise StopIterationself.index = self.index - 1return self.data[self.index]rev = Reverse('timlinux') for char in rev:print(char)

?

3. 生成器yield

生成器(generator)是用來構(gòu)造迭代器的一種語法工具,通過使用 yield 關(guān)鍵字來代替 return,并自動構(gòu)建好 __iter__() 和 __next__() 兩個方法:

  • yield 關(guān)鍵字的位置將發(fā)生 return 操作
  • yield 關(guān)鍵字存在的函數(shù)中,將具有 __iter__, __next__ 函數(shù)
def reverse(data):max_len = len(data) - 1min_len = -1for index in range(max_len, min_len, -1):yield data[index]x = reverse('timlinux') dir(x) # py3: 返回的對象有 __iter__, __next__ 方法# py2: 返回的對象有 __iter__, next 方法

列表生成式中的 [] 換成 (),得到的對象就不再是一個列表,而是一個生成器:

>>> L = [x*x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x*x for x in range(10)) >>> g <generator object <genexpr> at 0x7f9a8dd48a00>

4. 場景

在使用中分配內(nèi)存,而不是一次分配所有的內(nèi)存。

?

轉(zhuǎn)載于:https://www.cnblogs.com/timlinux/p/9700691.html

總結(jié)

以上是生活随笔為你收集整理的[TimLinux] Python 迭代器(iterator)和生成器(generator)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。