日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

簡潔編程之道,十個Python Itertools方法助你事半功倍

來源: 責編: 時間:2023-11-17 08:50:14 262觀看
導讀簡介Python的編程優勢在于它的簡潔性。這不僅是因為Python語法優雅,還因為它有許多精心設計的內置模塊,可以幫助開發者高效地實現常用功能。itertools模塊就是一個很好的例子,它為開發者提供了許多強大的工具,可以用更短

簡介

Python的編程優勢在于它的簡潔性。這不僅是因為Python語法優雅,還因為它有許多精心設計的內置模塊,可以幫助開發者高效地實現常用功能。3S728資訊網——每日最新資訊28at.com

itertools模塊就是一個很好的例子,它為開發者提供了許多強大的工具,可以用更短的代碼來操作Python的可迭代對象,幫助開發者事半功倍地完成任務。3S728資訊網——每日最新資訊28at.com

1. itertools.product():避免嵌套循環的巧妙方式

當程序變得越來越復雜時,可能需要編寫嵌套循環。與此同時,Python代碼將變得丑陋和難以閱讀:3S728資訊網——每日最新資訊28at.com

list_a = [1, 2020, 70]list_b = [2, 4, 7, 2000]list_c = [3, 70, 7]for a in list_a:    for b in list_b:        for c in list_c:            if a + b + c == 2077:                print(a, b, c)# 70 2000 7

如何改進上述代碼,使其具有Python風格?3S728資訊網——每日最新資訊28at.com

可以使用itertools.product()函數:3S728資訊網——每日最新資訊28at.com

from itertools import productlist_a = [1, 2020, 70]list_b = [2, 4, 7, 2000]list_c = [3, 70, 7]for a, b, c in product(list_a, list_b, list_c):    if a + b + c == 2077:        print(a, b, c)# 70 2000 7

如上所示,它返回輸入可迭代對象的笛卡爾積,幫助將3個嵌套的for循環合并為一個。3S728資訊網——每日最新資訊28at.com

2. itertools.compress():過濾數據的便捷方式

可以通過一個或多個循環來過濾列表中的項目。3S728資訊網——每日最新資訊28at.com

但有時候,可能不需要編寫任何循環,而是使用函數itertools.compress()。3S728資訊網——每日最新資訊28at.com

itertools.compress()函數返回一個迭代器,該迭代器根據對應的布爾掩碼值對可迭代對象進行過濾。3S728資訊網——每日最新資訊28at.com

例如,以下代碼使用itertools.compress()函數選擇真正的數據:3S728資訊網——每日最新資訊28at.com

import itertoolsleaders = ['Yang', 'Elon', 'Tim', 'Tom', 'Mark']selector = [1, 1, 0, 0, 0]print(list(itertools.compress(leaders, selector)))# ['Yang', 'Elon']

第二個參數selector作為一個掩碼,也可以定義為以下形式:3S728資訊網——每日最新資訊28at.com

selector = [True, True, False, False, False]

3. itertools.groupby():對可迭代對象進行分組

itertools.groupby()函數是將可迭代對象中相鄰的重復元素進行分組的一種便捷方式。3S728資訊網——每日最新資訊28at.com

例如,可以對一個長字符串進行如下分組:3S728資訊網——每日最新資訊28at.com

from itertools import groupbyfor key, group in groupby('YAaANNGGG'):    print(key, list(group))# Y ['Y']# A ['A']# a ['a']# A ['A']# N ['N', 'N']# G ['G', 'G', 'G']

此外,還可以利用它的第二個參數來告訴groupby()函數如何判斷兩個元素是否相同:3S728資訊網——每日最新資訊28at.com

from itertools import groupbyfor key, group in groupby('YAaANNGGG', lambda x: x.upper()):    print(key, list(group))# Y ['Y']# A ['A', 'a', 'A']# N ['N', 'N']# G ['G', 'G', 'G']

4. itertools.combinations():獲取可迭代對象中給定長度的所有組合

對于初學者來說,編寫一個正確的函數來獲取列表的所有可能組合可能需要一些時間。3S728資訊網——每日最新資訊28at.com

實際上,如果使用itertools.combinations()函數,可以很容易地實現:3S728資訊網——每日最新資訊28at.com

import itertoolsauthor = ['Y', 'a', 'n', 'g']result = itertools.combinations(author, 2)for x in result:    print(x)# ('Y', 'a')# ('Y', 'n')# ('Y', 'g')# ('a', 'n')# ('a', 'g')# ('n', 'g')

如上述程序所示,itertools.combinations()函數有兩個參數,一個是原始可迭代對象,另一個是函數生成的子序列的長度。3S728資訊網——每日最新資訊28at.com

5. itertools.permutations(): 獲取可迭代對象中給定長度的所有排列

既然有一個函數可以獲取所有組合,當然還有另一個名為itertools.permutations的函數可以獲取所有可能的排列:3S728資訊網——每日最新資訊28at.com

import itertoolsauthor = ['Y', 'a', 'n', 'g']result = itertools.permutations(author, 2)for x in result:    print(x)# ('Y', 'a')# ('Y', 'n')# ('Y', 'g')# ('a', 'Y')# ('a', 'n')# ('a', 'g')# ('n', 'Y')# ('n', 'a')# ('n', 'g')# ('g', 'Y')# ('g', 'a')# ('g', 'n')

