日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python的序列类型及其特点_Fluent Python 笔记——序列类型及其丰富的操作

發布時間:2024/7/5 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的序列类型及其特点_Fluent Python 笔记——序列类型及其丰富的操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

序列的分類

Python 標準庫用 C 語言實現了豐富的序列類型的數據結構,如:

容器序列(能存放不同類型的數據):list、tuple、collections.deque 等

扁平序列(只容納同一類型的數據):str、bytes、bytearray、memoryview、array.array

>>> a_list = [1, '2', True, [1, 2, 3], 4.5]

>>> a_str = 'helloworld'

容器序列存放的是對象的引用,扁平序列存放的是值。即扁平序列是一段連續的內存空間。

>>> a_list = [1, '2', True, [1, 2, 3], 4.5]

>>> embedded_list = a_list[3]

>>> embedded_list

[1, 2, 3]

>>> embedded_list.append(4)

>>> embedded_list

[1, 2, 3, 4]

>>> a_list

[1, '2', True, [1, 2, 3, 4], 4.5]

序列還可以按照是否可變(能夠被修改)進行分類:

可變序列:list、bytearray、array.array、collections.deque、memoryview

不可變序列:tuple、str、bytes

>>> a_list = [1, 2, 3]

>>> a_list[0] = 2

>>> a_list

[2, 2, 3]

>>> a_tuple = (1, 2, 3)

>>> a_tuple[0] = 2

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

列表推導

for 循環:

>>> symbols = '!@#$%'

>>> codes = []

>>> for symbol in symbols:

... codes.append(ord(symbol))

...

>>> codes

[33, 64, 35, 36, 37]

列表推導:

>>> symbols = '!@#$%'

>>> codes = [ord(symbol) for symbol in symbols]

>>> codes

[33, 64, 35, 36, 37]

通常的原則是,只用列表推導創建新的列表,并盡量保持簡短。

列表推導(包括集合推導、字典推導)、生成器表達式在 Python3 中有自己的局部作用域。

>>> x = 'ABC'

>>> dummy = [ord(x) for x in x]

>>> x

'ABC'

>>> dummy

[65, 66, 67]

列表推導與 filter/map 的比較:

>>> symbols = '$¢£¥€¤'

>>> beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]

>>> beyond_ascii

[162, 163, 165, 8364, 164]

>>> beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))

>>> beyond_ascii

[162, 163, 165, 8364, 164]

作為記錄的元組

元組其實是一種數據記錄(Record),其中的每個元素都對應記錄中一個字段的數據,字段在元組中的位置則可以用來區分其含義。

>>> lax_coordinates = (33.9425, -118.408056)

>>> city, year, pop, area = ('Tokyo', 2003, 32450, 8014)

>>> traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]

>>> for country, _ in traveler_ids:

... print(country)

...

USA

BRA

ESP

元組拆包

元組拆包可以應用到任何可迭代對象上,唯一的要求即可迭代對象中的元素數量與接收這些元素的空檔數一致(除非用 * 忽略多余的元素)。

元組拆包(平行賦值):

>>> lax_coordinates = (33.9425, -118.408056)

>>> latitude, longitude = lax_coordinates

>>> latitude

33.9425

>>> longitude

-118.408056

不使用中間變量交換兩個變量的值:

>>> a = 1

>>> b = 2

>>> a, b = b, a

>>> a

2

>>> b

1

使用 * 運算符把一個可迭代對象拆開作為函數的參數:

>>> divmod(20, 8)

(2, 4)

>>> t = (20, 8)

>>> divmod(*t)

(2, 4)

元組拆包可以方便一個函數以元組的方式返回多個值,調用函數的代碼就可以輕松地(有選擇地)接受這些值。

>>> import os

>>> _, filename = os.path.split('/home/luciano/.ssh/idrsa.pub')

>>> filename

'idrsa.pub'

用 * 處理多余的元素:

>>> a, b, *rest = range(5)

>>> a, b, rest

(0, 1, [2, 3, 4])

>>> a, b, *rest = range(3)

>>> a, b, rest

(0, 1, [2])

>>> a, b, *rest = range(2)

>>> a, b, rest

(0, 1, [])

>>> a, *body, c, d = range(5)

>>> a, body, c, d

(0, [1, 2], 3, 4)

具名元組

collections.namedtuple 可以用來創建一個帶字段名的元組和一個有名字的類,便于對程序進行調試。其類實例消耗的內存與元組是一樣的,跟普通的對象實例相比更小一些(不用 __dict__ 存放實例的屬性)。

>>> from collections import namedtuple

>>> City = namedtuple('City', 'name country population coordinates')

>>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))

>>> tokyo

City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722, 139.691667))

>>> tokyo.population

36.933

>>> tokyo.coordinates

