色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

python語言表推導式和生成器表達式特性

麥辣雞腿堡 ? 來源:Python都知道 ? 作者:了不起 ? 2023-07-20 09:51 ? 次閱讀

今天我想向你介紹python語言的兩個非常有用的特性:列表推導式和生成器表達式。這兩個特性都可以讓你用一行簡潔的代碼來創建一個序列,而不需要寫循環或者函數。但是它們之間也有一些重要的區別,我們一起來看看吧。

列表推導式

列表推導式是一種用方括號包圍的表達式,它可以根據一個或多個迭代器來生成一個列表。例如,如果你想要生成一個包含1到10的平方數的列表,你可以這樣寫:

squares = [x**2 for x in range(1, 11)]
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

你也可以在列表推導式中加入條件判斷,來過濾掉一些不想要的元素。例如,如果你只想要生成偶數的平方數,你可以這樣寫:

even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)
# [4, 16, 36, 64, 100]

你還可以在列表推導式中使用多個迭代器,來生成笛卡爾積。例如,如果你想要生成兩個列表中所有可能的組合,你可以這樣寫:

colors = ["red", "green", "blue"]
shapes = ["circle", "square", "triangle"]
combinations = [(c, s) for c in colors for s in shapes]
print(combinations)
# [('red', 'circle'), ('red', 'square'), ('red', 'triangle'), ('green', 'circle'), ('green', 'square'), ('green', 'triangle'), ('blue', 'circle'), ('blue', 'square'), ('blue', 'triangle')]

列表推導式的優點是它可以快速地創建一個列表,并且語法簡潔易讀。但是它也有一個缺點,就是它會一次性地把所有的元素都存儲在內存中,這可能會占用很多空間,尤其是當生成的列表很大或者無限時。這時候,我們就可以使用生成器表達式來解決這個問題。

生成器表達式是一種用圓括號包圍的表達式,它和列表推導式非常相似,只是它不會立即生成一個列表,而是返回一個生成器對象。生成器對象是一種特殊的迭代器,它可以按需地產生下一個元素,而不需要提前計算和存儲所有的元素。例如,如果你想要生成一個包含1到10的平方數的生成器對象,你可以這樣寫:

squares_gen = (x**2 for x in range(1, 11))
print(squares_gen)
# < generator object < genexpr > at 0x000001F7E8C6D740 >

注意,這里打印出來的不是一個列表,而是一個生成器對象。如果你想要獲取生成器對象中的元素,你可以使用next()函數或者for循環來遍歷它。例如:

print(next(squares_gen))
# 1
print(next(squares_gen))
# 4
for square in squares_gen:
    print(square)
# 9
# 16
# ...

注意,每次調用next()函數或者遍歷生成器對象時,它都會動態地計算下一個元素,并且記住當前的狀態。

生成器表達式

生成器表達式的語法和列表推導式基本一致,只是用圓括號代替方括號。你也可以在生成器表達式中加入條件判斷和多個迭代器,就像列表推導式一樣。例如:

even_squares_gen = (x**2 for x in range(1, 11) if x % 2 == 0)
combinations_gen = ((c, s) for c in colors for s in shapes)

生成器表達式的優點是它可以節省內存空間,因為它不會一次性地創建一個列表,而是按需地產生下一個元素。這樣,你就可以處理很大或者無限的序列,而不需要擔心內存溢出。例如,如果你想要生成一個無限的斐波那契數列,你可以這樣寫:

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

fib_gen = (x for x in fib())

注意,這里我們使用了一個生成器函數來定義斐波那契數列,然后用一個生成器表達式來包裝它。生成器函數是一種使用yield語句來返回值的函數,它也會返回一個生成器對象。生成器函數和生成器表達式都是生成器的兩種不同的寫法,它們都可以用來創建惰性求值的序列。

生成器表達式的另一個優點是它可以提高性能,因為它可以避免不必要的計算和中間變量。例如,如果你想要計算一個序列中所有元素的和,你可以這樣寫:

