生成器

生成器

什麼是生成器對象
自定義的迭代器對象--能夠自定義一個容器,存放多個值,能夠不依賴索引取值python

# 函數內部一旦有了yield , 函數名()就再也不是函數的調用獲得函數的結果,而是產生‘’生成器對象‘’

def fn():
    yield 1
   
obj = fn()

print(obj)
# 生成器對象經過__next__()方法的去獲取yield的返回值,得到了就會中止執行
def func():
      print("娃哈哈")
      yield 1    #return和yield均可以返回數據
      print("呵呵呵")
    

gen = func()    #不會執行函數,拿到的是生成器
ret = gen.__next__()    #會執行到下一個yield
print(ret)
gen.__next__() 

# 函數中若是有yield,這個函數就是生成器函數
# yield: 至關於return能夠返回數據,但yield不會完全中斷函數,而是分段執行函數
# gen.__next__() 執行函數,執行到下一個yield
# gen.__next__() 繼續執行函數到下一個yield
1.函數中有yield, 函數名() 不是執行函數,而是生成生成器函數

eg:

# 佔內存演示
def order():
    lst = []
    for i in range(10000):
        lst.append("衣服"+str(i))
    return lst
    
ll = order()

# 上面的實例可能致使很是佔用內存,致使崩潰
解決方案是使用生成器
def order():
     for i in range(10000)
     yield "衣服」+str(i)
    
    
g = order()    #獲取生成器
mingwei = g.__next__()    # ===> 衣服0
print(mingwei)
zhaoyining = g.__next__())    # ===> 衣服1
print(zhaoyiming)

# 要一件衣服的時候取一件,不會形成內存佔用太高,致使崩潰
生成器的應用場景:

就是能夠生成一個能夠無限取值的容器。app

例子


python 2.x中沒有生成器概念: range() 會給出所有的量[a, b, c, d,......n]
python 3.x中引入生成器概念: range() 會給出range(a, b)函數

相關文章
相關標籤/搜索