成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

四個鮮為人知的Python迭代過濾函數

開發 前端
本文將介紹4個鮮為人知的Python Itertools過濾函數,以及為什么要學習如何使用它們來更優雅地過濾Python序列。

簡介

在Python中,迭代器可以幫助你編寫更多Pythonic的代碼,并在處理長序列時提高效率。內置的itertools模塊提供了幾個有用的函數來創建迭代器。

【itertools】:https://docs.python.org/3/library/itertools.html

當你只需要遍歷迭代器、檢索序列中的元素并對其進行處理,而無需將它們存儲在內存中時,這些函數尤其有用。今天本文將學習如何使用以下四個itertools過濾函數:

  • filterfalse
  • takewhile
  • dropwhile
  • islice

接下來跟隨本文開始吧!

圖片圖片

在開始之前:關于代碼示例的說明

在本教程中:

我們將討論的所有四個函數都返回了迭代器。為了清楚起見,本文將使用簡單的序列,并使用list()獲取包含迭代器返回的所有元素的列表。但在處理長序列時,除非必要,否則請不要這樣做,因為這樣做會失去迭代器帶來的內存節省。

對于簡單的謂詞函數,也可以使用lambdas。但為了提高可讀性,本文將定義常規函數并將它們用作謂詞。

1. filterfalse

如果你在Python中編程已經有一段時間了,可能已經使用過內置的filter函數,語法如下:

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

filter函數返回一個迭代器,該迭代器返回謂詞函數返回True的序列中的元素。

示例如下:

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函數分別是序列和謂詞。

要獲取nums中所有偶數的列表,需要使用如下所示的filter:

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

現在跟隨本文來學習一下filterfalse。本文將從itertools模塊中導入filterfalse函數(以及本文將要討論的所有其他函數)。

正如其名稱所示,filterfalse執行與filter函數相反的操作。它返回一個迭代器,該迭代器返回謂詞返回False的元素。以下是使用filterfalse函數的語法:

from itertools import filterfalse
filterfalse(pred,seq)

is_even函數對于nums中的所有奇數返回False。因此,使用filterfalse得到的nums_odd列表是nums中所有奇數的列表:

from itertools import filterfalse

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

2. takewhile

使用takewhile函數的語法如下:

from itertools import takewhile
takewhile(pred,seq)

takewhile函數返回了一個迭代器,只要謂詞函數返回True,它就會返回元素。當謂詞函數第一次返回False時,它就停止返回元素。

對于長度為n的序列,如果seq[k]是第一個使謂詞函數返回False的元素,則迭代器會返回seq[0]、seq[1]、...、seq[k-1]。

考慮以下的nums列表和謂詞函數is_less_than_5。本文使用takewhile函數,如下所示:

from itertools import takewhile

def is_less_than_5(n):
    return n < 5

nums = [1, 3, 5, 2, 4, 6]
filtered_nums_1 = takewhile(is_less_than_5, nums)
print(list(filtered_nums_1))

在這里,謂詞is_less_than_5對于數字5首次返回False:

Output >>> [1, 3]

3. dropwhile

從功能上講,dropwhile函數的作用與takewhile函數相反。

以下是如何使用dropwhile函數的示例:

from itertools import dropwhile
dropwhile(pred,seq)

dropwhile函數返回一個迭代器,只要謂詞為True,該迭代器就會持續刪除元素。也就是說,迭代器在謂詞第一次返回False之前不返回任何元素。一旦謂詞返回False,迭代器就會返回序列中的所有后續元素。

對于長度為n的序列,如果謂詞函數第一次返回False的元素是seq[k],那么迭代器會返回seq[k]、seq[k+1]、…、seq[n-1]。

接下來使用相同的序列和謂詞函數:

from itertools import dropwhile

def is_less_than_5(n):
    return n < 5

nums = [1, 3, 5, 2, 4, 6]
filtered_nums_2 = dropwhile(is_less_than_5, nums)
print(list(filtered_nums_2))

由于謂詞函數is_less_than_5第一次返回False是在元素5上,因此本文得到從5開始的序列中的所有元素:

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

4. islice

你可能已經熟悉了對Python可迭代對象(如列表、元組和字符串)進行切片操作。切片的語法是:iterable[start:stop:step]。

然而,這種切片操作具有以下缺點:

  • 在處理大型序列時,每個切片或子序列都是一個占用內存的副本,這可能會降低效率。
  • 由于步長也可以取負值,使用起始、停止和步長值會影響可讀性。

islice函數解決了上述限制:

  • 它返回一個迭代器。
  • 它不允許步長取負值。

可以按以下方式使用islice函數:

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

下面是使用islice函數的幾種不同方式:

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

接下來以一個示例列表來更好地理解這個問題:

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

現在,跟隨本文使用已學過的islice函數的語法。

僅使用停止值

這里本文只指定停止索引:

from itertools import islice

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

以下是輸出結果:

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

使用起始和停止值

在這里,本文同時使用起始值和停止值:

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

切片從索引2開始,一直延伸到索引7但不包括索引7:

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

使用起始、停止和步長值

當本文使用起始、停止和步長值時:

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

得到一個從索引2開始、一直延伸到索引8但不包括索引8的切片,步長為2(每隔一個元素返回一次))。

Output >>> [2, 4, 6]

總結

希望本教程能幫助你理解itertools過濾函數的基礎知識。通過查看一些簡單的示例,可以更好地理解這些函數的工作原理。

責任編輯:武曉燕 來源: Python學研大本營
相關推薦

2024-05-20 13:02:30

Python編程開發

2023-01-20 08:53:11

Linux文本編輯器終端

2024-06-05 10:35:24

Python字符串函數

2017-11-08 14:55:16

Linux命令sudo

2009-09-14 09:45:20

Chrome谷歌操作系統

2023-04-23 15:11:26

2014-07-29 14:25:43

Unix命令

2019-10-08 16:24:33

Chrome瀏覽器

2010-01-07 10:05:51

IT顧問特質

2018-12-10 19:30:45

2010-06-07 10:14:21

桌面虛擬化

2023-12-21 14:32:51

Python函數

2024-03-04 16:32:02

JavaScript運算符

2019-12-12 20:49:05

JavaScript語言運算符

2014-04-22 16:38:12

GitHubGitHub 使用技巧

2011-05-03 13:13:52

編程PHPJava

2013-07-15 09:14:00

2021-07-07 10:59:48

python代碼編程語言

2021-08-03 09:55:37

Python函數編程語言

2014-02-09 09:50:49

PHP函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女下面一进一出网站 | 国产成人免费视频 | 日韩在线不卡视频 | 日韩一区二区三区在线观看 | 9999国产精品欧美久久久久久 | 一区二区不卡高清 | 风间由美一区二区三区在线观看 | 色姑娘综合网 | www.久草.com| 一区二区三区国产 | 亚洲一区二区三区免费在线 | 成年人黄色小视频 | 中文字幕第90页 | 欧美一级视频免费看 | 自拍 亚洲 欧美 老师 丝袜 | 国产成人麻豆免费观看 | 欧美黄在线观看 | 欧美中文一区 | 色99视频 | 国产综合欧美 | 能看的av | 久久久精品网 | com.色.www在线观看 | 黄色网址免费在线观看 | 国产毛片毛片 | 亚洲成在线观看 | 亚洲日产精品 | 精品1区| 黄网站免费在线 | 青青草久久 | 国产精品中文 | 福利一区二区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 人人人艹 | 91视频在线看 | av日韩精品| 亚洲精品1区 | 秋霞电影一区二区三区 | 日本一区二区高清不卡 | 日本精品久久久久 | 日韩电影一区二区三区 |