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

Python編程:集合工具類之Deque及UserString和UserList

開發 開發工具
本期中主要介紹Python集合模塊中的雙端隊列(Deque)、用戶列表(UserList)以及用戶字符串(UserString),使用中要根據需要來結合他們各自的特點使用,比如deque的線程安全的支持和雙端操作、UserString與UserString的副本化及data存儲屬性等。

前言

本文繼續來盤Python內置集合模塊,本期介紹其中的工具類雙端隊列類(Deque)、用戶列表類(UserList)和UserString類的使用。我們還是采用“短平快”的模式——文字+代碼,助你多“快好省地學會它,并能都收用上它。

1. Deque

Deque是棧和隊列的泛化(名字讀作“deck”,是“雙端隊列”的縮寫)。deque支持線程安全、內存高效的從deque的任意一側添加和彈出操作,且在任何一個方向上都具有大致相同的O(1)性能。

盡管列表對象支持類似的操作,但它們都針對快速定長操作進行了優化,并為pop(0)和insert(0, v)操作帶來O(n)內存移動成本,這兩種操作會改變底層數據表示的大小和位置。

導入Python集合模塊后,通過collections.deque([iterable[, maxlen]]),這會返回一個新的deque對象,用iterable的數據從左到右初始化(使用append())。如果未指定iterable,則新的deque為空。

可選參數maxlen,為deque的最大大小,如果未綁定則為None。如果未指定maxlen或為None,則deques可以增長到任意長度。否則,deque將被限定為指定的最大長度。

需要注意的是,一旦指定邊界長度的deque已滿,當添加新項時,相應數量的項將從另一端丟棄。看下面的簡單示例:

### Deque
from collections import deque

# 聲明一個deque對象,用可迭代對象初始化
q = deque(['user', 'password', 'token'])
print(q)

程序輸出結果如下:

D
Q
I

上面的清單中,通過傳遞一個列表作為參數來定義一個deque對象。現在再創建另一個,但這次使用的是字符串:

# 基于字符串創建含有3項的新deque對象
d = deque('dqi')
# 迭代遍歷deque元素
for elem in d:
print(elem.upper())

運行程序的輸出結果如下:

D

Q

I

現在來看看deque對象的內容:

# deque的內容列表
deque_contents = list(d)
print(deque_contents)

# 查看下最左邊項
print(d[0])

# 查看下最右邊項
print(d[-1])

運行程序的結果輸出為:

['d', 'q', 'i']
d
i

接下來,簡要看看deque對象支持的一些方法:

1)append(x):

將x添加到deque的右側。

2)appendleft(x):

在deque的左邊加上x。

示例如下:

# 在右邊添加新項
d.append('j')
# 在左邊添加新項
d.appendleft('f')
# 展示deque構成表現
print(d)

輸出結果為:

deque(['f', 'd', 'q', 'i', 'j'])

3)pop():

從deque的右側刪除并返回一個元素。如果沒有元素,則引發IndexError。

4)popleft():

從deque的左側刪除并返回一個元素。如果沒有元素,則引發IndexError。

# 從右側刪除項并返回對應項
rightmost = d.pop()
print(rightmost)

# 從左側刪除項并返回對應項
leftmost = d.popleft()
print(leftmost)

輸出結果如下:

j
f

5)clear():

從deque中刪除所有元素,使其長度為0。

6)copy():

創建deque的淺拷貝。

7)count(x):

計算等于x的deque元素的個數。

8)extend(iterable):

在deque的右側通過追加iterable參數中的元素來擴展當前對象。

# 一次增加多個元素
d.extend('jkl')
print(d)

輸出結果如下:

deque(['d', 'q', 'i', 'j', 'k', 'l'])

9)extendleft(iterable):

在deque對象的左側通過iterable中元素來追加來擴展當前對象。

注意,左追加的序列導致iterable參數中元素的順序顛倒。如下所示:

# extendleft() 反轉輸入順序
d.extendleft('xyz')
print(d)

輸出結果為:

deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l'])

10)index(x[,start[,stop]]):

返回x在deque中的位置(在索引start或之后和索引stop之前)。返回第一個匹配項,如果未找到則引發ValueError異常。

11)insert(i ,x):

將x插入到deque中i的位置。如果插入會導致有界deque增長超過maxlen,則拋出IndexError異常。

12)remove(value):

刪除第一個出現的值。如果沒有找到,則拋出ValueError。

13)rotate(n = 1):

向右輪轉deque n步。如果n是負數,向左旋轉,即把n個元素到左邊或右邊。

示例如下:

# 開始時deque
print(d)

#向右輪轉
d.rotate(1)
print(d)

# 向左輪轉
d.rotate(-1)
print(d)
d.rotate(3)
print(d)

輸出結果為:

deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l'])
deque(['l', 'z', 'y', 'x', 'd', 'q', 'i', 'j', 'k'])
deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l'])
deque(['j', 'k', 'l', 'z', 'y', 'x', 'd', 'q', 'i'])

14)reverse()

將deque的元素原地反轉,然后返回None。

# 開始是deque
print('old deque:', d)

# 反轉deque中元素
new_deq = d.reverse()
print('new deque:', new_deq)

# 反轉后原始deque
print('old deque:', d)

輸出結果:

old deque: deque(['z', 'y', 'x', 'd', 'q', 'i', 'j', 'k', 'l'])
new deque: None
old deque: deque(['l', 'k', 'j', 'i', 'q', 'd', 'x', 'y', 'z'])

正如輸出結果所示,reverse()方法將deque的元素就地反轉,這意味著我們的原始deque對象被修改了。它返回None。

提醒:由于Deque是線程安全,常用在多線程環境下使用,比如對象共享池、數據庫連接池等方法,還可以便利控制或說自定義隊列中的對象上限。

