最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python高級語法之推導(dǎo)式+迭代器+生成器案例代碼

 更新時間:2026年01月24日 10:21:22   作者:重樓七葉一枝花_1200  
文章介紹了Python中的推導(dǎo)式和生成器,推導(dǎo)式用于簡潔地構(gòu)建容器,而生成器是一種惰性求值的迭代器,適用于處理大數(shù)據(jù)集,感興趣的朋友跟隨小編一起看看吧

推導(dǎo)式(comprehension)

推導(dǎo)式是 Python 的“語法糖”,用于簡潔地構(gòu)建容器。

推導(dǎo)式是一種獨特的數(shù)據(jù)處理方式,它將一個可迭代對象(如列表、元組、集合、字符串等)的元素,通過某種運算或條件篩選后構(gòu)建另一個新的數(shù)據(jù)序列的結(jié)構(gòu)體。

Python 支持各種數(shù)據(jù)結(jié)構(gòu)的推導(dǎo)式

類型語法返回類型
列表推導(dǎo)式[expr for item in iterable]list(立即求值,占內(nèi)存)
集合推導(dǎo)式{expr for item in iterable}set
字典推導(dǎo)式{k: v for k, v in iterable}dict
生成器表達(dá)式(expr for item in iterable)generator(惰性求值)

只有 圓括號 ( ) 的推導(dǎo)式 才是生成器。方括號 [ ] 是列表,花括號 { } 是集合或字典。

列表(list)推導(dǎo)式

my_list = [1, 2, 3, 4, 5, 6]
# 使用推導(dǎo)式,生成一個新的list帶條件的列表推導(dǎo)式
condition_squares = [x for x in my_list if x % 2 == 0]
print(f"帶條件的列表推導(dǎo)式:{condition_squares}")  # [2, 4, 6]
# 列表推導(dǎo)式(立即計算)
squares_list = [x+3 for x in range(5) if x > 2]
print(squares_list)# [6, 7]
# 基礎(chǔ)的列表推導(dǎo)式
basic_squares = (x**2 for x in range(5))
print(f"基礎(chǔ)的列表推導(dǎo)式2:{tuple(basic_squares)}")  # [0, 1, 4, 9, 16]
# 包含多個循環(huán)的列表推導(dǎo)式
continue1 = [1, 2, 3]
continue2 = ["a", "b", "c"]
tuple_list = [(i, j) for i in continue1 for j in continue2]
print(f"兩個循環(huán)的列表推導(dǎo)式:{tuple_list}") # [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]

元組(tuple)推導(dǎo)式

元組推導(dǎo)式和列表推導(dǎo)式的用法完全相同,只是元組推導(dǎo)式是用 () ,而列表推導(dǎo)式用的是 [],另外元組推導(dǎo)式返回的結(jié)果是一個生成器對象。

公式:

my_list = [1, 2, 3, 4, 5, 6]
# 使用推導(dǎo)式,生成一個新的tuple
condition_squares = (x for x in my_list if x % 2 == 0)
# 返回的是生成器對象  <generator object <genexpr> at 0x0000026A12285220>
print(condition_squares)
print(f"帶條件的需要tuple()進(jìn)行轉(zhuǎn)換的推導(dǎo)式:{tuple(condition_squares)}")

集合(set)推導(dǎo)式

公式:

my_list = [1,2,3,4,5,6]
# 使用推導(dǎo)式,生成一個新的tuple
condition_squares = {x for x in my_list if x % 2 == 0}
print(f"帶條件的推導(dǎo)式:{condition_squares}")

字典(dict)推導(dǎo)式

my_list = ['Google','Oracle', 'Taobao','Baidu']
#將列表中各字符串值為鍵,各字符串的長度為值,組成鍵值對
newdict = {key:len(key) for key in my_list}
print(f"f鍵值對推導(dǎo)式:{newdict}")

迭代器(Iterator)

是訪問集合元素的一種方式,是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。

在 Python 中,對象只要實現(xiàn)了 __iter__()__next__() 兩個魔術(shù)方法,就是迭代器。

  • __iter__():返回自身(支持 for 循環(huán))
  • __next__():返回下一個元素,若無則拋出 StopIteration

