Python迭代器、生成器、可迭代对象
生活随笔
收集整理的這篇文章主要介紹了
Python迭代器、生成器、可迭代对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可迭代對象(Iterable)
for循環可以作用于的數據類型有:list、tuple、dict、str 和 generator(包括生成器和帶 yield 的 generator function) 等,這些可以使用for循環遍歷的對象統稱為可迭代對象(Iterable)
可以使用isinstance()判斷一個對象是否是Iterable對象(可迭代對象)
迭代器(iterator)
python中幾乎所有的容器都有__iter__內置函數,而這些函數都會返回一個迭代器
我們對迭代器有兩點要求。或者說迭代器應該具備迭代器協議。
1.該對象需提供next方法,返回迭代器的下一項
2.如果沒有下一項即迭代完成時會拋出一個StopIteration異常。
1、StopIteration 如果有足夠的next()語句,或者如果在for循環中使用了該語句,則以上示例將永遠繼續下去。為了防止迭代永遠進行,我們可以使用StopIteration語句。在__next__()方法中,如果迭代執行了指定的次數,我們可以添加終止條件以引發錯誤:例如:在20次循環后停止:class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):if self.a <= 20:x = self.aself.a += 1return xelse:raise StopIterationmyclass = MyNumbers() myiter = iter(myclass)for x in myiter:print(x) # 首先獲得Iterator對象: it = iter([1, 2, 3, 4, 5]) # 循環: while True:try:# 獲得下一個值:x = next(it)except StopIteration:# 遇到StopIteration就退出循環breakfor循環不會報StopIteration 是因為內部已經做了異常處理
Python的for循環本質上就是通過不斷調用next()函數實現
迭代器的應用場景
我們發現迭代器最核心的功能就是可以通過next()函數的調用來返回下一個數據值。如果每次返回的數據值不是在一個已有的數據集合中讀取的,而是通過程序按照一定的規律計算生成的,那么也就意味著可以不用再依賴一個已有的數據集合,也就是說不用再將所有要迭代的數據都一次性緩存下來供后續依次讀取,這樣可以節省大量的存儲(內存)空間。
生成器(generator)
生成器的使用實例:
[i**2 for i in old_list] # 列表推導式 (i**2 for i in old_list) # 生成器表達式 def get_even_numbers(the_list):result_list = []for i in range(len(the_list)):if the_list[i] % 2 == 0:result_list.append(i)return result_listdef get_even_numbers_by_gen(the_list):for i in range(len(the_list)):if the_list[i] % 2 == 0:yield i# yield from 方法def test_yield_from(*iterables):for i in iterables:for j in i:yield j list(test_yield_from([1,2,3], 'abc')) # [1, 2, 3, 'a', 'b', 'c']# 上述函數等同于下 def test_yield_from(*iterables):for i in iterables:yield from i生成器和迭代器的區別
迭代器是訪問容器的一種方式,也就是說容器已經出現。我們是從已有元素拓印出一份副本,只為我們此次迭代使用。而生成器則是,而生成器則是自己生成元素的
?
總結
以上是生活随笔為你收集整理的Python迭代器、生成器、可迭代对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈我对微信小程序云开发的认识与见解
- 下一篇: 海康拉rtsp流的坑