【Python】itertools模塊,補充:可迭代對象、迭代器

Python中 itertools模塊創建高效迭代器、處理序列數據集。

此模塊所有函數返回迭代器,可用for循環獲取迭代器中的內容,也可用list(...)用列表形式顯示內容。

import itertools[ x for x in dir(itertools) if not x.startswith('_')]
# 結果:
['accumulate', 'chain', 'combinations', 'combinations_with_replacement', 
'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 
'islice', 'pairwise', 'permutations', 'product', 'repeat', 'starmap',
'takewhile', 'tee', 'zip_longest']

【Python】itertools模塊

1、chain 【鏈接多個可迭代對象】

chain(可迭代對象1, 可迭代對象2, ...):返回一個迭代器,包含參數中的所有可迭代對象的內容。

from itertools import *a = [1,2,3,4,5]
b = ["a","b","c","d","e"]chain(a,b)                          # 結果:<itertools.chain object at 0x0000020AD8E77010>
list(chain(a,b))                    # 結果:[1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e']
# 或者
for x in chain(a,b):print(x)
# 結果:
1
2
3
4
5
a
b
c
d
e

若不能提前確定所有可迭代對象,或需要懶方法計算,則使用chain.from_iterable(...)。

from itertools import *# 有yield的函數視為生成器,需用next()方法或for循環才開始執行函數。(控制內存占用,且簡潔)
def new_iterable():yield [1,2,3]yield ["a","b","c"]for x in chain.from_iterable(new_iterable()):print(x)
# 結果:
1
2
3
a
b
c

2、zip_longest 【類似zip】

內置函數zip()。

zip(可迭代對象1, 可迭代對象2, ...):返回一個迭代器,將多個可迭代對象中的元素,按對應位置一一組成元組形式。若其中一個可迭代對象處理完,則停止。

from itertools import *a = [1,2,3]
b = ["a","b","c","d","e"]list(zip(a,b))                  # 結果:[(1, 'a'), (2, 'b'), (3, 'c')]

zip_longest(可迭代對象1, 可迭代對象2, ...):類似zip。但將所有可迭代對象處理完,若有缺失值則用None填充。可用fillvalue參數指定空缺默認值。

from itertools import *a = [1,2,3]
b = ["a","b","c","d","e"]list(zip_longest(a,b))
# 結果:[(1, 'a'), (2, 'b'), (3, 'c'), (None, 'd'), (None, 'e')]
list(zip_longest(a,b,fillvalue=999))
# 結果:[(1, 'a'), (2, 'b'), (3, 'c'), (999, 'd'), (999, 'e')]

3、starmap 【類似map】

內置函數map()。

map(函數,可迭代對象1, 可迭代對象2, ...):返回一個迭代器,將多個可迭代對象中的元素,依次調用函數處理。若其中一個可迭代對象處理完,則停止。

注:多個可迭代對象,是函數中涉及多個可迭代對象。若函數中只涉及一個可迭代對象,則map參數中只能有一個可迭代對象。

from itertools import *a = [1,2,3,4,5]
list(map(lambda x:x**3,a))          # 結果:[1, 8, 27, 64, 125]a = "hello"
b = "world world"
list(map(lambda x,y:(x,y,x+y),a,b))
# 結果:[('h', 'w', 'hw'), ('e', 'o', 'eo'), ('l', 'r', 'lr'), ('l', 'l', 'll'), ('o', 'd', 'od')]for value in map(lambda x,y:(x,y,x+y),a,b):print('{}+{}->{}'.format(*value))
# 或者
# for x,y,z in map(lambda x,y:(x,y,x+y),a,b):
#     print('{}+{}->{}'.format(x,y,z))
# 結果:
h+w->hw
e+o->eo
l+r->lr
l+l->ll
o+d->od

starmap(函數,可迭代對象):類似map()。區別是:map中的參數是函數和一個或多個可迭代對象,將可迭代對象的每個元素作為單個參數傳遞給函數即fun(a,b);而starmap中的參數是函數和一個元組形式的可迭代對象,將可迭代對象的每個元組解包成多個參數傳遞給函數即fun(*c)。

