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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

四個(gè)鮮為人知的Python迭代過(guò)濾函數(shù)

來(lái)源: 責(zé)編: 時(shí)間:2023-09-28 10:08:43 286觀看
導(dǎo)讀簡(jiǎn)介在Python中,迭代器可以幫助你編寫(xiě)更多Pythonic的代碼,并在處理長(zhǎng)序列時(shí)提高效率。內(nèi)置的itertools模塊提供了幾個(gè)有用的函數(shù)來(lái)創(chuàng)建迭代器。【itertools】:https://docs.python.org/3/library/itertools.html當(dāng)你只需

簡(jiǎn)介

在Python中,迭代器可以幫助你編寫(xiě)更多Pythonic的代碼,并在處理長(zhǎng)序列時(shí)提高效率。內(nèi)置的itertools模塊提供了幾個(gè)有用的函數(shù)來(lái)創(chuàng)建迭代器。B8P28資訊網(wǎng)——每日最新資訊28at.com

【itertools】:https://docs.python.org/3/library/itertools.htmlB8P28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)你只需要遍歷迭代器、檢索序列中的元素并對(duì)其進(jìn)行處理,而無(wú)需將它們存儲(chǔ)在內(nèi)存中時(shí),這些函數(shù)尤其有用。今天本文將學(xué)習(xí)如何使用以下四個(gè)itertools過(guò)濾函數(shù):B8P28資訊網(wǎng)——每日最新資訊28at.com

  • filterfalse
  • takewhile
  • dropwhile
  • islice

接下來(lái)跟隨本文開(kāi)始吧!B8P28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片B8P28資訊網(wǎng)——每日最新資訊28at.com

在開(kāi)始之前:關(guān)于代碼示例的說(shuō)明

在本教程中:B8P28資訊網(wǎng)——每日最新資訊28at.com

我們將討論的所有四個(gè)函數(shù)都返回了迭代器。為了清楚起見(jiàn),本文將使用簡(jiǎn)單的序列,并使用list()獲取包含迭代器返回的所有元素的列表。但在處理長(zhǎng)序列時(shí),除非必要,否則請(qǐng)不要這樣做,因?yàn)檫@樣做會(huì)失去迭代器帶來(lái)的內(nèi)存節(jié)省。B8P28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于簡(jiǎn)單的謂詞函數(shù),也可以使用lambdas。但為了提高可讀性,本文將定義常規(guī)函數(shù)并將它們用作謂詞。B8P28資訊網(wǎng)——每日最新資訊28at.com

1. filterfalse

如果你在Python中編程已經(jīng)有一段時(shí)間了,可能已經(jīng)使用過(guò)內(nèi)置的filter函數(shù),語(yǔ)法如下:B8P28資訊網(wǎng)——每日最新資訊28at.com

filter(pred,seq)# pred:謂詞函數(shù)# seq:任何有效的Python可迭代對(duì)象

filter函數(shù)返回一個(gè)迭代器,該迭代器返回謂詞函數(shù)返回True的序列中的元素。B8P28資訊網(wǎng)——每日最新資訊28at.com

示例如下:B8P28資訊網(wǎng)——每日最新資訊28at.com

nums = list(range(1,11)) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]def is_even(n):    return n % 2 == 0

在這里,nums列表和is_even函數(shù)分別是序列和謂詞。B8P28資訊網(wǎng)——每日最新資訊28at.com

要獲取nums中所有偶數(shù)的列表,需要使用如下所示的filter:B8P28資訊網(wǎng)——每日最新資訊28at.com

nums_even = filter(is_even, nums)print(list(nums_even))
Output >>> [2, 4, 6, 8, 10]

現(xiàn)在跟隨本文來(lái)學(xué)習(xí)一下filterfalse。本文將從itertools模塊中導(dǎo)入filterfalse函數(shù)(以及本文將要討論的所有其他函數(shù))。B8P28資訊網(wǎng)——每日最新資訊28at.com