total = sum([x**2 for x in range(1, 11)])

但是這樣會先創建一個列表,然后再對列表中的元素求和,這樣會浪費時間和空間。如果你使用生成器表達式,你可以這樣寫:

total = sum(x**2 for x in range(1, 11))

這樣就不會創建一個列表,而是直接把每個元素的平方數傳給sum()函數,這樣會更快更省空間。事實上,很多內置的函數都可以接受一個生成器作為參數,例如min(),
max(), all(), any()等等。你也可以把一個生成器傳給list()函數或者set()函數來轉換成一個列表或者集合。

總結

圖片

我可以用一個餐廳的例子來比喻列表推導式和生成器表達式。假設你是一個餐廳的老板,你想要給你的客人提供一份菜單,讓他們選擇自己喜歡的菜品。你有兩種方式來制作菜單:

  • 一種是使用列表推導式,也就是提前把所有的菜品都做好,然后放在一個大盤子里,讓客人自由挑選。這樣的好處是客人可以看到所有的菜品,也可以多次取用,而且速度很快。但是這樣的壞處是你需要占用很多的廚房空間和食材,而且有些菜品可能會變涼或者變質,造成浪費。
  • 另一種是使用生成器表達式,也就是根據客人的需求,現場做出一個菜品,然后送到客人的桌子上。這樣的好處是你不需要占用很多的廚房空間和食材,而且每個菜品都是新鮮的,不會浪費。但是這樣的壞處是客人不能看到所有的菜品,也不能多次取用,而且速度可能會慢一些。

所以,你應該根據不同的情況來選擇合適的方式來制作菜單。如果你有很多的客人,而且他們都喜歡吃不同的菜品,那么你可能更適合使用列表推導式。如果你只有少數的客人,而且他們都喜歡吃新鮮的菜品,那么你可能更適合使用生成器表達式。

總之,列表推導式和生成器表達式都是非常有用的特性,它們可以讓你用一行簡潔的代碼來創建一個序列。列表推導式適合于需要多次遍歷或者操作的序列,而生成器表達式適合于只需要遍歷一次或者處理很大或者無限的序列。你應該根據不同的場景來選擇合適的方式來提高你的代碼效率和可讀性。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    84958
  • 迭代器
    +關注

    關注

    0

    文章

    44

    瀏覽量

    4336