from itertools import *c = [('h', 'w'), ('e', 'o'), ('l', 'r'), ('l', 'l'), ('o', 'd')]
list(starmap(lambda x,y:(x,y,x+y),c))
# 結果:[('h', 'w', 'hw'), ('e', 'o', 'eo'), ('l', 'r', 'lr'), ('l', 'l', 'll'), ('o', 'd', 'od')]for x in starmap(lambda x,y:(x,y,x+y),c):print(x)
# 結果:
('h', 'w', 'hw')
('e', 'o', 'eo')
('l', 'r', 'lr')
('l', 'l', 'll')
('o', 'd', 'od')for value in starmap(lambda x,y:(x,y,x+y),c):print('{}+{}->{}'.format(*value))
# 或者
# for x,y,z in starmap(lambda x,y:(x,y,x+y),c):
#     print('{}+{}->{}'.format(x,y,z))
# 結果:
h+w->hw
e+o->eo
l+r->lr
l+l->ll
o+d->od

4、islice 【類似切片】

  • islice(可迭代對象, end):返回一個迭代器,從可迭代對象中獲取從0到end(不含)的元素。
  • islice(可迭代對象, start, end):返回一個迭代器,從可迭代對象中獲取起始位置start(含)到結束位置end(不含)的元素。若end是None,則一直到可迭代對象結束。
  • islice(可迭代對象, start, end, step):返回一個迭代器,從可迭代對象中獲取起始位置start(含)到結束位置end(不含)且步長間隔step的元素。若end是None,則一直到可迭代對象結束。
from itertools import *list(islice(range(10),5))               # 結果:[0, 1, 2, 3, 4]
list(islice(range(10),5,8))             # 結果:[5, 6, 7]
list(islice(range(10),5,None))          # 結果:[5, 6, 7, 8, 9]
list(islice(range(10),0,8,2))           # 結果:[0, 2, 4, 6]
list(islice(range(10),0,None,2))        # 結果:[0, 2, 4, 6, 8]

?5、accumulate 【累加和】

  • accumulate(可迭代對象):返回一個迭代器,對每個元素依次進行累加和并返回結果。
  • accumulate(可迭代對象, initial=num):返回一個迭代器,在num基礎上再對每個元素依次進行累加和并返回結果。
  • accumulate(可迭代對象,?函數):返回一個迭代器,對每個元素依次調用函數并返回結果。
from itertools import *
import operatorlist(accumulate(range(10)))      # 結果:[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
list(accumulate("abcdefg"))      # 結果:['a', 'ab', 'abc', 'abcd', 'abcde', 'abcdef', 'abcdefg']# 在100的基礎上,再進行0-9累加和
list(accumulate(range(10),initial=100))    # 結果:[100, 100, 101, 103, 106, 110, 115, 121, 128, 136, 145]# 1-5累積相乘
list(accumulate(range(1,6),operator.mul))   # 結果:[1, 2, 6, 24, 120]

6、count 【無限生成連續的整數】

  • count():返回一個迭代器,無限生成連續的整數,從0開始。
  • count(start):返回一個迭代器,無限生成連續的整數,從start開始。
  • count(start,step):返回一個迭代器,無限生成連續的整數,從start開始步長間隔step。
from itertools import *for x in zip(count(),["ab","cd","ef"]):print(x)
# 結果:
(0, 'ab')
(1, 'cd')
(2, 'ef')list(islice(count(1,4),5))             # 結果:[1, 5, 9, 13, 17]

注解:zip()最短的可迭代對象處理完就停止。count()無限生成連續的整數,但["ab","cd","ef"]長度只有3,處理完就停止。

7、cycle? 【無限循環】

cycle(可迭代對象):?返回一個迭代器,將可迭代對象無限循環。

from itertools import *list(zip(range(10),cycle("good")))
# 結果:
[(0, 'g'), (1, 'o'), (2, 'o'), (3, 'd'), (4, 'g'), (5, 'o'), (6, 'o'), (7, 'd'), (8, 'g'), (9, 'o')]list(zip(range(10),cycle(["a","b"])))
# 結果:
[(0, 'a'), (1, 'b'), (2, 'a'), (3, 'b'), (4, 'a'), (5, 'b'), (6, 'a'), (7, 'b'), (8, 'a'), (9, 'b')]