正如其名稱(chēng)所示,filterfalse執(zhí)行與filter函數(shù)相反的操作。它返回一個(gè)迭代器,該迭代器返回謂詞返回False的元素。以下是使用filterfalse函數(shù)的語(yǔ)法:B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import filterfalsefilterfalse(pred,seq)

is_even函數(shù)對(duì)于nums中的所有奇數(shù)返回False。因此,使用filterfalse得到的nums_odd列表是nums中所有奇數(shù)的列表:B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import filterfalsenums_odd = filterfalse(is_even, nums)print(list(nums_odd))
Output >>> [1, 3, 5, 7, 9]

2. takewhile

使用takewhile函數(shù)的語(yǔ)法如下:B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import takewhiletakewhile(pred,seq)

takewhile函數(shù)返回了一個(gè)迭代器,只要謂詞函數(shù)返回True,它就會(huì)返回元素。當(dāng)謂詞函數(shù)第一次返回False時(shí),它就停止返回元素。B8P28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于長(zhǎng)度為n的序列,如果seq[k]是第一個(gè)使謂詞函數(shù)返回False的元素,則迭代器會(huì)返回seq[0]、seq[1]、...、seq[k-1]。B8P28資訊網(wǎng)——每日最新資訊28at.com

考慮以下的nums列表和謂詞函數(shù)is_less_than_5。本文使用takewhile函數(shù),如下所示:B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import takewhiledef is_less_than_5(n):    return n < 5nums = [1, 3, 5, 2, 4, 6]filtered_nums_1 = takewhile(is_less_than_5, nums)print(list(filtered_nums_1))

在這里,謂詞is_less_than_5對(duì)于數(shù)字5首次返回False:B8P28資訊網(wǎng)——每日最新資訊28at.com

Output >>> [1, 3]

3. dropwhile

從功能上講,dropwhile函數(shù)的作用與takewhile函數(shù)相反。B8P28資訊網(wǎng)——每日最新資訊28at.com

以下是如何使用dropwhile函數(shù)的示例:B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import dropwhiledropwhile(pred,seq)

dropwhile函數(shù)返回一個(gè)迭代器,只要謂詞為T(mén)rue,該迭代器就會(huì)持續(xù)刪除元素。也就是說(shuō),迭代器在謂詞第一次返回False之前不返回任何元素。一旦謂詞返回False,迭代器就會(huì)返回序列中的所有后續(xù)元素。B8P28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于長(zhǎng)度為n的序列,如果謂詞函數(shù)第一次返回False的元素是seq[k],那么迭代器會(huì)返回seq[k]、seq[k+1]、…、seq[n-1]。B8P28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái)使用相同的序列和謂詞函數(shù):B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import dropwhiledef is_less_than_5(n):    return n < 5nums = [1, 3, 5, 2, 4, 6]filtered_nums_2 = dropwhile(is_less_than_5, nums)print(list(filtered_nums_2))

由于謂詞函數(shù)is_less_than_5第一次返回False是在元素5上,因此本文得到從5開(kāi)始的序列中的所有元素:B8P28資訊網(wǎng)——每日最新資訊28at.com

Output >>> [5, 2, 4, 6]

4. islice

你可能已經(jīng)熟悉了對(duì)Python可迭代對(duì)象(如列表、元組和字符串)進(jìn)行切片操作。切片的語(yǔ)法是:iterable[start:stop:step]。B8P28資訊網(wǎng)——每日最新資訊28at.com

然而,這種切片操作具有以下缺點(diǎn):B8P28資訊網(wǎng)——每日最新資訊28at.com

  • 在處理大型序列時(shí),每個(gè)切片或子序列都是一個(gè)占用內(nèi)存的副本,這可能會(huì)降低效率。
  • 由于步長(zhǎng)也可以取負(fù)值,使用起始、停止和步長(zhǎng)值會(huì)影響可讀性。

islice函數(shù)解決了上述限制:B8P28資訊網(wǎng)——每日最新資訊28at.com

  • 它返回一個(gè)迭代器。
  • 它不允許步長(zhǎng)取負(fù)值。

