迭代器、可迭代对象与生成器
生活随笔
收集整理的這篇文章主要介紹了
迭代器、可迭代对象与生成器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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)) # False2.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
總結
以上是生活随笔為你收集整理的迭代器、可迭代对象与生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纷享车链AutoChain首创之数据保险
- 下一篇: python之while循环用法举例,b