特點:

  • 惰性求值:只在需要時計算下一個值
  • 一次性:遍歷完就“耗盡”,不能重復(fù)使用
  • 省內(nèi)存:不一次性加載所有數(shù)據(jù)
'''
迭代器
迭代是 Python 最強大的功能之一,是訪問集合元素的一種方式。
迭代器是一個可以記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,迭代器只能往前不會后退,直到所有的元素被訪問完結(jié)束。
迭代器有兩個基本的方法:iter() 和 next()。
字符串,列表或元組對象都可用于創(chuàng)建迭代器:
'''
# 1 字符串,列表或元組對象都可用于創(chuàng)建迭代器:
my_list = [1, 2, 3, 4]
it = iter(my_list)    # 創(chuàng)建迭代器對象
print (next(it))   # 輸出迭代器的下一個元素
print (next(it))
# 如果再調(diào)用 next(it) 直到?jīng)]數(shù)據(jù),程序會報錯 StopIteration
# 2 迭代器對象可以使用常規(guī)for語句進(jìn)行遍歷:
my_tuples = (1, 2, 3, 4)
my_iterator = iter(my_tuples)    # 創(chuàng)建迭代器對象
for x in my_iterator:
    print (x, end=" ")

生成器(generator)

**生成器是最簡單的創(chuàng)建 **迭代器** 的方式。生成器表達(dá)式 **是 推導(dǎo)式的一種,它返回的是 生成器(即迭代器),而不是列表!

在 Python 中,使用了yield函數(shù)被稱為生成器(generator)。

跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器。
當(dāng)在生成器函數(shù)中使用 yield 語句時,函數(shù)的執(zhí)行將會暫停,并將 yield 后面的表達(dá)式作為當(dāng)前迭代的值返回。然后,每次調(diào)用生成器的 next() 方法或使用 for 循環(huán)進(jìn)行迭代時,函數(shù)會從上次暫停的地方繼續(xù)執(zhí)行,直到再次遇到 yield 語句。這樣,生成器函數(shù)可以逐步產(chǎn)生值,而不需要一次性計算并返回所有結(jié)果。調(diào)用一個生成器函數(shù),返回的是一個迭代器對象。返回迭代器的函數(shù),只能用于迭代操作。

工作原理:

當(dāng)調(diào)用生成器函數(shù)時,它返回迭代器的函數(shù)但不立即執(zhí)行;

每次調(diào)用next()時,執(zhí)行到下一個yield語句;

yield返回一個值并暫停函數(shù)執(zhí)行(保留所有局部狀態(tài));

再次調(diào)用next()時,執(zhí)行到下一個yield語句就從從暫停處繼續(xù)執(zhí)行;

這樣,生成器函數(shù)可以逐步產(chǎn)生值,而不需要一次性計算并返回所有結(jié)果。

案例代碼

'''
跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器。
當(dāng)在生成器函數(shù)中使用 yield 語句時,函數(shù)的執(zhí)行將會暫停,并將 yield 后面的表達(dá)式作為當(dāng)前迭代的值返回。
然后,每次調(diào)用生成器的 next() 方法或使用 for 循環(huán)進(jìn)行迭代時,函數(shù)會從上次暫停的地方繼續(xù)執(zhí)行,
直到再次遇到 yield 語句。這樣,生成器函數(shù)可以逐步產(chǎn)生值,而不需要一次性計算并返回所有結(jié)果。
調(diào)用一個生成器函數(shù),返回的是一個迭代器對象。
'''
def countdown(n):
    """
    countdown 函數(shù)是一個生成器函數(shù)。它使用 yield 語句逐步產(chǎn)生從 n 到 1 的倒數(shù)數(shù)字。
    在每次調(diào)用 yield 語句時,函數(shù)會返回當(dāng)前的倒數(shù)值,并在下一次調(diào)用時從上次暫停的地方繼續(xù)執(zhí)行。
    通過創(chuàng)建生成器對象并使用 next() 函數(shù)或 for 循環(huán)迭代生成器,我們可以逐步獲取生成器函數(shù)產(chǎn)生的值。
    在這個例子中,我們首先使用 next() 函數(shù)獲取前三個倒數(shù)值,然后通過 for 循環(huán)獲取剩下的兩個倒數(shù)值。
    生成器函數(shù)的優(yōu)勢是它們可以按需生成值,避免一次性生成大量數(shù)據(jù)并占用大量內(nèi)存。
    :param n:
    :return:
    """
    while n > 0:
        yield n
        n -= 1
