久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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ù)類型(列表,、元組,、字符串、字典等)可以通過(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è)類似迭代器一樣的 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ù)開始執(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)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(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)遵守用戶 評(píng)論公約

    類似文章 更多