欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python基于鏈接表實(shí)現(xiàn)無(wú)向圖最短路徑搜索

 更新時(shí)間:2022年04月25日 10:02:45   作者:一枚大果殼  
鏈接表的存儲(chǔ)相比較鄰接炬陣,使用起來更方便,對(duì)于空間的使用是剛好夠用原則,不會(huì)產(chǎn)生太多空間浪費(fèi)。所以本文將以鏈接表方式實(shí)現(xiàn)無(wú)向圖最短路徑搜索,需要的可以參考一下

前言

圖的常用存儲(chǔ)方式有 2 種:

  • 鄰接炬陣
  • 鏈接表

鄰接炬陣的優(yōu)點(diǎn)和缺點(diǎn)都很明顯。優(yōu)點(diǎn)是簡(jiǎn)單、易理解,對(duì)于大部分圖結(jié)構(gòu)而言,都是稀疏的,使用炬陣存儲(chǔ)空間浪費(fèi)就較大。

鏈接表的存儲(chǔ)相比較鄰接炬陣,使用起來更方便,對(duì)于空間的使用是剛好夠用原則,不會(huì)產(chǎn)生太多空間浪費(fèi)。操作起來,也是簡(jiǎn)單。

本文將以鏈接表方式存儲(chǔ)圖結(jié)構(gòu),在此基礎(chǔ)上實(shí)現(xiàn)無(wú)向圖最短路徑搜索。

1. 鏈接表

鏈接表的存儲(chǔ)思路:

使用鏈接表實(shí)現(xiàn)圖的存儲(chǔ)時(shí),有主表子表概念。

  • 主表: 用來存儲(chǔ)圖對(duì)象中的所有頂點(diǎn)數(shù)據(jù)。
  • 子表: 每一個(gè)頂點(diǎn)自身會(huì)維護(hù)一個(gè)子表,用來存儲(chǔ)與其相鄰的所有頂點(diǎn)數(shù)據(jù)。

如下圖結(jié)構(gòu)中有 5 個(gè)頂點(diǎn),使用鏈接表保存時(shí),會(huì)有主表 1 張,子表 5 張。鏈接表的優(yōu)點(diǎn)是能夠緊湊地表示稀疏圖。

在 Python 中可以使用列表嵌套實(shí)現(xiàn)鏈接表,這應(yīng)該是最簡(jiǎn)單的表達(dá)方式。

g = [
    ['A0', [('B1', 3), ('D3', 5)]],
    ['B1', [('C2', 4)]],
    ['C2', [('D3', 6), ('E4', 1)]],
    ['D3', [('E4', 2)]],
    ['E4', [('B1', 7)]],
]

在此基礎(chǔ)上,可以做一些簡(jiǎn)單的常規(guī)操作。

查詢所有頂點(diǎn):

for node in g:
    print(node[0],end=' ') 

查詢頂點(diǎn)及其相鄰頂點(diǎn)

for node in g:
    print('-------------------')
    print(node[0], ":", end='')
    edges = node[1]
    for e in edges:
        v, w = e
        print(v, w, end=';')
    print()

當(dāng)頂點(diǎn)和相鄰頂點(diǎn)之間的關(guān)系很復(fù)雜時(shí),這種層層嵌套的存儲(chǔ)格式會(huì)讓人眼花繚亂。即使要使用這種嵌套方式,那也應(yīng)該選擇 Python 中的字典類型,對(duì)于查詢會(huì)方便很多。

g = {
    'A0':{'B1': 3, 'D3': 5},
    'B1': {'C2': 4},
    'C2': {'D3': 6, 'E4': 1},
    'D3': {'E4':2},
    'E4': {'B1': 7}
}

如上結(jié)構(gòu),在查詢時(shí),無(wú)論是方便性還是性能,都要強(qiáng)于完全的列表方案。

查詢所有頂點(diǎn):

for node in g.keys():
    print(node,end=" ")

查詢與某一頂點(diǎn)相鄰的頂點(diǎn)時(shí),只需要提供頂點(diǎn)名稱就可以了。

print("查詢與 A0 項(xiàng)點(diǎn)有連接的其它頂點(diǎn)")
for k, v in g.get('A0').items():
    print((k, v), end=";")

