午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Python 迭代器與生成器

 River_LaLaLa 2016-08-21

來(lái)源:Yushneng

鏈接:https://github.com/rainyear/pytips



項(xiàng)目地址:https:///pytips


迭代器與生成器


迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個(gè)概念,今天就把它們梳理一遍,并舉一些常用的例子。


for 語(yǔ)句與可迭代對(duì)象(iterable object)


for i in [1, 2, 3]:

    print(i)


1

2

3


obj = {'a': 123, 'b': 456}

for k in obj:

    print(k)


b

a


這些可以用在 for 語(yǔ)句進(jìn)行循環(huán)的對(duì)象就是可迭代對(duì)象。除了內(nèi)置的數(shù)據(jù)類(lèi)型(列表、元組、字符串、字典等)可以通過(guò) for 語(yǔ)句進(jìn)行迭代,我們也可以自己創(chuàng)建一個(gè)容器,包含一系列元素,可以通過(guò) for 語(yǔ)句依次循環(huán)取出每一個(gè)元素,這種容器就是迭代器(iterator)。除了用 for 遍歷,迭代器還可以通過(guò) next() 方法逐一讀取下一個(gè)元素。要?jiǎng)?chuàng)建一個(gè)迭代器有3種方法,其中前兩種分別是:


  1. 為容器對(duì)象添加 __iter__() 和 __next__() 方法(Python 2.7 中是 next());__iter__() 返回迭代器對(duì)象本身 self,__next__() 則返回每次調(diào)用 next() 或迭代時(shí)的元素;

  2. 內(nèi)置函數(shù) iter() 將可迭代對(duì)象轉(zhuǎn)化為迭代器


# iter(IterableObject)

ita = iter([1, 2, 3])

print(type(ita))

 

print(next(ita))

print(next(ita))

print(next(ita))

 

# Create iterator Object

class Container:

    def __init__(self, start = 0, end = 0):

        self.start = start

        self.end = end

    def __iter__(self):

        print('[LOG] I made this iterator!')

        return self

    def __next__(self):

        print('[LOG] Calling __next__ method!')

        if self.start

            i = self.start

            self.start += 1

            return i

        else:

            raise StopIteration()


c = Container(0, 5)

for i in c:

    print(i)


1

2

3

[LOG] I made this iterator!

[LOG] Calling __next__ method!

0

[LOG] Calling __next__ method!

1

[LOG] Calling __next__ method!

2

[LOG] Calling __next__ method!

3

[LOG] Calling __next__ method!

4

[LOG] Calling __next__ method!


創(chuàng)建迭代器對(duì)象的好處是當(dāng)序列長(zhǎng)度很大時(shí),可以減少內(nèi)存消耗,因?yàn)槊看沃恍枰涗浺粋€(gè)值即刻(經(jīng)??吹饺藗兘榻B Python 2.7 的 range 函數(shù)時(shí),建議當(dāng)長(zhǎng)度太大時(shí)用 xrange 更快,在 Python 3.5 中已經(jīng)去除了 xrange 只有一個(gè)類(lèi)似迭代器一樣的 range)。


生成器


前面說(shuō)到創(chuàng)建迭代器有3種方法,其中第三種就是生成器(generator)。生成器通過(guò) yield 語(yǔ)句快速生成迭代器,省略了復(fù)雜的 __iter__() & __next__() 方式:


def container(start, end):

    while start

        yield start

        start += 1

c = container(0, 5)

print(type(c))

print(next(c))

next(c)


for i in c:

    print(i)


0

2

3

4


簡(jiǎn)單來(lái)說(shuō),yield 語(yǔ)句可以讓普通函數(shù)變成一個(gè)生成器,并且相應(yīng)的 __next__() 方法返回的是 yield 后面的值。一種更直觀的解釋是:程序執(zhí)行到 yield 會(huì)返回值并暫停,再次調(diào)用 next() 時(shí)會(huì)從上次暫停的地方繼續(xù)開(kāi)始執(zhí)行:


def gen():

    yield 5

    yield 'Hello'

    yield 'World'

    yield 4

for i in gen():

    print(i)


5

Hello

World

4


Python 3.5 (準(zhǔn)確地說(shuō)應(yīng)該是 3.3 以后)中為生成器添加了更多特性,包括 yield from 以及在暫停的地方傳值回生成器的 send()等,為了保持簡(jiǎn)潔這里就不深入介紹了,有興趣可以閱讀官方文檔說(shuō)明以及參考。


參考


  • Iterators & Generators

  • How the heck does async/await work in Python 3.5?

  • Python’s yield from


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多