8、repeat 【重復】

?repeat(需重復的數據, num):返回一個迭代器,重復num次。

repeat(n):也可為map或zip提供常量值流(a stream of constant values)。

from itertools import *
from operator import powlist(repeat('abc', 5))         # 結果:['abc', 'abc', 'abc', 'abc', 'abc']
list(repeat(1,5))              # 結果:[1, 1, 1, 1, 1]# 將列表中的數字求3次冪,num**3
a = [1,2,3]
list(map(pow,a,repeat(3)))     # 結果:[1, 8, 27]

9、product 【笛卡爾積】

  • product(可迭代對象1,?可迭代對象2, ...):返回一個迭代器,將多個可迭代對象中的元素依次一一組成元組。
  • product(可迭代對象, repeat=num):返回一個迭代器,將一個可迭代對象和自身進行笛卡爾積。
from itertools import *a = [1,2,3]
b = ["a","b"]
c = "hello"
list(product(a,b,c))
# 結果:
[(1, 'a', 'h'), (1, 'a', 'e'), (1, 'a', 'l'), (1, 'a', 'l'), (1, 'a', 'o'),
(1, 'b', 'h'), (1, 'b', 'e'), (1, 'b', 'l'), (1, 'b', 'l'), (1, 'b', 'o'),
(2, 'a', 'h'), (2, 'a', 'e'), (2, 'a', 'l'), (2, 'a', 'l'), (2, 'a', 'o'), 
(2, 'b', 'h'), (2, 'b', 'e'), (2, 'b', 'l'), (2, 'b', 'l'), (2, 'b', 'o'),
(3, 'a', 'h'), (3, 'a', 'e'), (3, 'a', 'l'), (3, 'a', 'l'), (3, 'a', 'o'), 
(3, 'b', 'h'), (3, 'b', 'e'), (3, 'b', 'l'), (3, 'b', 'l'), (3, 'b', 'o')]a = [1,2,3]
list(product(a, repeat=2))      # 相當于 list(product(a,a))
# 結果:
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

10、permutations 【指定長度的排列組合】

permutations(可迭代對象):返回一個迭代器,將元素重新排列且長度為可迭代對象的長度的所有組合,組合以元組形式。

permutations(可迭代對象, n):返回一個迭代器,將元素重新排列且長度為n的所有組合,組合以元組形式。

from itertools import *a = [1,2,3]
list(permutations(a))
# 結果:
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]list(permutations(a,2))
# 結果:
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

11、combinations 【指定長度的排列組合,沒有重復值】

combinations(可迭代對象,r=num):類似permutations。但組合中沒有重復值(重復值為元組中元素相同但元素順序不同,例如(1,2)和(2,1)為重復值)。

注意:r參數為必需參數,指定長度。

from itertools import *a = [1,2,3]
list(combinations(a,r=2))      # 結果:[(1, 2), (1, 3), (2, 3)]
list(combinations(a,2))        # 結果:[(1, 2), (1, 3), (2, 3)]

permutations_with_replacement(可迭代對象,r=num):類似combinations()。但有重復元素的組合(例如(1,1)和(2,2))。

from itertools import *a = [1,2,3]
list(combinations_with_replacement(a,r=2))      # 結果:[(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]

12、pairwise? 【依次生成連續的兩個元素】

pairwise(可迭代對象):返回一個迭代器,依次生成連續兩個元素的組合。若可迭代對象中的元素小于2個,則返回的迭代器為空。

from itertools import *a = [1,2,3,4,5,6]
list(pairwise(a))       # 結果:[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]b = "hello"
list(pairwise(b))       # 結果:[('h', 'e'), ('e', 'l'), ('l', 'l'), ('l', 'o')]c = "w"
list(pairwise(c))       # 結果:[]

13、takewhile【返回滿足條件的,舍棄第一個False之后的所有元素】

takewhile(predicate,?可迭代對象):返回一個迭代器,若predicate返回True,則返回該元素,一旦碰到predicate返回False,則終止。