以上的存儲(chǔ)方案,適合于演示,并不適合于開發(fā)環(huán)境,因頂點(diǎn)本身是具有特定的數(shù)據(jù)含義(如,可能是城市、公交車站、網(wǎng)址、路由器……),且以上存儲(chǔ)方案讓頂點(diǎn)和其相鄰頂點(diǎn)的信息過度耦合,在實(shí)際運(yùn)用時(shí),會(huì)牽一發(fā)而動(dòng)全身。

也許一個(gè)微不足道的修改,會(huì)波動(dòng)到整個(gè)結(jié)構(gòu)的更新。

所以,有必要引于 OOP 設(shè)計(jì)理念,讓頂點(diǎn)和圖有各自特定數(shù)據(jù)結(jié)構(gòu),通過 2 種類類型可以更好地體現(xiàn)圖是頂點(diǎn)的集合,頂點(diǎn)和頂點(diǎn)之間的多對(duì)多關(guān)系。

項(xiàng)點(diǎn)類:

class Vertex:
    def __init__(self, name, v_id=0):
        # 頂點(diǎn)的編號(hào)
        self.v_id = v_id
        # 頂點(diǎn)的名稱
        self.v_name = name
        # 是否被訪問過:False 沒有 True:有
        self.visited = False
        # 與此頂點(diǎn)相連接的其它頂點(diǎn)
        self.connected_to = {}

頂點(diǎn)類結(jié)構(gòu)說明:

  • visited:用于搜索路徑算法中,檢查節(jié)點(diǎn)是否已經(jīng)被搜索過。
  • connected_to:存儲(chǔ)與項(xiàng)點(diǎn)相鄰的頂點(diǎn)信息。這里使用了字典,以頂點(diǎn)為鍵,權(quán)重為值。

圖類:

class Graph:

    def __init__(self):
        # 一維列表,保存節(jié)點(diǎn)
        self.vert_list = {}
        # 頂點(diǎn)個(gè)數(shù)
        self.v_nums = 0
        # 使用隊(duì)列模擬隊(duì)列或棧,用于路徑搜索算法
        self.queue_stack = []
        # 保存搜索到的路徑
        self.searchPath = []

圖類結(jié)構(gòu)說明:

queue_stack:使用隊(duì)列模擬棧或隊(duì)列。用于路徑搜索過程中保存臨時(shí)數(shù)據(jù)。

怎么使用列表模擬隊(duì)列或棧?

列表有 append()pop() 2 個(gè)很價(jià)值的方法。

append() 用來向列表中添加數(shù)據(jù),且每次都是從列表最后面添加。

pop() 默認(rèn)從列表最后面刪除且彈出數(shù)據(jù), pop(參數(shù)) 可以提供索引值用來從指定位置刪除且彈出數(shù)據(jù)。

使用 append() 和 pop() 方法就能模擬棧,從同一個(gè)地方進(jìn)出數(shù)據(jù)。

使用 append() 和 pop(0) 方法就能模擬隊(duì)列,從后面添加數(shù)據(jù),從最前面獲取數(shù)據(jù)

searchPath:用于保存搜索到的路徑數(shù)據(jù)。

2. 最短路徑算法

從圖結(jié)構(gòu)可知,從一個(gè)頂點(diǎn)到達(dá)另一個(gè)頂點(diǎn),可不止一條可行路徑,在眾多路徑我們總是試圖選擇一條最短路徑,當(dāng)然,需求不同,衡量一個(gè)路徑是不是最短路徑的標(biāo)準(zhǔn)也會(huì)不同。

如打開導(dǎo)航系統(tǒng)后,最短路徑可能是費(fèi)用最少的那條,可能是速度最快的那條,也可能是量程數(shù)最少的或者是紅綠燈是最少的……

在無(wú)向圖中,以經(jīng)過的邊數(shù)最少的路徑為最短路徑。

在有向加權(quán)圖中,會(huì)以附加在每條邊上的權(quán)重的數(shù)據(jù)含義來衡量。權(quán)重可以是時(shí)間、速度、量程數(shù)……

2.1 無(wú)向圖最短路徑算法

查找無(wú)向圖中任意兩個(gè)頂點(diǎn)間的最短路徑長(zhǎng)度,可以直接使用廣度搜索算法。如下圖求解 A0 ~ F5 的最短路徑。

Tips: 無(wú)向圖中任意 2 個(gè)頂點(diǎn)間的最短路徑長(zhǎng)度由邊數(shù)決定。

廣度優(yōu)先搜索算法流程:

