Python之路【第二十八篇】:生成器與迭代器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#只要函數的代碼裏面出現了yield關鍵字,這個函數就再也不是一個普通的函數了,叫作生成器函數
#執行生成器函數,獲取到的東西就叫作生成器
#生成器的一個好處就是無需在內存中創鍵全部東西,何時須要何時建立
'''
def fun():
    yield 1
    yield 2

r = fun()
'''
#fun是生成器函數,r是生成器,生成器具備生成一些東西的能力

###################生成器原理#######################
'''
#定義一個生成器函數
def fun():
    print(11)
    yield 1

    print(22)
    yield 2

    print(33)
    yield 3

#執行生成器函數,僅僅獲取了一個生成器,不會輸出任何值
r = fun()


#執行生成器的__next__方法,碰到yield就退出,這裏的yield至關於普通函數裏面的return,可是不同,yield能夠保存上一次的執行狀態,而return 是直接退出的返回值是第一個yield的值
ret = r.__next__()
print(ret)

#再次執行生成器的__next__方法,返回值是第二個yield的值
ret = r.__next__()
print(ret)
'''
############################################################



########################生成器實現#######################

def xrange(n):
    start = 0
    while True:
        if start > n:
            return
        yield start
        start += 1

obj = xrange(5)

n1 = obj.__next__()
n2 = obj.__next__()
n3 = obj.__next__()
n4 = obj.__next__()
n5 = obj.__next__()

print(n1,n2,n3,n4,n5)
#!/usr/bin/env python
# -*- coding:utf-8 -*-

#生成器僅僅具備一種生成能力
#如和將一個函數變爲生成器,在函數裏面出現了yield,這個函數就再也不是普通的函數了,叫生成器函數,執行這個生成器函數就會獲得一個生成器
#迭代器具備訪問能力,迭代器是一個一個進行迭代,只能一個一個日後找,不能往前找
#迭代器特色:
#訪問者不須要關心迭代器內部的結構,僅須要經過next()方法不斷去取下一個內容
#不能隨機的訪問集合中的某個值,只能從頭至尾依次訪問
#訪問到一半時,不能日後退
#便於循環比較大的數據集合,節省內存

#迭代器本質上也是經過next一個一個去取,咱們在用的時候直接用for循環迭代就能夠了
#生成器須要本身寫,而迭代器直接用for循環就能夠了

def xrange(n):
    start = 0
    while True:
        if start > n:
            return
        yield start
        start += 1

for x in xrange(10):
    print(x)

生成器與迭代器綜合練習:python

#! usr/bin/env python
# -*-coding = utf-8 -*-

#生成器

def range(n):
    start = 0
    while True:
        if start < n:
            yield start
            start += 1
        else:
            return
#迭代器
for i in range(10):
    print(i)  

  對於生成器的理解要注意,在例程中,咱們使用的是一些整數,既然是生成器,那麼可不能夠生成別的東西,好比相似於列表或者字典這樣的數據結構,能夠,如:數據結構

li = [1,2,3,4,5]
for item i li:
    yield{
        'index':item
    }

 好比上面相似的寫法,也是個生成器,不過生成器中的數據結構是字典形式的 函數

相關文章
相關標籤/搜索