国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python3 生成器表達(dá)式

這篇具有很好參考價值的文章主要介紹了python3 生成器表達(dá)式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在 Python3 中,生成器表達(dá)式是一種語言結(jié)構(gòu),它可以快速地創(chuàng)建一個可迭代對象。生成器表達(dá)式類似于列表推導(dǎo)式,但使用圓括號而不是方括號,并且返回的是一個生成器對象而不是一個列表。

在 Python3 中,生成器表達(dá)式有兩種類型:生成器函數(shù)和生成器表達(dá)式。

  1. 生成器函數(shù):

生成器函數(shù)是一種特殊的函數(shù),在函數(shù)中使用 yield 語句來生成一個值,然后暫停函數(shù)執(zhí)行并保留當(dāng)前狀態(tài),等待下一次調(diào)用時繼續(xù)執(zhí)行。生成器函數(shù)的優(yōu)點是可以處理大量數(shù)據(jù),因為它們只需要在內(nèi)存中保存一個值,而不是全部保存在內(nèi)存中。

例如,以下是一個生成器函數(shù),它可以生成斐波那契數(shù)列中的前 n 個數(shù)字:

def fibonacci(n):
    a, b = 0, 1
    for i in range(n):
        yield a
        a, b = b, a + b
xx=fibonacci(9)
print(xx)
  1. 生成器表達(dá)式:

生成器表達(dá)式是使用圓括號包圍的表達(dá)式,其中包含一個 for 循環(huán)和一個可選的 if 條件。生成器表達(dá)式可以用來生成一個序列,這個序列可以通過迭代訪問,但不必事先將所有元素保存在內(nèi)存中。

例如,以下生成器表達(dá)式可以生成一個包含從 1 到 10 的偶數(shù)的生成器對象:

gen = (i for i in range(1, 11) if i % 2 == 0)