# 創(chuàng)建生成器對象
generator = countdown(5)
print(type(generator))
# 通過迭代生成器獲取值
print(next(generator))  # 輸出: 5
print(next(generator))  # 輸出: 4
print(next(generator))  # 輸出: 3
# 使用 for 循環(huán)迭代生成器
for value in generator:
    print(value)  # 輸出: 2 1
# 生成器表達(dá)式(Generator Expression)
gen = (x * 2 for x in range(3))
print(type(gen))      # <class 'generator'>
print(list(gen))      # [0, 2, 4]

推導(dǎo)式和生成器區(qū)別

案例代碼

'''
推導(dǎo)式(comprehension) VS  生成器(generator)
'''
# 1 基本用法
# 列表推導(dǎo)式 - 立即創(chuàng)建完整列表
list_comp = [x * 2 for x in range(5)]
print("列表推導(dǎo)式:", list_comp)  # [0, 2, 4, 6, 8]
print("類型:", type(list_comp))  # <class 'list'>
# 元組推導(dǎo)式(生成器表達(dá)式),先生成器表達(dá)式 - 創(chuàng)建生成器對象
gen_expr = (x * 2 for x in range(5))
print("生成器表達(dá)式:", gen_expr)  # <generator object <genexpr> at 0x...>
# 生成器(generator)是一個返回迭代器(Iterator)的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器。
print(next(gen_expr))
print(next(gen_expr))
print(next(gen_expr))
print(next(gen_expr))
print(next(gen_expr))
# print(next(gen_expr)) # 超過了下表會如何?StopIteration
print("類型:", type(gen_expr))   # <class 'generator'>
print("元組推導(dǎo)式(生成器表達(dá)式):", tuple(gen_expr))  # (0, 2, 4, 6, 8) 如果前面next()迭代過了為空
print()
print()
# 2 內(nèi)存占用對比
import sys
CONST_1w = 10000
# 列表推導(dǎo)式 - 占用較多內(nèi)存
large_list = [x for x in range(100 * CONST_1w)]
print("列表內(nèi)存占用:", sys.getsizeof(large_list), "bytes")  # 約 8-9MB
# 元組推導(dǎo)式(生成器表達(dá)式) - 占用很少內(nèi)存
large_gen = (x for x in range(100 * CONST_1w))
print("生成器內(nèi)存占用:", sys.getsizeof(large_gen), "bytes")  # 約 100-200 bytes
print()
print()
# 3 執(zhí)行時機對比
def expensive_operation(x):
    print(f"計算 {x} 的平方...")
    return x * x
print("=== 列表推導(dǎo)式(立即執(zhí)行)===")
squares_list = [expensive_operation(x) for x in range(3)]
# 會立即打印所有"計算..."消息
print("=== 元組推導(dǎo)式(生成器表達(dá)式)(惰性執(zhí)行)===")
squares_gen = (expensive_operation(x) for x in range(3))
# 此時不會打印任何東西
print("元組推導(dǎo)式(生成器表達(dá)式):")
print(next(squares_gen))
print(next(squares_gen))
print(next(squares_gen))
for result in squares_gen:
    print("----->結(jié)果:", result)
#只有在迭代時才會執(zhí)行計算
# 4 可重用性對比
# 列表推導(dǎo)式 - 可重用
numbers_list = [1, 2, 3, 4, 5]
squared_list = [x*x for x in numbers_list]
print("列表推導(dǎo)式第一次遍歷:")
for num in squared_list:
    print(num)  # 1, 4, 9, 16, 25
print("列表推導(dǎo)式第二次遍歷:")
for num in squared_list:
    print(num)  # 可以再次遍歷
# 生成器表達(dá)式 - 通常一次性
squared_gen = (x*x for x in numbers_list)
print("元組推導(dǎo)式(生成器表達(dá)式)第一次遍歷:")
for num in squared_gen:
    print(num)  # 1, 4, 9, 16, 25
print("元組推導(dǎo)式(生成器表達(dá)式)第二次遍歷:")
for num in squared_gen:
    print(num)  # 不會輸出任何內(nèi)容(生成器已耗盡)