廣度優(yōu)先搜索算法的基本原則:以某一頂點(diǎn)為參考點(diǎn),先搜索離此頂點(diǎn)最近的頂點(diǎn),再搜索離最近頂點(diǎn)最近的頂點(diǎn)……以此類推,一層一層向目標(biāo)頂點(diǎn)推進(jìn)。

如從頂點(diǎn) A0 找到頂點(diǎn) F5。先從離 A0 最近的頂點(diǎn) B1、D3 找起,如果沒找到,再找離 B1D3 最近的頂點(diǎn) C2、E4,如果還是沒有找到,再找離 C2、E4 最近的頂點(diǎn) F5。

因?yàn)槊恳淮嗡阉鞫际遣捎米罱瓌t,最后搜索到的目標(biāo)也一定是最近的路徑。

也因?yàn)椴捎米罱瓌t,所以搜索過程中,在搜索過程中所經(jīng)歷到的每一個(gè)頂點(diǎn)的路徑都是最短路徑。最近+最近,結(jié)果必然還是最近。

顯然,廣度優(yōu)先搜索的最近搜索原則是符合先進(jìn)先出思想的,具體算法實(shí)施時(shí)可以借助隊(duì)列實(shí)現(xiàn)整個(gè)過程。

算法流程:

1.先確定起始點(diǎn) A0。

2.找到 A0 的 2 個(gè)后序頂點(diǎn) B1 、D3 (或者說 B1、D3的前序頂點(diǎn)是 A0),壓入隊(duì)列中。除去起點(diǎn) A0B1、D3 頂點(diǎn)屬于第一近壓入隊(duì)列的節(jié)點(diǎn)。

  • B1 和 D3 壓入隊(duì)列的順序并不影響 A0 ~B1 或 A0 ~ D3 的路徑距離(都是 1)。
  • A0~B1 的最短路徑長(zhǎng)度為 1
  • A0~D3 的最短路徑長(zhǎng)度為 1

3.從隊(duì)列中搜索 B1 時(shí),找到 B1 的后序頂點(diǎn) C2 并壓入隊(duì)列。B1 是 C2 的前序頂點(diǎn)。

B1 ~ C2 的最短路徑長(zhǎng)度為 1,而又因?yàn)?nbsp;A0~B1 的最短路徑長(zhǎng)度為 1 ,所以 A0 ~ C2 的最短路徑為 2

4.B1 搜索完畢后,在隊(duì)列中搜索 B3 時(shí),找到 B3 的后序頂點(diǎn) E4 ,壓入隊(duì)列。因 B1 和 D3 屬于第一近頂點(diǎn),所以這 2 個(gè)頂點(diǎn)的后序頂點(diǎn) C2、E4 屬于第二近壓入隊(duì)列,或說 A0-B1-C2A0-D3-E4 的路徑距離是相同的(都為 2)。

5.當(dāng)搜索到 C2 時(shí),沒有后序頂點(diǎn),此時(shí)隊(duì)列沒有壓入操作。

6.當(dāng) 搜索到 E4 時(shí),E4 有 2 個(gè)后序頂點(diǎn) C2、F5,因 C2 已經(jīng)壓入過,所以僅壓入 F5。因 F5 是由第二近頂點(diǎn)壓入,所以 F5 是屬于第三近壓入頂點(diǎn)。

A0-D3-E4-F5 的路徑為 3。

編碼實(shí)現(xiàn)廣度優(yōu)先算法:

在頂點(diǎn)類中添加如下幾個(gè)方法:

class Vertex:
    def __init__(self, v_name, v_id=0):
        # 頂點(diǎn)的編號(hào)
        self.v_id = v_id
        # 頂點(diǎn)的名稱
        self.v_name = v_name
        # 是否被訪問過:False 沒有 True:有
        self.visited = False
        # 與此頂點(diǎn)相連接的其它頂點(diǎn)
        self.connected_to = {}

    '''
    添加鄰接頂點(diǎn)
    nbr_ver:相鄰頂點(diǎn)
    weight:無(wú)向無(wú)權(quán)重圖,權(quán)重默認(rèn)設(shè)置為 1
    '''
    def add_neighbor(self, nbr_ver, weight=1):
        # 以相鄰頂點(diǎn)為鍵,權(quán)重為值
        self.connected_to[nbr_ver] = weight

    '''
    顯示與當(dāng)前頂點(diǎn)相鄰的頂點(diǎn)
    '''
    def __str__(self):
        return '與 {0} 頂點(diǎn)相鄰的頂點(diǎn)有:{1}'.format(self.v_name,
                                           str([(key.v_name, val) for key, val in self.connected_to.items()]))

    '''
    得到相鄰頂點(diǎn)的權(quán)重
    '''
    def get_weight(self, nbr_v):
        return self.connected_to[nbr_v]

    '''
    判斷給定的頂點(diǎn)是否和當(dāng)前頂點(diǎn)相鄰
    '''
    def is_neighbor(self, nbr_v):
        return nbr_v in self.connected_to     

