PYTHON-迭代器、可迭代對象

1.迭代:

  經過重複執行的代碼處理類似的數據集的過程,而且本次迭代的處理數據要依賴上一次的結果繼續往下作,上一次產生的結果爲下一次產生結果的初始狀態,若是中途有任何停頓,都不能算是迭代。html

#1)    非迭代例子
loop = 0
while loop < 3:
    print("Hello world!")
    loop += 1
#2)     迭代例子
loop = 0
while loop < 3:
    print(loop)
loop += 1

2.容器:

  容器僅僅只是用來存放數據的,咱們日常看到的 l = [1,2,3,4]等等,好像咱們能夠直接從列表這個容器中取出元素,但事實上容器並不提供這種能力,而是可迭代對象賦予了容器這種能力。python

3.可迭代對象(Iterable):

  實現了__iter__()就行;git

  可迭代對象並非指某種具體的數據類型,它是指存儲了元素的一個容器對象。shell

  一個可迭代對象是不能獨立進行迭代的,Python中,迭代是經過for ... in來完成的。凡是可迭代對象均可以直接用for… in…循環訪問,這個語句其實作了兩件事:第一件事是調用__iter__()得到一個可迭代器,第二件事是循環調用__next__()。app

  常見的可迭代對象包括:a)    集合數據類型,如list、tuple、dict、set、str等;b)生成器(generator)ssh

4.迭代器(Iterator):

  迭代器能夠看做是一個特殊的對象,每次調用該對象時會返回自身的下一個元素,從實現上來看,一個迭代器對象必須是定義了__iter__()方法和next()方法的對象函數

  系統的 for i in 可迭代器or可迭代對象:... 這個最後有個 StopIteration  異常來檢驗是否結束迭代;oop

>>> a = [1,2,3]
>>> b = iter(a)
>>> b
<list_iterator object at 0x09CF4210>
>>> b.__next__()
1
>>> b.__next__()
2
>>> b.__next__()
3
>>> b.__next__()
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    b.__next__()
StopIteration

 

緣由以下:spa

class B(object):
    def __next__(self):
        raise StopIteration

class A(object):
    def __iter__(self):
        pass
        return B()#return B()
#A這個類實現了一個__iter__函數,返回的是B()的實例對象,其中B裏面實現了__next__這個函數。

from collections.abc import *

a = A()
b = B()
print(isinstance(a, Iterable))#由於有__iter__ 因此其是一個可迭代對象Iterable
print(isinstance(a, Iterator))#由於沒有__next__  因此不是一個迭代器Iterator

print(isinstance(b, Iterable))#由於沒有__iter__,因此不是一個可迭代對象
print(isinstance(b, Iterator))#由於沒有__iter__ ,因此不是一個迭代器
#output
True
False
False
False
>>> 

這樣B就好了:.net

class B(object):
    def __next__(self):
        raise StopIteration

    def __iter__(self):
        return None

class A(object):
    def __iter__(self):
        return B()


from collections.abc import *

a = A()
b = B()
print(isinstance(a, Iterable))#使用  能夠檢測一個類是否已經註冊到了  或者實現了  函數, print(isinstance(a, Iterator))

print(isinstance(b, Iterable))
print(isinstance(b, Iterator))isinstance(obj, Iterable)Iterable__iter__()
#output:
True
False
True
True

 

raise:

try:
    a = input("輸入一個數:")
    #判斷用戶輸入的是否爲數字
    if(not a.isdigit()):
        raise ValueError("a 必須是數字")
except ValueError as e:
    print("引起異常:",repr(e)) #repr() 函數將對象轉化爲供解釋器讀取的形式。

5.__getitem__(),讓對象實現可迭代功能:

#任何Python序列均可迭代的緣由是,他們都實現了__getitem__方法。其實,標準的序列也都實現了 __iter__方法。
>>> dir(list)
['__add__', '__class__', '__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']

 

原文連接:https://blog.csdn.net/LaoYuanPython/article/details/89609187

參考連接:

https://www.jianshu.com/p/1b0686bc166d

collections.abc 能夠參考這裏:https://docs.python.org/zh-cn/3/library/collections.abc.html

raise: http://c.biancheng.net/view/2360.html

repr: https://www.runoob.com/python/python-func-repr.html

__getitem__(): https://blog.csdn.net/ZT7524/article/details/96479481

相關文章
相關標籤/搜索