from itertools import *a = [3,6,7,8,9]
list(takewhile(lambda x: x%3==0, a))       # 結果:[3, 6]

14、dropwhile【丟棄滿足條件的,返回第一個False之后的所有元素】

?dropwhile(predicate,?可迭代對象):返回一個迭代器,若predicate返回True,則丟棄該元素,一旦碰到predicate返回False,則終止,返回后面的全部元素。

from itertools import *a = [3,6,7,8,9]
list(dropwhile(lambda x: x%3==0, a))       # 結果:[7, 8, 9]

15、filterfalse 【只返回不滿足條件的元素】

內置函數filter()。

filtler(predicate,?可迭代對象):返回一個迭代器,只返回滿足條件的元素。

from itertools import *a = [3,6,7,8,9]
list(filter(lambda x: x%3==0, a))          # 結果:[3, 6, 9]

?filterfalse(predicate,?可迭代對象):返回一個迭代器,只返回不滿足條件的元素。

from itertools import *a = [3,6,7,8,9]
list(filterfalse(lambda x: x%3==0, a))       # 結果:[7, 8]

16、compress? 【通過選擇器,返回需要的數據】

compress(數據,?選擇器):以選擇器作為篩選,來返回數據中符合的數據。

from itertools import *a = [3,6,7,8,9]
b = cycle([False,True])       # 即 False,True, False,True, False,True...
list(compress(a, b))          # 結果:[6, 8]

17、groupby? 【分組】

groupby(可迭代對象,?分組內容):根據分組內容進行分組,返回一個迭代器,迭代器中的元素是元組,(分組內容,?以列表顯示對應的值)。

注意:分組之前,注意排序。

from itertools import *a = [1,2,2,3,1,2]
b = islice(count(),8)
ab = list(zip(a,b))
ab                               # 結果:[(1, 0), (2, 1), (2, 2), (3, 3), (1, 4), (2, 5)]for k,v in groupby(ab,lambda x:x[0]):print(k,list(v))
# 結果:
1 [(1, 0)]
2 [(2, 1), (2, 2)]
3 [(3, 3)]
1 [(1, 4)]
2 [(2, 5)] ab.sort()
ab                               # 結果:[(1, 0), (1, 4), (2, 1), (2, 2), (2, 5), (3, 3)]for k,v in groupby(ab,lambda x:x[0]):print(k,list(v))
# 結果:
1 [(1, 0), (1, 4)]
2 [(2, 1), (2, 2), (2, 5)]
3 [(3, 3)]

18、tee 【一個輸入分解成多個相同的輸出流】

變量1,?變量2,... = tee(可迭代對象, n=num):返回元組形式,元組中元素是迭代器。將一個輸入分解成num個相同的輸出流。默認n=2。類似于UNIX?tee工具。

注意:① 使用tee()生成新的迭代器,原來的可迭代對象不應再使用。

? ? ? ? ? ② tee()生成的迭代器,不是線程安全的,且需大量輔助存儲。

from itertools import *a = [1,2,3,4,5]m,n = tee(a)                 # 相當于 m,n = tee(a,2) 
list(m)                      # 結果:[0, 1, 2, 3, 4, 5, 6, 7]
list(n)                      # 結果:[0, 1, 2, 3, 4, 5, 6, 7]
list(m) == list(n)           # 結果:True
m is n                       # 結果:False

補充:可迭代對象、迭代器

可迭代對象

滿足__iter__( )方法的對象。即可用for循環遍歷的對象。

例如:列表、字符串、文件等。

迭代器

同時滿足__iter__( )方法和__next__( )方法的對象。即可用for循環遍歷又可用next()獲取下一個值的對象。

可迭代對象不一定是迭代器,迭代器一定是可迭代對象。

可迭代對象轉為迭代器:iter(可迭代對象)

判斷是否是可迭代對象:isinstance(對象, collections.abc.Iterable)

判斷是否是迭代器:isinstance(對象, collections.abc.Iterator)

from collections.abc import Iterator, Iterableisinstance("hello",Iterable)            # 結果:True
isinstance("hello",Iterator)            # 結果:Falseisinstance(iter("hello"),Iterator)      # 結果:True

