流暢的python讀書筆記-第二章Python 數據結構

列表表達式

>>> symbols = '$¢£¥€¤'
>>> codes = [ord(symbol) for symbol in symbols]
>>> codes
[36, 162, 163, 165, 8364, 164]

生成器表達式(節省內存)

>>> symbols = '$¢£¥€¤'
>>> tuple(ord(symbol) for symbol in symbols) ➊
(36, 162, 163, 165, 8364, 164)
>>> import array
>>> array.array('I', (ord(symbol) for symbol in symbols)) ➋
array('I', [36, 162, 163, 165, 8364, 164])

元素拆包

latitude, longitude = lax_coordinates # 元組拆包python

不用中間變量交換值
b, a = a, bgit

_用來臨時擋住不要的對象
_, filename = os.path.split('/home/luciano/.ssh/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)
>>> *head, b, c, d = range(5)
>>> head, b, c, d
([0, 1], 2, 3, 4)

解包

可見在調用參數的時候使用*號能夠自動解包安全

def add(x,y):
    print x+y
para = (1,2)
add(*para)

同理若是是兩個星號的話,就是帶有**號的字典,自動解包app

def add(x,y):
    print x+y
kkwd = {'x' :1,'y':2}
add(**kkwd)

嵌套元素拆包
metro_areas = [
('Tokyo','JP',36.933,(35.689722,139.691667)), # ➊
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]dom

for name, cc, pop, (latitude, longitude) in metro_areas: # ➋
if longitude <= 0: # ➌
print(fmt.format(name, latitude, longitude))ssh

具名元組

Card = collections.namedtuple('Card', ['rank', 'suit'])函數

>>> City._fields ➊
('name', 'country', 'population', 'coordinates')
>>> LatLong = namedtuple('LatLong', 'lat long')
>>> delhi_data = ('Delhi NCR', 'IN', 21.935, LatLong(28.613889, 77.208889))
>>> delhi = City._make(delhi_data) ➋
>>> delhi._asdict() ➌
OrderedDict([('name', 'Delhi NCR'), ('country', 'IN'), ('population',
21.935), ('coordinates', LatLong(lat=28.613889, long=77.208889))])
>>> for key, value in delhi._asdict().items():
print(key + ':', value)
name: Delhi NCR
country: IN
population: 21.935
coordinates: LatLong(lat=28.613889, long=77.208889)
>>>

❶ _fields 屬性是一個包含這個類全部字段名稱的元組。
❷ 用 _make() 經過接受一個可迭代對象來生成這個類的一個實例,它
的做用跟 City(*delhi_data) 是同樣的。
❸ _asdict() 把具名元組以 collections.OrderedDict 的形式返
回,咱們能夠利用它來把元組裏的信息友好地呈現出來。工具

列表或元組的方法和屬性(那些由object類支持的方法沒有

列出來) page 84

切片

爲何切片和區間會忽略最後一個元素

  • 當只有最後一個位置信息時,咱們也能夠快速看出切片和區間裏有
    幾個元素:range(3) 和 my_list[:3] 都返回 3 個元素。
  • 當起止位置信息均可見時,咱們能夠快速計算出切片和區間的長
    度,用後一個數減去第一個下標(stop - start)便可。
  • 這樣作也讓咱們能夠利用任意一個下標來把序列分割成不重疊的兩
    部分,只要寫成 my_list[:x] 和 my_list[x:] 就能夠了,以下所
    示。
>>> l = [10, 20, 30, 40, 50, 60]
>>> l[:2] # 在下標2的地方分割
[10, 20]
>>> l[2:]
[30, 40, 50, 60]
>>> l[:3] # 在下標3的地方分割
[10, 20, 30]
>>> l[3:]
[40, 50, 60]

步進切片

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

+=

+= 背後的特殊方法是 iadd (用於「就地加法」)。可是若是一個類
沒有實現這個方法的話,Python 會退一步調用 add 。考

+= 的概念也適用於 *=,不一樣的是,後者相對應的
imul

好工具

Python Tutor(http://www.pythontutor.com)是一個對 Python 運行原理進行
可視化分析的工具。

內置函數sorted

一個只有一個參數的函數,這個函數會被用在序列裏的每個元素
上,所產生的結果將是排序算法依賴的對比關鍵字。

reverse
若是被設定爲 True,被排序的序列裏的元素會以降序輸出

注意並非簡單的把排序結果給反過來,是降序(按照以前的反排序)

數組

  • 若是咱們須要一個只包含數字的列表,那麼 array.array 比 list 更高效。
  • 數組支持全部跟可變序列有關的操做,包括 .pop、.insert 和.extend。
  • 另外,數組還提供從文件讀取和存入文件的更快的方法,如.frombytes 和 .tofile。

示例代碼

>>> from array import array ➊
>>> from random import random
>>> floats = array('d', (random() for i in range(10**7))) ➋
>>> floats[-1] ➌
0.07802343889111107
>>> fp = open('floats.bin', 'wb')
>>> floats.tofile(fp) ➍
>>> fp.close()
>>> floats2 = array('d') ➎
>>> fp = open('floats.bin', 'rb')
>>> floats2.fromfile(fp, 10**7) ➏
>>> fp.close()
>>> floats2[-1] ➐
0.07802343889111107
>>> floats2 == floats ➑
True

結論:

  1. array.tofile 和 array.fromfile 用 起來很簡單。
  2. 用 array.fromfile 從一個二進制文件裏讀出 1000 萬個 雙精度浮點數只須要 0.1 秒,
  3. 這比從文本文件裏讀取的速度要快 60倍,由於後者會使用內置的 float 方法把每一行文字轉換成浮點數。

列表和數組的屬性和方法 page110

NumPy 和 SciPy

NumPy 和 SciPy 提供的高階數組和矩陣操做,Python 成爲科學計
算應用的主流語言。

雙向隊列和其餘形式的隊列

collections.deque 類(雙向隊列)是一個線程安全、能夠快速從兩
端添加或者刪除元素的數據類型。

>>> from collections import deque
>>> dq = deque(range(10), maxlen=10) ➊
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
>>> dq.rotate(3) ➋
>>> dq
deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
>>> dq.rotate(-4)
>>> dq
deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], maxlen=10)
>>> dq.appendleft(-1) ➌
>>> dq
deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
>>> dq.extend([11, 22, 33]) ➍
>>> dq
deque([3, 4, 5, 6, 7, 8, 9, 11, 22, 33], maxlen=10)
>>> dq.extendleft([10, 20, 30, 40]) ➎
>>> dq
deque([40, 30, 20, 10, 3, 4, 5, 6, 7, 8], maxlen=10)

❶ maxlen 是一個可選參數,表明這個隊列能夠容納的元素的數量
❹ 在尾部添加 3 個元素的操做會擠掉 -一、1 和 2。

列表和雙向隊列 page 119

小總結

  1. 列表表達式 和 生成器表達式(元祖省內存)很好用
  2. 元祖的拆包十分神奇,尤爲是*號的存在
  3. 具名元組的實例也很節省空間,有點像模擬字典使用,._asdict() 方法來把記錄變成 OrderedDict 類型
  4. 切片是基本用法,給切片賦值是個好的修改方式
  5. +=
  • 增量賦值 += 和 *= 會區別對待可變和不可變序列。
  • 在遇到不可變序列時,這兩個操做會在背後生成新的序列。
  • 但若是被賦值的對象是可變的,那麼這個序列會就地修改
  1. sorted 函數,只須要一個比較方法key
  2. 純數字數組用 array.array比較好,NumPy 和 SciPy科學計算神奇世界
相關文章
相關標籤/搜索