注意事項:

  1. 生成器表達(dá)式可以節(jié)省內(nèi)存空間,但是如果需要多次使用生成器對象中的值,則需要將其轉(zhuǎn)換為列表或其他數(shù)據(jù)結(jié)構(gòu)。
  2. 如果生成器表達(dá)式中的代碼太長或復(fù)雜,則建議使用生成器函數(shù)來代替,以提高代碼的可讀性和可維護(hù)性。
  3. 如果生成器表達(dá)式中的代碼有副作用(例如修改了全局變量),則可能會導(dǎo)致意外行為,應(yīng)該避免這種情況。
  4. 生成器表達(dá)式可以嵌套,但是應(yīng)該注意不要嵌套過深導(dǎo)致代碼難以理解。例如:
    gen = ((i, j) for i in range(1, 4) for j in range(4, 7))

    這個生成器表達(dá)式可以生成一個包含所有 (1,4) 到 (3,6) 的元組的生成器對象。

  5. 生成器表達(dá)式中的 for 循環(huán)可以有多個,每個循環(huán)可以使用一個 if 條件。例如:
    gen = (i * j for i in range(1, 4) if i % 2 == 0 for j in range(4, 7) if j % 2 != 0)

    這個生成器表達(dá)式可以生成一個包含所有偶數(shù) i 與奇數(shù) j 的乘積的生成器對象。

  6. 生成器表達(dá)式中的變量作用域只在生成器表達(dá)式內(nèi)部,不會泄露到外部。例如:
    x = 10
    gen = (x for x in range(1, 5))
    print(list(gen))    # 輸出 [1, 2, 3, 4]
    print(x)    # 輸出 10,說明 x 只在生成器表達(dá)式內(nèi)部存在,不會影響外部變量 x 的值。
  7. 生成器表達(dá)式可以和其他 Python 的內(nèi)置函數(shù)或模塊一起使用,例如 map、filter、itertools 等。例如:
    import itertools
    
    # 使用 map 函數(shù)和生成器表達(dá)式生成一個列表,其中每個元素都是平方數(shù)。
    lst = list(map(lambda x: x ** 2, (i for i in range(1, 5))))
    print(lst)    # 輸出 [1, 4, 9, 16]
    
    # 使用 itertools 模塊中的 zip_longest 函數(shù)和生成器表達(dá)式生成一個包含所有輸入迭代器的元組的列表。
    lst = list(itertools.zip_longest((i for i in range(1, 5)), ('a', 'b', 'c')))
    print(lst)    # 輸出 [(1, 'a'), (2, 'b'), (3, 'c'), (4, None)]
  8. 在使用生成器表達(dá)式時,應(yīng)該盡可能地使用惰性求值,即只生成需要的元素,并且在使用完之后立即釋放相應(yīng)的資源。這樣可以避免不必要的內(nèi)存占用和性能問題。
  9. 處理大型數(shù)據(jù)集,例如從文件或數(shù)據(jù)庫中讀取數(shù)據(jù),并將其用作生成器表達(dá)式的輸入。這樣可以避免一次性加載所有數(shù)據(jù),并且節(jié)省內(nèi)存空間。
    with open('data.txt') as f:
        gen = (line.strip() for line in f if 'error' in line)
        for item in gen:
            print(item)
  10. 通過生成器表達(dá)式實現(xiàn)惰性求值,例如只有當(dāng)需要時才計算函數(shù)的值。這樣可以避免不必要的計算和內(nèi)存占用。
    def expensive_function(n):
        print(f"Calculating {n}...")
        return n ** 2
    
    gen = (expensive_function(i) for i in range(5))
    print(list(gen))    # 輸出 Calculating 0... Calculating 1... Calculating 2... Calculating 3... Calculating 4... [0, 1, 4, 9, 16]

    這個例子中,我們定義了一個函數(shù) expensive_function,并使用一個生成器表達(dá)式來生成一個包含前五個數(shù)字的平方的列表。在評估生成器表達(dá)式時,expensive_function 只有在需要計算平方時才被調(diào)用,這樣可以避免不必要的計算和內(nèi)存占用。

  11. 在多個迭代器之間生成元素,例如合并兩個排序列表并返回一個新的排序列表。
    def merge_sorted(lst1, lst2):
        i, j = 0, 0
        while i < len(lst1) and j < len(lst2):
            if lst1[i] <= lst2[j]:
                yield lst1[i]
                i += 1
            else:
                yield lst2[j]
                j += 1
        yield from lst1[i:]
        yield from lst2[j:]
    
    lst1 = [1, 3, 5, 7]
    lst2 = [2, 4, 6, 8]
    gen = merge_sorted(lst1, lst2)
    print(list(gen))    # 輸出 [1, 2, 3, 4, 5, 6, 7, 8]

    這個例子中,我們定義了一個 merge_sorted 函數(shù)來合并兩個排序列表,并返回一個新的排序列表。在函數(shù)中,我們使用一個生成器函數(shù)來生成所有排好序的元素,并在函數(shù)返回之前返回它們。這個方法可以在處理大型數(shù)據(jù)集時節(jié)省內(nèi)存空間,并且可以避免不必要的排序或其他操作。

  12. 用于過濾和轉(zhuǎn)換數(shù)據(jù),例如將一個列表中的所有元素轉(zhuǎn)換為字符串并刪除其中的空格。
    lst = [' hello ', ' world', '', 'python', '']
    gen = (s.strip() for s in lst if s)
    print(list(gen))    # 輸出 ['hello', 'world', 'python']

    這個例子中,我們使用一個生成器表達(dá)式來對列表中的所有元素進(jìn)行過濾和轉(zhuǎn)換。具體來說,我們首先使用 if 子句來過濾出所有不為空的字符串,然后使用 strip 方法來刪除每個字符串的前導(dǎo)和尾隨空格。最后,我們將經(jīng)過處理的字符串返回為一個生成器對象,并將其轉(zhuǎn)換為一個列表。

  13. 生成器表達(dá)式可以與其他 Python 內(nèi)置函數(shù)(如 map 和 filter)和模塊(如 itertools)結(jié)合使用,以實現(xiàn)更高效和優(yōu)雅的代碼。

  14. 在使用生成器表達(dá)式時,應(yīng)該盡可能地使用惰性求值,即只生成需要的元素,并在使用完之后立即釋放相應(yīng)的資源。這樣可以避免不必要的內(nèi)存占用和性能問題。

  15. 如果生成器表達(dá)式中的代碼有副作用(例如修改了全局變量),則可能會導(dǎo)致意外行為,應(yīng)該避免這種情況。

  16. 在編寫長的生成器表達(dá)式時,建議將其分解成多個簡單的表達(dá)式或生成器函數(shù),以提高代碼的可讀性和可維護(hù)性。

  17. 在使用生成器表達(dá)式時,應(yīng)該學(xué)會使用列表推導(dǎo)式和普通的 for 循環(huán)來進(jìn)行比較,以選擇最適合特定任務(wù)的工具。

  18. 最后,需要注意的是,生成器表達(dá)式雖然非常強(qiáng)大和方便,但也并非萬能的。在某些情況下,還是需要使用其他語言結(jié)構(gòu)或算法來解決問題。

  19. 在使用生成器表達(dá)式時,應(yīng)該避免使用過多的嵌套循環(huán)和條件語句,以免代碼變得難以閱讀和維護(hù)。在這種情況下,建議考慮使用其他數(shù)據(jù)結(jié)構(gòu)或算法。

  20. 使用生成器表達(dá)式時,應(yīng)該盡可能地保持代碼簡單和易讀。這包括命名變量、注釋代碼和格式化輸出,以便其他人可以理解你的代碼。

  21. 在使用生成器表達(dá)式時,需要注意一些性能問題。例如,在處理大型數(shù)據(jù)集時,可能需要考慮使用并行計算或其他優(yōu)化算法來提高效率。讓我們來看一個例子,說明生成器表達(dá)式和列表推導(dǎo)式之間的差異:

讓我們來看一個例子,說明生成器表達(dá)式和列表推導(dǎo)式之間的差異:

# 列表推導(dǎo)式
lst = [i ** 2 for i in range(1, 11)]
print(lst)

# 生成器表達(dá)式
gen = (i ** 2 for i in range(1, 11))
print(list(gen))

個例子中,我們首先使用列表推導(dǎo)式創(chuàng)建一個包含前 10 個數(shù)字的平方的列表。然后,我們使用一個生成器表達(dá)式來創(chuàng)建一個包含相同元素的生成器對象,并將其轉(zhuǎn)換為一個列表。

一般來說,列表推導(dǎo)式比起生成器表達(dá)式更加適合小型數(shù)據(jù)集,因為它們可以在內(nèi)存中完全構(gòu)建出一個列表,并且可以在需要時隨時進(jìn)行索引和修改。另一方面,生成器表達(dá)式更適合大型數(shù)據(jù)集,因為它們只返回必要的元素,而且可以逐個處理每個元素,從而節(jié)省內(nèi)存空間。

Python標(biāo)準(zhǔn)庫還提供了許多內(nèi)置函數(shù)和模塊,可以幫助我們更加方便地處理和操作生成器。

其中一個比較常見的內(nèi)置函數(shù)是next()函數(shù)。它用于從生成器中獲取下一個值,并將生成器的執(zhí)行狀態(tài)從上一次掛起的位置繼續(xù)向下執(zhí)行。

以下是一個使用next()函數(shù)打印斐波那契數(shù)列的示例:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 輸出前10項斐波那契數(shù)列
fib = fibonacci()
for i in range(10):
    print(next(fib))

在這個示例中,使用一個無限循環(huán)的生成器函數(shù)來計算斐波那契數(shù)列。然后,通過調(diào)用next()函數(shù)逐一輸出數(shù)列的前10項。每次調(diào)用next()函數(shù)時,生成器函數(shù)會從上一次yield語句掛起的位置繼續(xù)執(zhí)行,直到下一個yield語句為止。

除了next()函數(shù)之外,Python標(biāo)準(zhǔn)庫還提供了一些其他有用的生成器相關(guān)函數(shù)和模塊,例如:

  • itertools: 一個集合了許多有用的迭代器函數(shù)的模塊,如排列、組合、笛卡爾積等。
  • enumerate(): 返回一個由索引和元素組成的迭代器對象,常用于遍歷序列時獲取元素的索引。
  • filter(): 返回一個由滿足某個條件的元素組成的迭代器對象,常用于過濾序列中的元素。
  • map(): 對序列中的每個元素應(yīng)用一個函數(shù),并返回一個由處理結(jié)果組成的迭代器對象。
  • zip(): 將多個序列打包為一個元組構(gòu)成的迭代器對象,常用于將多個列表或元組同時遍歷。

這些函數(shù)和模塊可以幫助我們更加方便地使用生成器,并讓我們的代碼變得更加簡潔和高效。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-431008.html