頂點(diǎn)類用來構(gòu)造一個(gè)新頂點(diǎn),并維護(hù)與相鄰頂點(diǎn)的關(guān)系。

對(duì)圖類中的方法做一下詳細(xì)解釋:

初始化方法:

class Graph:
    def __init__(self):
        # 一維列表,保存節(jié)點(diǎn)
        self.vert_list = {}
        # 頂點(diǎn)個(gè)數(shù)
        self.v_nums = 0
        # 使用隊(duì)列模擬隊(duì)列或棧,用于路徑搜索算法
        self.queue_stack = []
        # 保存搜索到的路徑
        self.searchPath = []

為圖添加新頂點(diǎn)方法:

   def add_vertex(self, vert):
        if vert.v_name in self.vert_list:
            # 已經(jīng)存在
            return
        # 頂點(diǎn)的編號(hào)內(nèi)部生成
        vert.v_id = self.v_nums
        # 所有頂點(diǎn)保存在圖所維護(hù)的字典中,以頂點(diǎn)名為鍵,頂點(diǎn)對(duì)象為值
        self.vert_list[vert.v_name] = vert
        # 數(shù)量增一
        self.v_nums += 1

頂點(diǎn)的編號(hào)由圖對(duì)象內(nèi)部指定,便于統(tǒng)一管理。

所有頂點(diǎn)保存在一個(gè)字典中,以頂點(diǎn)名稱為鍵,頂點(diǎn)對(duì)象為值。也可以使用列表直接保存頂點(diǎn),根據(jù)需要決定。

提供一個(gè)根據(jù)頂點(diǎn)名稱返回頂點(diǎn)的方法:

 	'''
    根據(jù)頂點(diǎn)名找到頂點(diǎn)對(duì)象
    '''
    def find_vertex(self, v_name):
        if v_name in self.vert_list:
            return self.vert_list.get(v_name)
    # 查詢所有頂點(diǎn)
    def find_vertexes(self):
        return [str(ver) for ver in self.vert_list.values()]

添加頂點(diǎn)與相鄰頂點(diǎn)的關(guān)系:此方法屬于一個(gè)封裝方法,本質(zhì)是調(diào)用頂點(diǎn)自身的添加相鄰頂點(diǎn)方法。

    '''
    添加節(jié)點(diǎn)與節(jié)點(diǎn)之間的關(guān)系(邊),
    如果是無(wú)權(quán)重圖,統(tǒng)一設(shè)定為 1 
    '''
    def add_edge(self, from_v, to_v, weight=1):
        # 如果節(jié)點(diǎn)不存在
        if from_v not in self.vert_list:
            self.add_vertex(from_v)
        if to_v not in self.vert_list:
            self.add_vertex(to_v)
        from_v.add_neighbor(to_v, weight)

圖中核心方法:用來廣度優(yōu)先搜索算法查找頂點(diǎn)與頂點(diǎn)之間的路徑

    '''
    廣度優(yōu)先搜索
    '''
    def bfs_nearest_path(self, from_v, to_v):
        tmp_path = []
        tmp_path.append(from_v)
        # 起始頂點(diǎn)不用壓入隊(duì)列
        from_v.visited = True
        # from_v 頂點(diǎn)的相鄰頂點(diǎn)壓入隊(duì)列
        self.push_queue(from_v)
        while len(self.queue_stack) != 0:
            # 從隊(duì)列中獲取頂點(diǎn)
            v_ = self.queue_stack.pop(0)
            if from_v.is_neighbor(v_):
                # 如果 v_ 是 from_v 的后序相鄰頂點(diǎn),則連接成一條中路徑信息 
                tmp_path.append(v_)
                # 添加路徑信息
                self.searchPath.append(tmp_path)
                tmp_path = tmp_path.copy()
                tmp_path.pop()
            else:
                for path_ in self.searchPath:
                    tmp_path = path_.copy()
                    tmp = tmp_path[len(tmp_path) - 1]
                    if tmp.is_neighbor(v_):
                        tmp_path.append(v_)
                        self.searchPath.append(tmp_path)
            if v_.v_id == to_v.v_id:
                break
            else:
                self.push_queue(v_)

    '''
     把某一頂點(diǎn)的相鄰頂點(diǎn)壓入隊(duì)列
     '''
    def push_queue(self, vertex):
        # 獲取 vertex 頂點(diǎn)的相鄰頂點(diǎn)
        for v_ in vertex.connected_to.keys():
            # 檢查此頂點(diǎn)是否壓入過
            if v_.visited:
                continue
            vertex.visited = True
            self.queue_stack.append(v_)

