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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python学习笔记--迭代器

發布時間:2023/12/10 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习笔记--迭代器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自理解Python的迭代器

首先,廖雪峰老師的教程中解釋了迭代器和生成器,這篇文章只是補充和我個人的總結。

什么是迭代
可以直接作用于for循環的對象統稱為可迭代對象(Iterable)。
可以被next()函數調用并不斷返回下一個值的對象稱為迭代器(Iterator)。
所有的Iterable均可以通過內置函數iter()來轉變為Iterator。

對迭代器來講,有一個next()就夠了。在你使用for 和 in 語句時,程序就會自動調用即將被處理的對象的迭代器對象,然后使用它的next()方法,直到監測到一個StopIteration異常。

>>> L = [1,2,3] >>> [x**2 for x in L] [1, 4, 9] >>> next(L) Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: 'list' object is not an iterator >>> I=iter(L) >>> next(I) 1 >>> next(I) 2 >>> next(I) 3 >>> next(I) Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration

上面例子中,列表L可以被for進行循環但是不能被內置函數next()用來查找下一個值,所以L是Iterable。
L通過iter進行包裝后設為I,I可以被next()用來查找下一個值,所以I是Iterator。

題外話:

  • 內置函數iter()僅僅是調用了對象的iter()方法,所以list對象內部一定存在方法iter()
  • 內置函數next()僅僅是調用了對象的next()方法,所以list對象內部一定不存在方法next(),但是Itrator中一定存在這個方法。

  • for循環內部事實上就是先調用iter()把Iterable變成Iterator在進行循環迭代的。

  • >>> L = [4,5,6] >>> I = L.__iter__() >>> L.__next__() Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute '__next__' >>> I.__next__() 4 >>> from collections import Iterator, Iterable >>> isinstance(L, Iterable) True >>> isinstance(L, Iterator) False >>> isinstance(I, Iterable) True >>> isinstance(I, Iterator) True >>> [x**2 for x in I] [25, 36]
  • Iterator繼承自Iterable,從下面的測試中可以很方便的看到Iterator包含iter()和next()方法,而Iteratble僅僅包含iter()。
  • >>> from collections import Iterator, Iterable >>> help(Iterator) Help on class Iterator:class Iterator(Iterable)| Method resolution order:| Iterator| Iterable| builtins.object |**注解:從這里可以看出Iterable繼承自object, Iterator繼承自Iterable。| Methods defined here:|| __iter__(self)|| __next__(self)| Return the next item from the iterator. When exhausted, raise StopIteration ...... >>> help(Iterable) Help on class Iterable:class Iterable(builtins.object)| Methods defined here:|| __iter__(self) ......

    iterable需要包含有_iter()方法用來返回iterator,而iterator需要包含有next_()方法用來被循環
    如果我們自己定義迭代器,只要在類里面定義一個 iter() 函數,用它來返回一個帶 next() 方法的對象就夠了。
    直接上代碼

    class Iterable:
    def iter(self):
    return Iterator()

    class Iterator:def __init__(self):self.start=-1def __next__(self):self.start +=2if self.start >10:raise StopIterationreturn self.startI = Iterable() for i in I:print(i)

    上面的代碼實現的是找到10以內的奇數,代碼中的類名可以隨便取,不是一定需要使用我上面提供的類名的。
    如果在Iterator的next方法中沒有實現StopIteration異常,那么則是表示的全部奇數,那么需要在調用的時候設置退出循環的條件。

    class Iterable:def __iter__(self):return Iterator()class Iterator:def __init__(self):self.start=-1def __next__(self):self.start +=2return self.startI = Iterable() for count, i in zip(range(5),I): #也可以用內置函數enumerate來實現計數工作。print(i)

    我們通過range來實現打印多少個元素,這里表示打印5個元素,返回結果和上面一致。

    當然,我們可以把這兩個類合并在一起,這樣實現程序的簡練。
    最終版本如下

    class Iterable:def __iter__(self):return selfdef __init__(self):self.start=-1def __next__(self):self.start +=2if self.start >10:raise StopIterationreturn self.startI = Iterable() for i in I:print(i)

    復制迭代器
    迭代器是一次性消耗品,使用完了以后就空了,請看。

    >>> L=[1,2,3] >>> I=iter(L) >>> for i in I: ... print(i, end='-') ... 1-2-3- >>>next(I) Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration

    當循環以后就殆盡了,再次使用調用時會引發StopIteration異常。

    我們想通過直接賦值的形式把迭代器保存起來,可以下次使用。
    但是通過下面的范例可以看出來,根本不管用。

    >>> I=iter(L) >>> J=I >>> next(I) 1 >>> next(J) 2 >>> next(I) 3 >>> next(J) Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration

    那怎么樣才能達到我們要的效果呢?
    我們需要使用copy包中的deepcopy了,請看下面:

    >>> import copy >>> I=iter(L) >>> J=copy.deepcopy(I) >>> next(I) 1 >>> next(I) 2 >>> next(J) 1

    補充:迭代器不能向后移動, 不能回到開始。
    所以需要做一些特殊的事情才能實現向后移動等功能。

    以上代碼均在Python 3.4 中測試通過。

    總結

    以上是生活随笔為你收集整理的python学习笔记--迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。