可迭代對象(Iterable)迭代器(Iterator)的區(qū)別:

** 特性 **** 可迭代對象(Iterable) **** 迭代器(Iterator) **
定義實現(xiàn)了 __iter__()方法的對象實現(xiàn)了 __iter__()__next__()方法的對象
功能可以被迭代可以記住迭代狀態(tài)并產(chǎn)生下一個值
內(nèi)存使用通常需要更多內(nèi)存惰性計算,節(jié)省內(nèi)存
數(shù)據(jù)消耗可以多次迭代通常只能迭代一次
示例列表、元組、字典、字符串文件對象、生成器

到此這篇關(guān)于Python高級語法之推導(dǎo)式+迭代器+生成器案例代碼的文章就介紹到這了,更多相關(guān)python推導(dǎo)式、迭代器、生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實現(xiàn)梯度下降法

    python實現(xiàn)梯度下降法

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)梯度下降法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 使用Python生成你的LaTeX公式基礎(chǔ)使用

    使用Python生成你的LaTeX公式基礎(chǔ)使用

    這篇文章主要介紹了使用Python生成你的LaTeX公式基礎(chǔ)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python高效實現(xiàn)Excel與TXT文本文件之間的數(shù)據(jù)轉(zhuǎn)換

    Python高效實現(xiàn)Excel與TXT文本文件之間的數(shù)據(jù)轉(zhuǎn)換

    Excel 文件和文本文件(TXT)在不同場景中各有優(yōu)勢,本文將通過實際操作,演示如何使用 Python 來實現(xiàn) Excel 和 TXT 文件之間的數(shù)據(jù)轉(zhuǎn)換,幫助你輕松掌握這一常見且實用的技巧
    2025-10-10
  • Pytorch之finetune使用詳解

    Pytorch之finetune使用詳解

    今天小編就為大家分享一篇Pytorch之finetune使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python+flask編寫一個簡單的登錄接口

    python+flask編寫一個簡單的登錄接口

    這篇文章主要介紹了python+flask編寫一個簡單的登錄接口,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • python實現(xiàn)windows下文件備份腳本

    python實現(xiàn)windows下文件備份腳本

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)windows下文件備份的腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python爬蟲HTTP代理使用教程詳解

    Python爬蟲HTTP代理使用教程詳解

    在爬蟲開發(fā)中,IP封鎖是開發(fā)者最常遇到的"攔路虎",本文將通過通俗易懂的實戰(zhàn)教程,帶你掌握HTTP代理的核心技術(shù),從原理到代碼實現(xiàn),助你輕松繞過反爬機制,提升數(shù)據(jù)采集效率,需要的朋友可以參考下
    2025-04-04
  • vscode 與pycharm 配置 autopep8自動格式化代碼

    vscode 與pycharm 配置 autopep8自動格式化代碼

    autopep8是一個可以將Python代碼自動排版為PEP8風(fēng)格第三方包,使用它可以輕松地排版出格式優(yōu)美整齊的代碼,這里就為大家分享一下具體的方法
    2023-09-09
  • Python3實現(xiàn)發(fā)送郵件和發(fā)送短信驗證碼功能

    Python3實現(xiàn)發(fā)送郵件和發(fā)送短信驗證碼功能

    這篇文章主要介紹了Python3實現(xiàn)發(fā)送郵件和發(fā)送短信驗證碼功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 8個讓Python代碼效率翻倍的簡單技巧

    8個讓Python代碼效率翻倍的簡單技巧

    這篇文章主要為大家詳細(xì)介紹了8個讓Python代碼效率翻倍的簡單技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以參考一下
    2026-01-01

最新評論

广宁县| 湘阴县| 遵化市| 莒南县| 松潘县| 上栗县| 壶关县| 晋宁县| 社旗县| 澄江县| 新闻| 邻水| 景宁| 天峨县| 宁晋县| 湖口县| 伊吾县| 张家港市| 青州市| 盱眙县| 双峰县| 高要市| 卢氏县| 防城港市| 南华县| 斗六市| 曲松县| 博罗县| 泰兴市| 海林市| 乌兰察布市| 邵武市| 清丰县| 丹东市| 贡觉县| 桐柏县| 海门市| 临沧市| 汉川市| 金昌市| 黎川县|