迭代器

1、迭代器

  • Iterable:可迭代對象,內部包含__iter__()函數
  • Iterator:迭代器,內部包含__iter__()和__next__()函數

特色:git

  • 節省內存
  • 惰性機制
  • 不能反覆,只能向下執行

1.可迭代對象

1)判斷一個對象是否爲可迭代對象

  • 經過dir函數來查看類中定義的方法中是否有__iter__方法

若是__iter__能找到,那麼這個類的對象就是一個可迭代對象。api

print(dir(str))
print(dir(list)) 結果: [
'__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
['__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']
  • 經過isinstance()函數

若是返回值爲True,則該對象爲可迭代對象,不然不是。app

from collections import Iterable

lst = [11, 22, 33]

print(isinstance(lst, Iterable))  # True

2.迭代器

  • 迭代器自己是可迭代的,因此類中有__iter__方法。

1)判斷一個對象是否爲迭代器

  • 經過dir函數來查看類中定義的方法中是否有__next__方法
lst = [11, 22, 33]
ret = lst.__iter__()

print("__next__" in dir(ret))  # True
  • 經過isinstance()函數
from collections import Iterator

lst = [11, 22, 33]
ret = lst.__iter__()

print(isinstance(ret, Iterator))  # True

 2)迭代器取值

    經過__next__獲取迭代器數據ssh

lst = [11, 22, 33]
ret = lst.__iter__()

print(ret.__next__())
print(ret.__next__())
print(ret.__next__())


結果:
11
22
33

    若是獲取元素個數超過迭代器元素的長度,則報錯StopIterationide

lst = [11, 22, 33]
ret = lst.__iter__()

print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
print(ret.__next__())  # StopIteration

3)for循環內部代碼

ret = lst.__iter__()

while 1:
    try:
        el = ret.__next__()
        print(el)
    except StopIteration:
        break

3.可迭代對象 -----> 迭代器

  • 可迭代對象不必定是迭代器,但可經過__iter__方法轉換成迭代器
lst = [11, 22, 33]
ret = lst.__iter__()

print("__next__" in dir(ret))  # True
相關文章
相關標籤/搜索