2. UserList

UserList類用于充當列表對象的包裝器。對于你自己的創建類似列表類來說,它是一個有用的基類,可以繼承并覆蓋其現有的方法或添加新的方法。通過這種方式,可以向Python中的列表添加新的行為。

對這個類的需求已經部分被直接來自list的子類能力所取代;但是,這個類更容易使用,因為底層列表可以作為屬性訪問。其通常使用方式為:

import collections
ulist = collections.UserList([list])

該類模擬列表行為,其實例的內容保存在一個常規列表中,可以通過UserList實例的data屬性訪問該列表。實例的內容最初化為list的副本,默認為空列表[]。參數list可以是任何可迭代對象,例如一個真正的Python列表或UserList對象。

除了支持可變序列的方法和操作外,UserList實例還提供了以下屬性:

data:

一個用于存儲UserList類內容的真實列表對象。

假設我們想要定義一個不允許刪除其中項的列表。我們可以通過繼承UserList輕松定義這樣的類:

from collections import UserList

# 自定義一個類,其繼承自UserList
# 該類不允許刪除其所含項
# Python中的List類的刪除方法:
# remove() and pop()
class ListWithNoItemDelete(UserList):
# 覆寫remove()方法
def remove(self, s=None):
self.not_allowed()

# 覆寫 pop() 方法
def pop(self, s=None):
self.not_allowed()
# 定義一個不允許方法
def not_allowed(self):
raise RuntimeError("Deletion not allowed")

# 自定義列表對象
custom_list = ListWithNoItemDelete(['a', 'b', 'c'])

# 試圖刪除列表項操作
custom_list.remove('b')

運行上述程序控制臺輸出類似如下內容:

……
raise RuntimeError("Deletion not allowed")
RuntimeError: Deletion not allowed

使用建議:該類型主要特點是參數的副本化,即不會改變傳進來的列表,同時多了個存儲屬性data,實際應用中可酌情使用。

3. UserString

UserString類充當字符串對象的包裝器。對該類的需求已經部分被直接從str派生子類的能力所取代;但是,這個類更容易使用,因為底層字符串可以作為屬性訪問。其通常使用形式:

import collections
userStr = collections.UserString(seq)

該類模擬字符串對象,其實例的內容保存在一個常規字符串對象中,其可通過UserString實例的data屬性訪問該對象。實例的內容最初化為seq的一個副本。seq參數可以是任何可以使用內置str()函數轉換為字符串的對象。

除了支持字符串的方法和操作,UserString實例提供以下屬性:

data:

這是個str對象,用于存儲UserString類的內容。

假設我們想要定義一個自己的str類,包含concatenate()方法,可以參考如下實現:

# UserString

from collections import UserString

# 定義一個繼承自UserString的子類
class CustomStrClass(UserString):
# 定義一個新方法
def concatenate(self, other=None, delimiter=' '):
self.data += delimiter + other
# 創建自定義字符串對象
custom_str = CustomStrClass('My Custom')
custom_str.concatenate('String Class')
print(custom_str)

運行程序,輸出結果類似如下:

My Custom String Class

概括:該字符串最大特色就是存儲的是參數副本,并具有可自行定制處理的機制以及data屬性。通常狀況下,str類即可。

4.本文小結

本期中主要介紹Python集合模塊中的雙端隊列(Deque)、用戶列表(UserList)以及用戶字符串(UserString),使用中要根據需要來結合他們各自的特點使用,比如deque的線程安全的支持和雙端操作、UserString與UserString的副本化及data存儲屬性等。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-11-01 07:54:18

Python工具類計數器

2011-06-22 09:58:04

QT 集合類

2020-07-08 07:56:08

Java工具類包裝類

2009-08-11 15:38:54

.NET集合類

2025-02-10 07:40:00

Java集合工具類編程

2023-09-27 23:28:28

Python編程

2010-09-14 09:51:24

2022-09-22 11:36:31

隊列Python

2010-05-28 14:55:17

Linux編程工具

2022-10-12 07:53:46

并發編程同步工具

2022-10-24 07:31:53

Python編程裝飾器

2023-11-09 08:36:51

內置工具類Spring

2021-04-26 10:32:38

網絡安全PE編程工具

2021-04-18 07:09:50

工具類異步編程

2010-05-28 15:34:14

Linux編程工具

2024-02-23 10:10:00

List接口Java

2021-06-29 18:24:13

MySQL開源工具

2021-04-05 08:11:04

Java基礎Calendar類DateFormat類

2015-04-15 14:50:14

工具類函數編程

2023-07-04 13:36:00

同步工具類Phaser
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久久18免费网站 | 成人在线免费观看 | 日韩精品成人 | 久久91精品国产一区二区 | 亚洲午夜精品在线观看 | 91在线看片| 在线视频 亚洲 | 福利色导航 | 久久久久久色 | 亚洲成av人片在线观看无码 | 2023亚洲天堂 | 婷婷亚洲综合 | 色爱综合网 | 日本视频免费 | 一级片子| 一级欧美 | 成人三级在线观看 | 亚洲一区二区综合 | 国产在线观看一区二区 | 国产乱xxav| 日韩中文字幕一区二区 | 国产精品视频在线免费观看 | 日韩在线免费视频 | 拍戏被cao翻了h承欢 | 成人黄色在线观看 | 亚洲精品国产偷自在线观看 | 999久久久 | 九九精品久久久 | 免费观看一级特黄欧美大片 | 麻豆av一区二区三区久久 | 中文字幕一区二区三区四区 | av网站在线播放 | 国产精品一区二区视频 | 国产一区二区在线91 | 午夜免费在线观看 | 国内精品视频免费观看 | 911影院 | 97精品久久 | 黄色在线网站 | а√中文在线8 | www.成人久久 |