廣度優(yōu)先搜索算法有一個(gè)核心點(diǎn),當(dāng)搜索到某一個(gè)頂點(diǎn)后,需要找到與此頂點(diǎn)相鄰的其它頂點(diǎn),并壓入隊(duì)列中。push_queue() 方法就是做些事情的。如果某一個(gè)頂點(diǎn)曾經(jīng)進(jìn)過隊(duì)列,就不要再重復(fù)壓入隊(duì)列了。

測(cè)試代碼:

'''
測(cè)試無(wú)向圖最短路徑
'''

if __name__ == '__main__':
    # 初始化圖
    graph = Graph()
    # 添加節(jié)點(diǎn)
    for v_name in ['A', 'B', 'C', 'D', 'E', 'F']:
        v = Vertex(v_name)
        graph.add_vertex(v)

    # 添加頂點(diǎn)之間關(guān)系
    v_to_v = [('A', 'B'), ('A', 'D'), ('B', 'C'), ('C', 'E'), ('D', 'E'), ('E', 'F')]
    # 無(wú)向圖中每 2 個(gè)相鄰頂點(diǎn)之間互為關(guān)系
    for v in v_to_v:
        f_v = graph.find_vertex(v[0])
        t_v = graph.find_vertex(v[1])
        graph.add_edge(f_v, t_v)
        graph.add_edge(t_v, f_v)

    # 輸出所有頂點(diǎn)
    print('-----------頂點(diǎn)及頂點(diǎn)之間的關(guān)系-------------')
    for v in graph.find_vertexes():
        print(v)

    # 查找路徑
    print('-------------廣度優(yōu)先搜索--------------------')
    # 起始點(diǎn)
    f_v = graph.find_vertex('A')
    # 目標(biāo)點(diǎn)
    t_v = graph.find_vertex('F')
    # 廣度優(yōu)先搜索
    graph.bfs_nearest_path(f_v, t_v)
    for path in graph.searchPath:
        weight = 0
        for idx in range(len(path)):
            if idx != len(path) - 1:
                weight += path[idx].get_weight(path[idx + 1])
            print(path[idx].v_name, end='-')
        print("的最短路徑長(zhǎng)度,", weight)

輸出結(jié)果:

-----------頂點(diǎn)及頂點(diǎn)之間的關(guān)系-------------
與 A 頂點(diǎn)相鄰的頂點(diǎn)有:[('B', 1), ('D', 1)]
與 B 頂點(diǎn)相鄰的頂點(diǎn)有:[('A', 1), ('C', 1)]
與 C 頂點(diǎn)相鄰的頂點(diǎn)有:[('B', 1), ('E', 1)]
與 D 頂點(diǎn)相鄰的頂點(diǎn)有:[('A', 1), ('E', 1)]
與 E 頂點(diǎn)相鄰的頂點(diǎn)有:[('C', 1), ('D', 1), ('F', 1)]
與 F 頂點(diǎn)相鄰的頂點(diǎn)有:[('E', 1)]
-------------廣度優(yōu)先搜索--------------------
A-B-的最短路徑長(zhǎng)度, 1
A-D-的最短路徑長(zhǎng)度, 1
A-B-C-的最短路徑長(zhǎng)度, 2
A-D-E-的最短路徑長(zhǎng)度, 2
A-B-C-E-的最短路徑長(zhǎng)度, 3
A-D-E-的最短路徑長(zhǎng)度, 2
A-B-C-E-的最短路徑長(zhǎng)度, 3
A-D-E-F-的最短路徑長(zhǎng)度, 3
A-B-C-E-F-的最短路徑長(zhǎng)度, 4
A-D-E-F-的最短路徑長(zhǎng)度, 3
A-B-C-E-F-的最短路徑長(zhǎng)度, 4