可以按以下方式使用islice函數(shù):B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import isliceislice(seq,start,stop,step)

下面是使用islice函數(shù)的幾種不同方式:B8P28資訊網(wǎng)——每日最新資訊28at.com

  • 使用islice(seq, stop)函數(shù)返回一個(gè)迭代器,該迭代器遍歷切片seq[0]、seq[1]、...、seq[stop - 1]。
  • 如果指定了起始和停止值:islice(seq, start, stop),該函數(shù)會(huì)返回一個(gè)迭代器,該迭代器遍歷切片seq[start]、seq[start + 1]、...、seq[start + stop - 1]。
  • 當(dāng)指定起始、停止和步長(zhǎng)參數(shù)時(shí),該函數(shù)返回一個(gè)迭代器,該迭代器遍歷切片seq[start]、seq[start + step]、seq[start + 2*step]、...、seq[start + k*step],其中start + k*step < stop且start + (k+1)*step >= stop。

接下來(lái)以一個(gè)示例列表來(lái)更好地理解這個(gè)問(wèn)題:B8P28資訊網(wǎng)——每日最新資訊28at.com

nums = list(range(10)) #[0,1, 2, 3, 4, 5, 6, 7, 8, 9]

現(xiàn)在,跟隨本文使用已學(xué)過(guò)的islice函數(shù)的語(yǔ)法。B8P28資訊網(wǎng)——每日最新資訊28at.com

僅使用停止值

這里本文只指定停止索引:B8P28資訊網(wǎng)——每日最新資訊28at.com

from itertools import islice# 僅指定停止索引sliced_nums = islice(nums, 5)print(list(sliced_nums))

以下是輸出結(jié)果:B8P28資訊網(wǎng)——每日最新資訊28at.com

Output >>> [0, 1, 2, 3, 4]

使用起始和停止值

在這里,本文同時(shí)使用起始值和停止值:B8P28資訊網(wǎng)——每日最新資訊28at.com

# 指定起始和停止索引sliced_nums = islice(nums, 2, 7)print(list(sliced_nums))

切片從索引2開(kāi)始,一直延伸到索引7但不包括索引7:B8P28資訊網(wǎng)——每日最新資訊28at.com

Output >>> [2, 3, 4, 5, 6]

使用起始、停止和步長(zhǎng)值

當(dāng)本文使用起始、停止和步長(zhǎng)值時(shí):B8P28資訊網(wǎng)——每日最新資訊28at.com

# 使用起始、停止和步長(zhǎng)sliced_nums = islice(nums, 2, 8, 2)print(list(sliced_nums))

得到一個(gè)從索引2開(kāi)始、一直延伸到索引8但不包括索引8的切片,步長(zhǎng)為2(每隔一個(gè)元素返回一次))。B8P28資訊網(wǎng)——每日最新資訊28at.com

Output >>> [2, 4, 6]

總結(jié)

希望本教程能幫助你理解itertools過(guò)濾函數(shù)的基礎(chǔ)知識(shí)。通過(guò)查看一些簡(jiǎn)單的示例,可以更好地理解這些函數(shù)的工作原理。B8P28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-11871-0.html四個(gè)鮮為人知的Python迭代過(guò)濾函數(shù)

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 越南獨(dú)立開(kāi)發(fā)者的傳奇征程:從失業(yè)到創(chuàng)業(yè)成功

下一篇: 20個(gè)IntelliJ IDEA最常用的導(dǎo)航功能(下)

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 南涧| 吴川市| 南涧| 台山市| 富顺县| 绿春县| 若尔盖县| 长武县| 高安市| 巴中市| 寿阳县| 泾川县| 农安县| 怀远县| 闽清县| 高邮市| 泰州市| 麟游县| 鸡东县| 营口市| 乐安县| 阆中市| 南安市| 分宜县| 托克逊县| 新巴尔虎右旗| 南昌县| 枣强县| 卢湾区| 姚安县| 罗定市| 南召县| 株洲市| 长顺县| 安龙县| 海伦市| 台山市| 耿马| 高青县| 宜春市| 泗洪县|