如上所示,itertools.permutations()函數的使用方式與itertools.combinations()函數類似。唯一的區別在于它們的結果。3S728資訊網——每日最新資訊28at.com

6. itertools.accumulate():從可迭代對象生成累積項

基于可迭代對象獲取一系列累積值是一種常見的需求。借助itertools.accumulate()函數的幫助,不需要編寫任何循環就能實現。3S728資訊網——每日最新資訊28at.com

import itertoolsimport operatornums = [1, 2, 3, 4, 5]print(list(itertools.accumulate(nums, operator.mul)))# [1, 2, 6, 24, 120]

如果不想使用operator.mul,上述程序與以下程序相同:3S728資訊網——每日最新資訊28at.com

import itertoolsnums = [1, 2, 3, 4, 5]print(list(itertools.accumulate(nums, lambda a, b: a * b)))# [1, 2, 6, 24, 120]

7. itertools.repeat(), itertools.cycle(), itertools.count():創建無限迭代器

在某些情況下,開發者需要獲得一個無限迭代器。有3個函數可以幫助實現:3S728資訊網——每日最新資訊28at.com

7.1 itertools.repeat():重復生成相同的項目

例如,可以按以下方式獲取三個相同的“Yang”:3S728資訊網——每日最新資訊28at.com

import itertoolsprint(list(itertools.repeat('Yang', 3)))# ['Yang', 'Yang', 'Yang']

7.2 itertools.cycle():通過循環獲取無限迭代器

itertools.cycle函數在中斷循環之前不會停止:3S728資訊網——每日最新資訊28at.com

import itertoolscount = 0for c in itertools.cycle('Yang'):    if count >= 12:        break    else:        print(c, end=',')        count += 1# Y,a,n,g,Y,a,n,g,Y,a,n,g,

7.3 itertools.count():生成一個無限的數字序列

如果需要的只是數字,可以使用itertools.count函數:3S728資訊網——每日最新資訊28at.com

import itertoolsfor i in itertools.count(0, 2):    if i == 20:        break    else:        print(i, end=" ")# 0 2 4 6 8 10 12 14 16 18

如上所示,它的第一個參數是起始數字,第二個參數是步長。3S728資訊網——每日最新資訊28at.com

8. itertools.pairwise():輕松獲取成對的元組

自Python 3.10以來,itertools模塊新增了一個名為pairwise的新函數。它是一個簡潔的工具,可以從可迭代對象生成連續重疊的成對元素。3S728資訊網——每日最新資訊28at.com

import itertoolsletters = ['a', 'b', 'c', 'd', 'e']result = itertools.pairwise(letters)print(list(result))# [('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')]

9. itertools.takewhile():以不同的方式過濾元素

itertools.takewhile()返回一個迭代器,只要給定的謂詞函數評估為True,該迭代器就會生成可迭代對象中的元素。3S728資訊網——每日最新資訊28at.com

import itertoolsnums = [1, 61, 7, 9, 2077]print(list(itertools.takewhile(lambda x: x < 100, nums)))# [1, 61, 7, 9]

此函數與內置的filter()函數不同。3S728資訊網——每日最新資訊28at.com

filter函數將遍歷整個列表:3S728資訊網——每日最新資訊28at.com

nums = [1, 61, 7, 9, 2077]print(list(filter(lambda x: x < 10, nums)))# [1, 7, 9]

然而,itertools.takewhile函數會在評估函數為False時停止:3S728資訊網——每日最新資訊28at.com

import itertoolsnums = [1, 61, 7, 9, 2077]print(list(itertools.takewhile(lambda x: x < 10, nums)))# [1]

10. itertools.dropwhile():itertools.takewhile的反向操作

這個函數是上一個函數的逆操作。3S728資訊網——每日最新資訊28at.com

itertools.takewhile()函數在True時返回可迭代對象中的元素,而itertools.dropwhile()函數會在True時刪除可迭代對象的元素,并返回剩余的元素。3S728資訊網——每日最新資訊28at.com

import itertoolsnums = [1, 61, 7, 9, 2077]print(list(itertools.dropwhile(lambda x: x < 100, nums)))# [2077]

本文鏈接:http://www.www897cc.com/showinfo-26-27606-0.html簡潔編程之道,十個Python Itertools方法助你事半功倍

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SVGEdit:老牌開源 SVG 編輯器是如何架構的?

下一篇: Dapr:用于構建分布式應用程序的便攜式事件驅動運行時

標簽:
  • 熱門焦點
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 余承東:AI大模型技術的發展將會帶來下一代智能終端操作系統的智慧體驗

    8月4日消息,2023年華為開發者大會(HDC.Together)今天正式開幕,華為發布HarmonyOS 4、全新升級的鴻蒙開發套件、HarmonyOS Next開發者預覽版本等一系列
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
Top 主站蜘蛛池模板: 稻城县| 谢通门县| 朔州市| 丹凤县| 正镶白旗| 建始县| 兴海县| 电白县| 漯河市| 酒泉市| 新兴县| 当涂县| 怀来县| 石泉县| 清水河县| 锦屏县| 丰台区| 铜鼓县| 西充县| 景谷| 延寿县| 溧阳市| 义马市| 黄石市| 松阳县| 宁南县| 民勤县| 朝阳区| 巴马| 会理县| 海南省| 信丰县| 江都市| 林芝县| 浦北县| 涡阳县| 芮城县| 东乡| 寿宁县| 吉木萨尔县| 汉阴县|