收藏 人收藏

    評論

    相關推薦

    Java Lambda表達式的新特性

    Java Lambda表達式是Java 8中最重要的新特性之一。 它們是一種可傳遞的匿名函數,可以作為參數傳遞給方法或存儲在變量中,因此可以在需要的時候調用它們。 基礎 1. 簡介 Lambda
    的頭像 發表于 09-30 10:29 ?2627次閱讀

    表達式求值是什么意思

    嵌入C語言入門——表達式求值
    發表于 12-15 06:24

    python生成器

    GEN_CREATED # 生成器已創建,還未被激活GEN_RUNNING # 解釋器正在執行(只有在多線程應用中才能看到這個狀態)GEN_SUSPENDED # 在 yield 表達式處暫停GEN_CLOSED
    發表于 02-24 15:56

    初識 Python 正則表達式

    風格的正則表達式模式。re 模塊使 Python 語言擁有全部的正則表達式功能。下面通過實例,一步一步來初步認識正則表達式。比如在一段字符
    發表于 03-17 16:44

    防范表達式的失控

    在C 語言中,表達式是最重要的組成部分之一,幾乎所有的代碼都由表達式構成。表達式的使用如此廣泛,讀者也許會產生這樣的疑問,像+ 、- 、3 、/ 、& & 這樣簡單的運算也會出現
    發表于 04-22 16:57 ?13次下載

    Python正則表達式教程之標準庫的完整介紹及使用示例說明

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫
    發表于 01-23 16:00 ?3次下載
    <b class='flag-5'>Python</b>正則<b class='flag-5'>表達式</b>教程之標準庫的完整介紹及使用示例說明

    Python正則表達式的學習指南

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫
    發表于 09-15 08:00 ?0次下載
    <b class='flag-5'>Python</b>正則<b class='flag-5'>表達式</b>的學習指南

    Python正則表達式指南

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫
    發表于 03-26 09:13 ?10次下載
    <b class='flag-5'>Python</b>正則<b class='flag-5'>表達式</b>指南

    python生成器是什么

    in range(5)) gen at 0x10cae50b0 2. 如何創建生成器? 使用列表推導 在上面已經演示過,正常我們使用列表推導
    的頭像 發表于 02-24 15:53 ?3695次閱讀

    C語言如何使用正則表達式

    C語言的正則表達式規則,特此跟大家分享。
    的頭像 發表于 03-16 08:41 ?4985次閱讀

    初識 Python 正則表達式

    風格的正則表達式模式。re 模塊使 Python 語言擁有全部的正則表達式功能。 下面通過實例,一步一步來初步認識正則表達式。 比如在一段
    的頭像 發表于 03-17 16:44 ?1455次閱讀

    C語言表達式

    在C語言中,表達式是由操作符和操作數組成。表達式可以由一個或者多個操作數組成,不同的操作符與操作數組成不同的表達式,因此,表達式才是C
    的頭像 發表于 02-21 15:09 ?1416次閱讀
    C<b class='flag-5'>語言</b>的<b class='flag-5'>表達式</b>

    Python中的Lambda表達式

    Python 中,Lambda 表達式是一種非常強大的工具,它可以讓你快速創建小型匿名函數,而不需要顯地定義函數名稱。Lambda 表達式通常用于傳遞函數對象或簡單的函數
    的頭像 發表于 04-19 15:49 ?860次閱讀

    Python中的正則表達式

    哈嘍大家好,我是了不起,今天給大家講Python中的正則表達式Python中,正則表達式是一種強大的文本處理工具,它可以用來匹配、搜索、替換文本。正則
    的頭像 發表于 06-21 16:52 ?1022次閱讀

    Python 支持同步的推導版本

    PEP-492 和 PEP-525 通過 async/await 語法,引入了對原生協程和異步生成器的支持。本 pep 提議給列表、集合、字典解析生成器表達式添加異步的版本。 基本
    的頭像 發表于 10-31 14:37 ?314次閱讀
    主站蜘蛛池模板: 手机在线亚洲日韩国产 | 国产精品青草久久福利不卡 | 麻豆高清区在线 | 人妻天天爽夜夜爽三区麻豆A片 | 久久青青草原 | 黄色a一级视频 | 最近中文字幕完整版免费高清 | 亚洲免费福利在线视频 | 扒开女生尿口 | 中文字幕伊人香蕉在线 | 国外经典三级 | 啪啪漫画无遮挡全彩h网站 啪啪漫画无遮挡全彩h同人 | 野草观看免费高清视频 | 24小时日本高清免费看 | 国产精品1区在线播放 | 老板揉搓秘书丰满大乳 | 欧美精品久久久久性色AV苍井 | 韩国伦理三级 | 午夜视频无码国产在线观看 | 99re热有精品国产 | 国产在线一区二区AV视频 | 97综合久久| 国产精品18久久久久久欧美网址 | 久久免费看少妇级毛片蜜臀 | 同房交换4p好爽 | 一个人免费完整观看日本 | 阿娇和冠希13分钟在线观看 | 玄幻全黄h全肉后宫 | 精品国产自在自线官方 | 青青青草免费 | 好湿好滑好硬好爽好深视频 | 久久人人爽人人片AV人成 | 99视频在线精品免费观看18 | 97人妻在线公开视频在线观看 | 久久久久亚洲日日精品 | 男人插女人动态 | 中文字幕中文字幕永久免费 | 色噜噜狠狠色综合中文字幕 | 国产在线亚洲v天堂a | 国产精品亚洲一区二区三区久久 | 极品少妇小泬50PTHEPON |