【流畅的Python】笔记二:
二、数据结构
1.容器序列:存放他们所包含任意类型的对象的引用。
list、tuple、collections.deque能放不同类型的数据。
2.扁平序列:存放的是值,不是引用。
str、bytes、bytearray、memoryview、array.array 仅能容纳一种类型。
此类序列其实是一段连续的内存控件,只能存放字符、字节和数值。
3.可变序列:
list、bytearray、array.array、collections.deque、memoryview
4.不可变序列:
tuple、str、bytes
=====================================================
对于列表推导式:生成列表
symbols = ‘$%^&*’
codes = [ord(symbol) for symbol in symbols]
通常原则是:只用来创建新的列表,并尽量保持简短。(小技巧:python会忽略{}\[]\()中的换行。)超过多行就需要用for循环来重写。
列表推导不再有变量泄露的问题,也即列表推导式中的循环变量不会影响推导式外的同名变量,他们仅作用于自己的局部作用域。
colors = ['black','white']
sizes = ['S','M','L']
tshirts = [(color,size) for color in colors for size in sizes]
=====================================================
生成器表达式:用来初始化元组、数组及其他序列类型。
生成器表达式遵循了迭代器协议,可以逐个产出元素,节省内存。(列表生推导式也能产生成,但首先是建立列表,然后再把列表传递到某个数据结构中,浪费内存。)
symbols = '#$%^&&'
tuple(ord(symbol) for symbol in symbols)import array
array.array('I',(ord(symbol) for symbol in symbols))
colors = ['black','white']
sizes = ['S','M','L']for tshirt in ('%s %s' %(c,s) for c in colors for s in sizes):
print(tshirt)
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
元组:(每个元素都存放了一个字段的数据,以及该字段的位置)
lax_coordinates = (33.123,-118.1234)
city,year,pop,chg,area = ('Tokyo',2003,32450,0.66,8014)
traveler_ids = [('USA','312312412'),('BRA','34923459'),('ESP','59881230')]
for passport in sorted(traveler_ids):
print('%s/%s'%passport)for country,_ in traveler_ids:
print(country)
元组拆包,使用“_” 占位符,“*”:表示的是忽略多余的元素。
>>> latitude,longitude = lax_coordinates
>>> latitude
33.123
>>> longitude
-118.1234
>>> divmod(20,8)
(2, 4)
>>> t = (20,8)
>>> divmod(*t)
(2, 4)
>>> quotient,remainder = divmod(*t)
>>> quotient,remainder
(2, 4)
用*args 来获取不定量的参数。
>>> 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, [])
>>> *head, b, c, d = range(5)
>>> head, b, c, d
([0, 1], 2, 3, 4)
具名元组:collections.namedtuple 用来构建一个带字段名的元组和一个有名字的类。需要两个参数,1是类名,2是各个字段的名字
>>>Card = collections.namedtuple(‘Card’,[‘rank’,’suit’])
>>> card_a = Card('A','square')
>>> card_a
Card(rank='A', suit='square')
>>> card_a.rank
'A'
>>> card_a.suit
'square'
>>> card_a[0]
'A'