中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Python生成器的方法是什么

發布時間:2020-08-06 09:52:14 來源:億速云 閱讀:118 作者:小新 欄目:編程語言

這篇文章主要介紹使用Python生成器的方法是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

自從 PEP 255 引入生成器以來,它就是 Python 中重要的一部分.

生成器允許你定義一個有迭代器行為的函數.

它允許程序猿更快,更簡單并且以一個干凈的方式創建一個迭代器.

那么什么是迭代器呢,你或許會問?

 iterator 迭代器是一個可以被迭代的(循環)對象。它可以抽象為一個裝著數據同時有著可迭代對象的行為的容器。或許你已經每天在使用一些可迭代的對象:諸如字符串,列表,字典或其它名字的對象.

一個迭代器是一個實現了迭代器接口 Iterator Protocol 的類。這個接口為類提供了兩個方法: __iter__ 和 __next__.

嗯~回到上一步。你為什么想要創建一個迭代器呢?

節省內存空間

當實例化后,迭代器并不會計算它每一個項的值,他們只會等你訪問這些項的時候采取計算。這也就是眾所周知的惰性求值。

當你有一個非常大的數據集需要計算時,惰性求值是很有用處的。它允許你馬上就能開始使用數據,盡管整個數據集還在計算中。

假設我們想要獲得小于某個最大值的所有素數。

我們先定義一個函數,它可以檢查一個數字是否為素數:

def check_prime(number):
    for divisor in range(2, int(number ** 0.5) + 1):
        if number % divisor == 0:
            return False
    return True

然后,我們定義一個迭代器類,包含__iter__ 和 __next__ 方法。

class Primes:
    def __init__(self, max):
        self.max = max
        self.number = 1
    def __iter__(self):
        return self
    def __next__(self):
        self.number += 1
        if self.number >= self.max:
            raise StopIteration
        elif check_prime(self.number):
            return self.number
        else:
            return self.__next__()

Primes 類通過給定一個最大值來實例化。如果下一個素數比最大值 max 還要大,迭代器就會拋出一個 StopIteration 異常來把迭代器停掉。

當我們請求迭代器中的下一個元素時,它會給 number 加 1 并檢查這個數字是否為素數。如果不是,它會再次調用__next__直到 number 成為素數。一旦如此,迭代器就將這個數字返回。

通過使用迭代器,我們并不會在內存中創建一個包含很多素數的列表。相反,我們將會在每次請求下一個素數時才去生成它。

讓我們來試一試:

primes = Primes(100000000000)
print(primes)
for x in primes:
    print(x)
    ......
<__main__.Primes object at 0x1021834a8>
2
3
5
7
11
...

對 Primes 對象的每一次迭代都調用了 __next__ 來生成下一個素數。

迭代器只可以被迭代一輪。如果你嘗試再迭代 primes 一輪,它將不會返回任何值,表現得就像個空列表。

既然我們已經知道了什么是迭代器,以及怎么制作一個迭代器,我們接下來將繼續來看看生成器。

生成器

回想下,生成器函數允許我們以一種更簡單的方式來創建迭代器。

生成器給 Python 引入了 yield 聲明。它用起來有點像 return,因為它會返回一個值。

區別在于 yield 會保存函數的狀態。在函數下一次被調用時,將會從其離開的地方繼續執行,并且變量值也與它之前執行 yield 操作前相同。

如果把我們的 Primes 迭代器轉換為生成器,它看起來會像這樣:

def Primes(max):
    number = 1
    while number < max:
        number += 1
        if check_prime(number):
            yield number
primes = Primes(100000000000)
print(primes)
for x in primes:
    print(x)
......
<generator object Primes at 0x10214de08>
2
3
5
7
11

現在真是太 pythonic 了!我們還能再給力點嗎?

當然!我們可以使用 PEP 289 中介紹的生成器表達式。

這相當于是生成器的列表推導式。它用起來與列表推導式相同,不過表達式由 () 包裹而不是 []。

下面的表達式可以代替我們上面的生成器函數:

primes = (i for i in range(2, 100000000000) if check_prime(i))
print(primes)
for x in primes:
    print(x)
......
<generator object <genexpr> at 0x101868e08>
2
3
5
7
11
...

這就是 Python 生成器的美妙之處。

生成器允許你以一種非常 pythonic 的方式來創建迭代器。迭代器允許惰性求值,只有在請求下一個元素時迭代器對象才會去生成它。這對于非常大的數據集是很有用的。迭代器和生成器都只能被迭代一輪。生成器函數比迭代器更好。生成器表達式比迭代器更好(只在簡單情況下如此)。

以上是使用Python生成器的方法是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邮箱| 额尔古纳市| 洛宁县| 治多县| 乡城县| 南川市| 铁岭县| 通城县| 专栏| 南安市| 青川县| 冀州市| 清远市| 泸西县| 温泉县| 高清| 娱乐| 收藏| 东乡族自治县| 中牟县| 广水市| 垦利县| 晋江市| 镇赉县| 大新县| 泰州市| 贵南县| 遂平县| 顺义区| 平南县| 垣曲县| 比如县| 呼玛县| 乐山市| 库伦旗| 金川县| 齐河县| 宜兰县| 九江县| 绵阳市| 疏勒县|