(35.689722, 139.691667)

>>> tokyo[1]

'JP'

創建具名元組需要傳入兩個參數,第一個是類名,第二個是類的各個字段的名稱。后者可以是多個字符串組成的可迭代對象或由空格分隔開的字段名組成的字符串。

可以通過字段名或位置獲取某個字段的信息。

具名元組的 _fields 屬性包含由這個類中所有字段名稱組成的元組;_asdict() 方法可以把具名元組以 collections.OrderedDict 的形式返回。

切片

關于切片和區間忽略最后一個元素

在切片和區間操作里不包含最后一個元素是 Python 的風格,同時也符合 C 和其他以 0 為起始下標的語言的習慣。

部分原因如下:

當只有最后一個位置信息時,可以快速看出區間里包含多少個元素:range(3) 和 my_list[:3] 都返回 3 個元素

起止位置都可見時,可以快速算出區間的長度(stop - start),如切片 my_list[3:6] 即包含 6 - 3 = 3 個元素

可以利用任意一個下標把序列分割成不重疊的兩部分(my_list[:x] 和 my_list[x:])

step

可以用 s[a:b:c] 的形式對 s 在 a 和 b 之間以 c 為間隔取值。c 值還可以為負,表示反向取值。

>>> s = 'bicycle'

>>> s[::3]

'bye'

>>> s[::-1]

'elcycib'

>>> s[::-2]

'eccb'

對 seq[start:stop:step] 求值時,Python 會調用 seq.__getitem__(slice(start, stop, step))。

對切片賦值

如果把切片放在賦值語句左邊,或把它作為 del 操作的對象,則可以對切片所屬的序列進行拼接、切除或就地修改等操作。

>>> l = list(range(10))

>>> l

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> l[2:5] = [20, 30]

>>> l

[0, 1, 20, 30, 5, 6, 7, 8, 9]

>>> del l[5:7]

>>> l

[0, 1, 20, 30, 5, 8, 9]

>>> l[3::2] = [11, 22]

>>> l

[0, 1, 20, 11, 5, 22, 9]

>>> l[2:5] = [100]

>>> l

[0, 1, 100, 22, 9]

需要注意的是,在對切片進行賦值操作時,賦值語句的右側必須是個可迭代對象。

對序列使用 + 和 *

Python 程序員一般默認序列都會支持 + 和 * 的拼接操作。在拼接過程中,兩個被操作的序列不會發生任何改動,Python 會創建一個新的包含拼接結果的序列。

>>> l = [1, 2, 3]

>>> l * 5

