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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

fluent python 第二版_Fluent Python 笔记(二):序列基础

發布時間:2023/12/15 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fluent python 第二版_Fluent Python 笔记(二):序列基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

本篇開始總結 Python 基本的數據結構,大部分情況下,這些數據結構就已經夠用了,不需要重復造輪子。首先是序列及其相關的操作。

序列(Sequence)

標準庫中提供了很多序列類型,都是C實現的,效率很高。容器序列(Container sequences):

list, tuple, collections.deque ...

容器序列持有的是所包含對象的引用,可以是任意類型。平坦序列(Flat sequences):

str, bytes, bytearray, memoryview, array.array

平坦序列物理上存儲每個條目對應的內存空間的值,而不是作為不同的對象。

因此,平坦序列更加緊湊,但是他們只能保存原始的數值如字符,字節和數字。

根據可不可變分類:

可變的序列:

list, bytearray, array.array, collections.deque, memoryview

不可變序列:

tuple, str, bytes

如何快速生成一個序列?列表推導(List Comprehensions)

生成器表達式(Generator Expressions)

強烈推薦列表推導,用它實現的代碼簡潔,易讀,執行效率高,堪稱完美。

首先舉一個例子:

取出一個字符串列表中所有小寫的字符串,并組成列表

>>> words = ['The', 'quick', 'BROWN', 'Fox', 'jumped', 'OVER', 'the', 'Lazy', 'DOG']

>>> [word for word in words if word.islower()]

['quick', 'jumped', 'the']

列表推導格式以 [] 為標志,內容分為三部分 [A B C],A,B,C分別代表一個表達式,其中C可以省略。

對于上面的例子:A:word

B:for word in words

C:if word.islower()

首先看B,B的格式一般為 for x in xxx,表示從一個序列中逐個選取元素,也就是常用的 for in 結構。可以有多個for in,比如 for x in xxx for y in yyy。使用多個for的時候,就會生成所有組合。例如列舉出不同顏色尺寸的T恤組合 :

>>> colors = ['black', 'white']

>>> sizes = ['S', 'M', 'L']

>>> tshirts = [(color, size) for color in colors for size in sizes]

>>> tshirts

[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'),

('white', 'M'), ('white', 'L')]

然后看C,C提供一個判斷條件,格式一般為 if xxx,其中可以用到B所給出的x,用于選取符合條件的條目。可以省略,也就意味著使用B生成的所有條目。

最后看A,A格式隨意,可以使用B中給出的x(或者y),當然也可以不使用。

>>> [word[0] for word in words if word.islower()]

['q', 'j', 't']

>>> [3 for word in words if word.islower()]

[3, 3, 3]

列表推導時一般控制在一行以內,如果只有多行才能實現,那說明邏輯太復雜了,考慮別用列表推導了,展開吧。

生成器表達式和列表推導唯一的不同是用 () 包圍而不是 [],如果不需要一次性生成整個列表,那么用生成器表達式更好。如下:

>>> (word for word in words if word.islower())

at 0x02F00288>

這樣只是構造了一個生成器對象,每個元素會在需要用到的時候才進行構造,可以原封不動地用于 for in 結構,需要變成列表的時候也可以隨時調用 list() 函數轉化為列表。

元組(Tuple)

元組的主要用途:作為不可變的列表

作為沒有字段名稱的記錄

元組解包:

>>> lax_coordinates = (33.9425, -118.408056)

>>> latitude, longitude = lax_coordinates # tuple unpacking

>>> latitude

33.9425

>>> longitude

-118.408056

作為函數參數就地展開,在前面加*就可以了:

>>> divmod(20, 8)

(2, 4)

>>> t = (20, 8)

>>> divmod(*t)

(2, 4)

具名元組(Named Tuples):

因為元組作為記錄比較好用,因此出現了 namedtuple,在 collections 模塊中。

使用 namedtuple 創建的實例消耗的內存和普通元組相同,因為字段的名字是存儲在類中的。他們使用的內存比普通的類要少,因為它們不用在每個實例的 __dict__ 中存儲屬性。

使用示例:

>>> from collections import namedtuple

>>> Point = namedtuple('Point', 'x y')

>>> p = Point(3, 4)

>>> p

Point(x=3, y=4)

>>> p.x

3

>>> p[1]

4

namedtuple 有幾個有用的屬性和方法:_fields 類屬性,保存所有字段名稱

>>> Point._fields

('x', 'y')_make(iterable) 類方法,使用已經存在的序列或者 iterable 來創建 namedtuple

>>> point_tuple = (3, 4)

>>> p = Point._make(point_tuple)

>>> p

Point(x=3, y=4)_asdict() 實例方法,返回一個 OrderedDict,映射名稱和對應的值。

>>> p._asdict()

OrderedDict([('x', 3), ('y', 4)])

總結:

Python 中序列的用法是大同小異的,基本上掌握了一個,其他的都差不多,剩下的就是可不可變,存儲的是值還是引用需要注意下。

使用列表推導來構建序列能夠讓代碼變得非常簡潔,容易理解,推薦多嘗試使用。

元組用來作為數據記錄比較好用,namedtuple 使得元組在保持低內存消耗的情況下更加容易調試。

總結

以上是生活随笔為你收集整理的fluent python 第二版_Fluent Python 笔记(二):序列基础的全部內容,希望文章能夠幫你解決所遇到的問題。

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