>>> 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 的形式返
回,咱们能够利用它来把元组里的信息友好地呈现出来。工具
列出来) page 84
为何切片和区间会忽略最后一个元素
>>> 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 运行原理进行
可视化分析的工具。
一个只有一个参数的函数,这个函数会被用在序列里的每个元素
上,所产生的结果将是排序算法依赖的对比关键字。
reverse
若是被设定为 True,被排序的序列里的元素会以降序输出
注意并非简单的把排序结果给反过来,是降序(按照以前的反排序)
示例代码
>>> 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
结论:
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。
- 增量赋值 += 和 *= 会区别对待可变和不可变序列。
- 在遇到不可变序列时,这两个操做会在背后生成新的序列。
- 但若是被赋值的对象是可变的,那么这个序列会就地修改