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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迭代器、可迭代对象与生成器

發布時間:2025/4/14 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代器、可迭代对象与生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Iterator 與 gerater的作用是優化內存,當處理大文件,大數據的時候可以使用。

  1. 對大列表進行優化

  2. 大文件的優化

一、基本概念

迭代器:  一種數據類型,用來處理大數據

可迭代對象:一個對象,能每次返回數據組中的一個成員,for循環中每次返回一個數據或者用來作為iter內置函數的參數,返回迭代器對象

生成器:  生成器是通過yield 或 生成器表達式,用一種比較方便的方式生成了迭代器。

二、代碼視線部分

2.1? yield?

?yield函數就是一個生成器:

yield的作用:

  1. 相當于return返回一個值

  2. 記住該位置,下次進來從這個位置開始。

兩種使用方式:

1. 使用next 和 send 需結合異常處理(當超出最大值的時候,會報錯)

2. 使用for循環,for內部自動幫我們處理異常

def ge():yield 8yield 88yield 888g = ge() print(next(g)) print(next(g)) print(next(g)) print(next(g)) # 報錯,超出

使用for處理

def gen_num2():for i in range(8): # range是一個惰性機制。yield ifor i in gen_num2():print(i)

?

2.2 迭代器,可迭代對象,生成器的類型判斷

from collections import Iterator, Iterable, Generator# 列表的類型判斷 li = [1, 2, 3, 4] print(isinstance(li, Iterable)) # True print(isinstance(li, Iterator)) # False print(isinstance(li, Generator)) # False# 字典的類型判讀 dic = {'name':'hui', 'age':18} print(isinstance(dic, Iterable)) # True print(isinstance(dic, Iterator)) # False print(isinstance(dic, Generator)) # False# range的類型判斷 # range是一個可迭代對象,不是迭代器。但是他跟迭代器有類似的地方,又一個惰性機制,所有也很節約內存 r = range(10) print(type(r)) print(isinstance(r, Iterable)) # True print(isinstance(r, Iterator)) # False print(isinstance(r, Generator)) # False# 文件對象 是一個迭代器 with open('1.txt', 'wb') as f:pass print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True print(isinstance(f, Generator)) # False# yield對象 def ge():for i in range(9):yield(i) g = ge() print(isinstance(g, Iterable)) # True print(isinstance(g, Iterator)) # True print(isinstance(g, Generator)) # False

2.3 可迭代對象轉換為迭代器,優化內存

  使用iter內置函數

from collections import Generator, Iterable, Iteratorx = [x for x in range(10)] y = iter(x) # 列表轉換為迭代器 print(next(y)) print(next(y)) print(next(y)) print(next(y)) print(isinstance(y, Iterable)) print(isinstance(y, Iterator)) # 是迭代器對象, print(isinstance(y, Generator))dic = {'name':'hui', 'age':18} print(isinstance(dic, Iterable)) print(isinstance(dic, Iterator)) print(isinstance(dic, Generator))d = iter(dic) # 字典轉換為迭代器 print(type(d)) print(isinstance(d, Iterable)) print(isinstance(d, Iterator)) print(isinstance(d, Generator))

?

2.4 生成器表達式

# 列表表達式 y = [x for x in range(10)]# 生成器表達式 z = (x for x in range(10)) print(type(z), z)

?

2.5 大文件 與 函數優化

1. 函數優化

# 斐波那契 # 0,1,1,2,3 def fb(n):a, b = 0, 1while a < n:print(a)a,b = b, a+bdef fb_list(n):a, b = 0, 1fblist = []while a < n:fblist.append(a) # 當數據量非常大的時候,就會造成內存爆炸a, b = b, a+breturn fblistprint(fb_list(1000))def fb_ge(n):a, b = 0, 1fblist = []while a < n:yield a # 使用生成器每次來取,優化內存a, b = b, a+bfor i in fb_ge(1000):print(i, end=' ')

2. 大文件優化

  打開文件的對象,本身就是一個迭代器。

with open('1.txt', 'wb') as f:pass print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True print(isinstance(f, Generator)) # False

?

?

轉載于:https://www.cnblogs.com/louhui/p/9381668.html

總結

以上是生活随笔為你收集整理的迭代器、可迭代对象与生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

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