參考:Pydoc: built-in module itertools

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166072.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是網絡爬蟲技術?它的重要用途有哪些?

網絡爬蟲&#xff08;Web Crawler&#xff09;是一種自動化的網頁瀏覽程序&#xff0c;能夠根據一定的規則和算法&#xff0c;從互聯網上抓取和收集數據。網絡爬蟲技術是隨著互聯網的發展而逐漸成熟的一種技術&#xff0c;它在搜索引擎、數據挖掘、信息處理等領域發揮著越來越重…

Centos/Linux安裝Apahce出現bug匯總

源碼安裝Apache軟件 使用軟件&#xff1a;Apahce2.4.58&#xff0c;apr1.5.2&#xff0c; apr-util1.5.4 1.下載apr、apr-util和Apache軟件&#xff1b; 2.安裝apr壓縮包&#xff0c;步驟如下&#xff1a; 第一、解壓縮 tar zxvf apr-1.5.2.tar.gz第二、安裝 cd /usr/local/sr…

RAID的應用場景以及優缺點

RAID 0(條帶化)&#xff1a; 工作原理&#xff1a; 數據被分成塊&#xff0c;每個塊寫入不同的驅動器&#xff0c;以并行方式提高讀寫性能。 優勢&#xff1a; 卓越的性能提升&#xff0c;特別是對于大型文件的讀寫操作。 劣勢&#xff1a; 完全沒有冗余&#xff0c;一個驅動器…

MFC 中創建并顯示二維碼