廣度優(yōu)先搜索算法也可以使用遞歸方案:

    '''
    遞歸實(shí)現(xiàn)
    '''

    def bfs_nearest_path_dg(self, from_v, to_v):

        # 相鄰頂點(diǎn)
        self.push_queue(from_v)
        tmp_v = self.queue_stack.pop(0)
        if not tmp_v.visited:
            self.searchPath.append(tmp_v)
        if tmp_v.v_id == to_v.v_id:
            return

        self.bfs_nearest_path_dg(tmp_v, to_v)

在無(wú)向圖中,查找起始點(diǎn)到目標(biāo)點(diǎn)的最短路徑,使用廣度優(yōu)先搜索算法便可實(shí)現(xiàn),但如果是有向加權(quán)圖,可能不會(huì)稱心如愿。因有向加權(quán)圖中的邊是有權(quán)重的。所以對(duì)于有向加權(quán)圖則需要另?yè)穹桨浮?/p>

3. 總結(jié)

圖數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)過程中會(huì)涉及到其它數(shù)據(jù)結(jié)構(gòu)的運(yùn)用。學(xué)習(xí)、使用圖數(shù)據(jù)結(jié)構(gòu)對(duì)其它數(shù)據(jù)結(jié)構(gòu)有重新認(rèn)識(shí)和鞏固作用。

以上就是Python基于鏈接表實(shí)現(xiàn)無(wú)向圖最短路徑搜索的詳細(xì)內(nèi)容,更多關(guān)于Python無(wú)向圖最短路徑搜索的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python計(jì)算不規(guī)則圖形面積算法實(shí)現(xiàn)解析

    Python計(jì)算不規(guī)則圖形面積算法實(shí)現(xiàn)解析

    這篇文章主要介紹了Python計(jì)算不規(guī)則圖形面積算法實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python爬蟲技術(shù)

    Python爬蟲技術(shù)

    本文將要介紹的是python爬蟲基礎(chǔ)知識(shí),感興趣的小伙伴一起來學(xué)習(xí)吧
    2021-08-08
  • python,Java,JavaScript實(shí)現(xiàn)indexOf

    python,Java,JavaScript實(shí)現(xiàn)indexOf

    這篇文章主要介紹了python,Java,JavaScript如何實(shí)現(xiàn)indexOf,幫助大家更好的理解indexOf,感興趣的朋友可以了解下
    2020-09-09
  • 分享幾道你可能遇到的python面試題

    分享幾道你可能遇到的python面試題

    最近去筆試,在面試過程中遇到了幾個(gè)編程題,比較基礎(chǔ)。所以想著總結(jié)一下,所以下面這篇文章主要給大家分享了幾道你可能遇到的python面試題,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-07-07
  • 淺析Python自帶性能強(qiáng)悍的標(biāo)準(zhǔn)庫(kù)itertools

    淺析Python自帶性能強(qiáng)悍的標(biāo)準(zhǔn)庫(kù)itertools

    itertools是python內(nèi)置的模塊,使用簡(jiǎn)單且功能強(qiáng)大。這篇文章就主要介紹了通過itertools實(shí)現(xiàn)可迭代對(duì)象的無(wú)限迭代、有限迭代和排列組合。感興趣的同學(xué)可以關(guān)注一下
    2021-12-12
  • Python裝飾器模式定義與用法分析

    Python裝飾器模式定義與用法分析

    這篇文章主要介紹了Python裝飾器模式定義與用法,結(jié)合實(shí)例形式分析了Python裝飾器模式的具體定義、使用方法及相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python數(shù)據(jù)可視化:箱線圖多種庫(kù)畫法

    Python數(shù)據(jù)可視化:箱線圖多種庫(kù)畫法

    這篇文章主要介紹了Python數(shù)據(jù)可視化箱線圖多種庫(kù)畫法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解pyqt中解決國(guó)際化tr()函數(shù)不起作用的問題

    詳解pyqt中解決國(guó)際化tr()函數(shù)不起作用的問題

    本文主要介紹了pyqt中解決國(guó)際化tr()函數(shù)不起作用的問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • python中的五種異常處理機(jī)制介紹

    python中的五種異常處理機(jī)制介紹

    這篇文章主要介紹了python中的五種異常處理機(jī)制介紹,本文是Learn Python一書的讀書筆記,需要的朋友可以參考下
    2014-09-09
  • python pyppeteer 破解京東滑塊功能的代碼

    python pyppeteer 破解京東滑塊功能的代碼

    這篇文章主要介紹了python pyppeteer 破解京東滑塊功能的代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論