到了這里,關(guān)于python3 生成器表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Python】Python系列教程-- Python3 迭代器與生成器(二十)

    往期回顧: Python系列教程–Python3介紹(一) Python系列教程–Python3 環(huán)境搭建(二) Python系列教程–Python3 VScode(三) Python系列教程–Python3 基礎(chǔ)語法(四) Python系列教程–Python3 基本數(shù)據(jù)類型(五) Python系列教程-- Python3 數(shù)據(jù)類型轉(zhuǎn)換(六) Python系列教程-- Python3 推導(dǎo)式(

    2024年02月08日
    瀏覽(86)
  • Python3 高級教程 | Python3 正則表達(dá)式(一)

    目錄 一、Python3 正則表達(dá)式 (一)re.match函數(shù) (二)re.search方法 (三)re.match與re.search的區(qū)別 二、檢索和替換 (一)repl 參數(shù)是一個函數(shù) ?(二)compile 函數(shù) ?(三)findall (四)re.finditer (五)re.split 三、正則表達(dá)式對象 re.RegexObject re.MatchObject ?四、正則表達(dá)式修飾符 - 可

    2024年02月13日
    瀏覽(91)
  • 力扣:150. 逆波蘭表達(dá)式求值(Python3)

    給你一個字符串?dāng)?shù)組? tokens ?,表示一個根據(jù)?逆波蘭表示法?表示的算術(shù)表達(dá)式。 請你計算該表達(dá)式。返回一個表示表達(dá)式值的整數(shù)。 注意: 有效的算符為? \\\'+\\\' 、 \\\'-\\\' 、 \\\'*\\\' ?和? \\\'/\\\' ?。 每個操作數(shù)(運(yùn)算對象)都可以是一個整數(shù)或者另一個表達(dá)式。 兩個整數(shù)之間的除法總

    2024年02月05日
    瀏覽(94)
  • python3字符串格式化用format()好還是 % 表達(dá)式好

    左手編程,右手年華。大家好,我是一點,關(guān)注我,帶你走入編程的世界。 公眾號:一點sir,關(guān)注領(lǐng)取python編程資料 在 Python 中,使用 format() 方法是更推薦的方式來進(jìn)行字符串格式化,特別是在Python3中。雖然 % 表達(dá)式仍然可以在Python中使用,但已經(jīng)不推薦使用了,新的項目

    2024年04月16日
    瀏覽(90)
  • ES6生成器,看似同步的異步流程控制表達(dá)風(fēng)格

    本文分享自華為云社區(qū)《3月閱讀周·你不知道的JavaScript | ES6生成器,看似同步的異步流程控制表達(dá)風(fēng)格》,作者: 葉一一。 JavaScript開發(fā)者在代碼中幾乎普遍依賴的一個假定:一個函數(shù)一旦開始執(zhí)行,就會運(yùn)行到結(jié)束,期間不會有其他代碼能夠打斷它并插入其間。 ES6引入了

    2024年04月10日
    瀏覽(94)
  • Python 生成器推導(dǎo)

    生成器理解是在 python 中創(chuàng)建生成器的一種聰明而有效的方法。 它是定義生成器的單行規(guī)范,對于理解該語法以高效編碼至關(guān)重要。 在本文中,我們將學(xué)習(xí) python 的生成器和生成器理解以及示例。 Python 中的生成器是返回可迭代或遍歷對象的函數(shù),用于創(chuàng)建一次遍歷項目的迭

    2024年02月09日
    瀏覽(91)
  • Python 實現(xiàn)卡密生成(卡密生成器)

    Python 實現(xiàn)卡密生成(卡密生成器)

    最近我在做一個基于 openCv2 的腳本,順手寫了一個卡密生成器,也給自己保存一下代碼。 代碼部分 接下來是下載連接,因為比較小就用某云盤了,知道的它下載一直很慢,其實也不算小Python打包出來的東西還是挺大的,壓縮包里有一個ui文件不要刪,那個是動態(tài)加載進(jìn)的Qt文

    2024年02月21日
    瀏覽(94)
  • python生成器generator的用法

    通過列表生成式,我們可以直接創(chuàng)建一個列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那后面絕大多數(shù)元素占用的空間都白白浪費(fèi)了。 所以,如果列表元素可以

    2024年02月04日
    瀏覽(90)
  • python中的生成器(generator)

    python中的生成器(generator)

    一、生成器 生成器是 Python 中非常有用的一種數(shù)據(jù)類型,它可以讓你在 Python 中更加高效地處理大量數(shù)據(jù)。生成器可以讓你一次生成一個值,而不是一次生成一個序列,這樣可以節(jié)省內(nèi)存并提高性能 二、實現(xiàn)generator的兩種方式 python中的generator保存的是算法,真正需要計算出值

    2024年02月15日
    瀏覽(118)
  • java時間解析生成定時Cron表達(dá)式工具類

    java時間解析生成定時Cron表達(dá)式工具類

    構(gòu)建Cron表達(dá)式 生成計劃的詳細(xì)描述 構(gòu)建Cron表達(dá)式 枚舉類 測試

    2024年02月08日
    瀏覽(100)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包