1.創建并顯示 QRcode* pQR_Encode; pQR_Encode QRcode_encodeString("12345678901234567890", 0, QR_ECLEVEL_H, QR_MODE_8, 1); if (pQR_Encode) { int nBmpWidth pQR_Encode->width; //獲取控件的邊界大小 CRect rect; Ge…

通俗理解詞向量模型,預訓練模型,Transfomer,Bert和GPT的發展脈絡和如何實踐

最近研究GPT&#xff0c;深入的從transfomer的原理和代碼看來一下&#xff0c;現在把學習的資料和自己的理解整理一下。 這個文章寫的很通俗易懂&#xff0c;把transformer的來龍去脈&#xff0c;還舉例了很多不錯的例子。 Transformer通俗筆記&#xff1a;從Word2Vec、Seq2S…

6 個有效且可用的頂級 Android 數據恢復工具

經過測試 42 種數據恢復軟件產品&#xff0c;發現奇客數據恢復安卓版是 Android 設備的最佳選擇。 過去幾十年來&#xff0c;我一直在科技行業工作&#xff0c;經常幫助人們應對計算機災難&#xff0c;包括丟失數據。 Android 數據恢復應用程序不在您的設備上運行&#xff0c…

IDEA中注釋快捷鍵及模板

單行注釋 將光標放置于要注釋所在行&#xff0c;使用 Ctrl /&#xff0c; 添加行注釋&#xff0c;再次使用&#xff0c;去掉行注釋 若需要將多行進行單行注釋&#xff0c;只需要選中要注釋的多行&#xff0c;然后使用 Ctrl /&#xff0c; 添加行注釋&#xff0c;再次使用&a…

【PTA題目】L1-6 整除光棍 分數 20

L1-6 整除光棍 分數 20 全屏瀏覽題目 切換布局 作者 翁愷 單位 浙江大學 這里所謂的“光棍”&#xff0c;并不是指單身汪啦~ 說的是全部由1組成的數字&#xff0c;比如1、11、111、1111等。傳說任何一個光棍都能被一個不以5結尾的奇數整除。比如&#xff0c;111111就可以被…

leetcode中“復雜的二分”類題目

復雜的二分題目難點 第 410、1011、1482、1552、1760、2187、2226 題 1 根據題意確定二分的數據范圍 2 避免死循環: 決定是int m (leftright1)/2還是int m (leftright)/2 3 返回結果的指針是left還是right 1 LC875. 愛吃香蕉的珂珂 class Solution {public int minEati…

聚焦數據要素跨域運營,構建數據要素統一大市場地方數據局局長閉門會正式召開

11月23日&#xff0c;在第二屆全球數字貿易博覽會期間&#xff0c;杭州市數據資源局、中國電子云、杭州數據交易所聯合組織各地數據主管部門&#xff0c;召開構建數據要素統一大市場地方數據局局長閉門會&#xff0c;交流數據要素統一大市場構建思路&#xff0c;共探公共數據運…

寫給女朋友的python軟件開發教程——從入門到實踐01——總體規劃

文章目錄 學習路徑chatGPT文心一言 學習資源推薦理論學習——一些這些分別錄制視頻講解&#xff08;后面會更&#xff09;實戰——以自己想開發的一個軟件為例進行教學 學習路徑 問&#xff1a; 我已經有python基礎了&#xff0c;想快速學會用python的pyqt開發單機軟件&#x…

人人都會Blazor—— 3.2 組件

Blazor 應用是使用 Razor 組件(非正式地稱為 Blazor 組件或組件)構建的。 組件是用戶界面 (UI) 的自包含部分,具有用于啟用動態行為的處理邏輯。 組件可以嵌套、重用、在項目間共享,并可在 MVC 和 Razor Pages 應用中使用。 組件呈現為瀏覽器文檔對象模型 (DOM) 的內存中表…

通過一個例子理解pytest的fixture的使用

需求 希望編寫登陸web后做一些操作的測試用例&#xff0c;使用pytest框架具體測試用例執行前&#xff0c;需要先拿到web的token&#xff0c;這個獲取token的動作只執行一次 例一 先上測試用例代碼 adminpc-1:~$ cat my_test.py import pytestclass TestWebLogin:pytest.fi…

基于springboot實現農機電招平臺系統項目【項目源碼+論文說明】

基于springboot實現農機電招平臺系統演示 摘要 隨著農機電招行業的不斷發展&#xff0c;農機電招在現實生活中的使用和普及&#xff0c;農機電招行業成為近年內出現的一個新行業&#xff0c;并且能夠成為大群眾廣為認可和接受的行為和選擇。設計農機電招平臺的目的就是借助計算…

軟件開發中對圖片的加工處理的一些個人思考和總結

前言&#xff1a; 最近在公司做項目的時候&#xff0c;有一個業務場景就是同一張圖片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其實理解起來也很簡單&#xff0c;就以大家熟悉的微信頭像而言&#xff0c;我們在正常使用的情況下&#xff0c;一個微信頭像的大…

尋找多個項目的漏洞賞金實戰,不同技術的詳細實現

尋找多個項目的漏洞賞金實戰,不同技術的詳細實現。 破-解Slack App得到3500美金漏洞賞金 文章的核心要點如下: 漏洞發現:作者在Slack的安卓應用中發現了一個漏洞。這個漏洞是由于目錄遍歷,導致可以竊取密碼。這個漏洞的重要性在于,它允許“跳躍”在賬戶之間,也就是說,你…

[kingbase鎖等待問題分析]

參考文章:https://www.modb.pro/db/70021 概述 為了確保復雜的事務可以安全地同時運行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各種級別的鎖來控制對各種數據對象的并發訪問&#xff0c;使得對數據庫關鍵部分的更改序列化。事務并發運行&#xff0c;直到…

關閉EntityFramework日志輸出SQL

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; EntityFramework日志輸出SQL 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a; EntityFramework日志輸出SQL&#xff0c;造成發布后&#xff0c;無效日志太多&#xff0c;且容器化部…

Linux安全之AIDE系統入侵檢測工具安裝和使用

一、AIDE 系統入侵檢測工具簡介 AIDE&#xff0c;全稱為Advanced Intrusion Detection Environment&#xff0c;是一個主要用于檢測文件完整性的入侵檢測工具。它能夠構建一個指定文件的數據庫&#xff0c;并使用aide.conf作為其配置文件。AIDE數據庫能夠保存文件的各種屬性&am…

Django(十、中間件)

文章目錄 一、中間件的介紹中間件有什么用中間件功能自定義中間中間件的順序 一、中間件的介紹 中間件顧名思義&#xff0c;是介于request與response處理之間的一道處理過程&#xff0c;相對比較輕量級&#xff0c;并且在全局上改變django的輸入與輸出。因為改變的是全局&…