[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

>>> 5 * 'abcd'

'abcdabcdabcdabcdabcd'

如果 a * n 語句中序列 a 里的元素是對其他可變對象的引用的話,這個式子的結果可能會出乎意料。比如用 my_list = [[]] * 3 來初始化一個有列表組成的列表,實際上得到的列表里包含的三個元素是三個引用,且這三個引用都指向同一列表。

>>> weird_board = [['-'] * 3] * 3

>>> weird_board

[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]

>>> weird_board[1][2] = 'O'

>>> weird_board

[['-', '-', 'O'], ['-', '-', 'O'], ['-', '-', 'O']]

其錯誤的本質等同于如下代碼:

>>> row = ['-'] * 3

>>> board = []

>>> for i in range(3):

... board.append(row)

...

>>> board[1][2] = 'O'

>>> board

[['-', '-', 'O'], ['-', '-', 'O'], ['-', '-', 'O']]

即追加同一個行對象(row)到游戲幣(board)

正確的做法代碼如下:

>>> board = [['-'] * 3 for i in range(3)]

>>> board

[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]

>>> board[1][2] = 'O'

>>> board

[['-', '-', '-'], ['-', '-', 'O'], ['-', '-', '-']]

等同于如下代碼:

>>> board = []

>>> for i in range(3):

... row = ['-'] * 3

... board.append(row)

...

>>> board

[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]

>>> board[1][2] = 'O'

>>> board

[['-', '-', '-'], ['-', '-', 'O'], ['-', '-', '-']]

即每次迭代中都新建了一個列表,作為新的一行(row)追加到游戲板子(board)

序列的增量賦值

增量賦值運算符 += 和 *= 的行為取決于第一個操作對象。

+= 調用的特殊方法是 __iadd__(自增)。如果某個類沒有實現該方法,Python 會退一步調用 __add__。

如 a += b 就會調用 a 中實現的 __iadd__ 方法,同時對于可變序列(如 list、bytearray、array.array),該方法的行為類似于 a.extend(b),在 a 上就地改動。

如 a 沒有實現 __iadd__,a += b 的效果就類似于 a = a + b,計算 a + b 得到一個新的對象,再把這個對象賦值給 a。

*= 對應的是 __imul__。

>>> l = [1, 2, 3]

>>> id(l)

2888988078920

>>> l *= 2

>>> l

[1, 2, 3, 1, 2, 3]

>>> id(l)

2888988078920

>>> t = (1, 2, 3)

>>> id(t)

2888988799688

>>> t *= 2

>>> id(t)

2888988107592

作為可變對象的列表運用增量乘法后,ID 沒變;而作為不可變對象的元組運用增量乘法后,新的元組被創建。

因此對于不可變序列做重復拼接操作效率會很低,每次都會有一個新對象。但字符串除外,由于對字符串做 += 等操作太普遍,CPython 專門做了優化。在為字符串初始化內存時,程序會預留額外的可擴展空間。

list.sort 與 sorted

list.sort 方法會就地排序列表,即在原列表的基礎上完成排序,不會再另外復制一份。也因此其返回值為 None。

內置的 sorted 函數則會新建一個列表作為返回值。它可以接收任何形式的可迭代對象(包含不可變序列和生成器),最后返回的始終是排序好的列表。

>>> fruits = ['grape', 'raspberry', 'apple', 'banana']

>>> sorted(fruits)

['apple', 'banana', 'grape', 'raspberry']

>>> fruits

['grape', 'raspberry', 'apple', 'banana']

>>> sorted(fruits, key=len)

['grape', 'apple', 'banana', 'raspberry']

>>> fruits

['grape', 'raspberry', 'apple', 'banana']

>>> fruits.sort()

>>> fruits

['apple', 'banana', 'grape', 'raspberry']

參考資料

總結

以上是生活随笔為你收集整理的python的序列类型及其特点_Fluent Python 笔记——序列类型及其丰富的操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久99精品久久久久久琪琪 | 亚洲激情在线观看视频 | 亚洲av无码久久精品色欲 | 国产一区二区三区色淫影院 | 国产高清视频在线 | 国产乱码精品1区2区3区 | 日韩va视频 | 日韩黄大片| 无码国产精品一区二区免费式直播 | 国产视频精品免费 | 日本成人免费视频 | 欧美成人片在线 | 欧美性生活网站 | www.五月激情 | 成人a级网站 | 干老太太视频 | 日韩一级黄色片 | wwwxxxx欧美 | 久久久久视 | 免费看h网站 | 亚洲综合一区二区三区 | 欧美久久影院 | julia在线播放88mav | 又粗又大又硬又长又爽 | 黄色免费网站观看 | 亚洲妇女体内精汇编 | 日本免费在线观看 | 怡红院男人天堂 | 中文字幕日韩国产 | 91黄色免费网站 | 男人的天堂国产 | 国产在线拍揄自揄拍无码视频 | 天天天av | 亚洲天堂久久久久 | 日本激情一区二区 | 日韩亚洲视频在线观看 | 久久一二区 | 国产精品99久久久久久大便 | 中文字幕永久在线观看 | 性少妇mdms丰满hdfilm | 亚洲久久色 | 亚洲 欧美 激情 小说 另类 | 中文字幕5566 | 亚洲a精品 | 精品视频在线观看免费 | 国产高潮久久久 | 污视频免费看 | 在线麻豆视频 | 蜜桃精品成人影片 | 天堂在线视频免费观看 | 久久久久久在线观看 | 午夜激情影院 | 青青草国内自拍 | 国产精品欧美激情在线播放 | 国产在线拍揄自揄拍无码 | 在线观看视频日韩 | 韩国伦理片观看 | 成人一区二区三区仙踪林 | 成人高清视频免费观看 | 伊人免费在线 | 久久免费的精品国产v∧ | av先锋资源网 | 日韩三级精品 | 中文字幕在线视频不卡 | 97免费在线观看视频 | 成av人在线 | 中文字幕亚洲在线观看 | 日日夜夜人人 | 91香蕉久久 | 亚洲伦理一区二区 | 亚洲免费一区视频 | 午夜网站免费 | 亚洲偷偷 | 男男做爰猛烈啪啪高 | 伊人国产在线视频 | 黄色片网站在线 | 日韩一区二区a片免费观看 伊人网综合在线 | 亚洲美女一级片 | 欧美粗又大 | 欧美一二三区在线观看 | 在线观看av中文字幕 | 国产主播专区 | 狠狠操天天操 | 国产操人 | 日韩欧美一区二区三区免费观看 | 日韩一区二区在线免费观看 | 国产免费又黄又爽又色毛 | 黄黄的视频在线观看 | 日韩黄| 国产色一区| 中文字幕区 | 理论片中文字幕 | av在线资源网 | 亚洲欧美在线免费观看 | 欧美videos另类精品 | 一区三区视频在线观看 | 丰满少妇一区二区 | 亚洲精品网站在线播放gif | 欧美精品一区二区三区久久 |