列表推导 List Comprehension
可快捷创建列表,精简代码提高可读性。
直接上例子:
symbols = '&%&$^'
codes = [ord(symbol) for symbol in symbols]
print(codes)
对于列表推导,通常的原则是只用列表推导来创建列表
笛卡尔积理解为矩阵的形式。m x n
换汤不换药。
colors = ['black', 'white']
sizes = ['large', 'medium', 'small']
on_sale = [(color, size) for color in colors
for size in sizes]
print(on_sale)
生成器表达式
虽然可以用序列函数 + 列表推导来生成其他序列,但生成器表达式是最好的方法。
这是因为生成器表达式遵守了迭代器协议,可以逐个产出元素而不是先建立完整的列表,能够更省内存
语法上只是把[]换成了()而已。
colors = ['black', 'white']
sizes = ['large', 'medium', 'small']
for cloth in ('%s %s' % (c, s) for c in colors
for s in sizes):
print(cloth)
>black large
black medium
black small
white large
white medium
white small
逐个产出元素,避免额外内存占用,省掉大额运行for循环的开销。(如10000*10000这种大型数据)
元组的其他用法
除了不可变的列表外,还能用于没有字段名的记录。
元组其实是对数据的记录:元组的每个元素都存放了记录中一个字段的数据,外加这个字段的位置,正是这个位置信息给数据赋予了意义。
将元组当为一些字段的集合,数量和位置信息都会变得非常重要。
唯一硬性要求,两者保证一对一的关系
作用1:简化赋值声明:
city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
作用2:
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
for passport in sorted(traveler_ids):
print('%s/%s' % passport)
迭代过程中,passport被绑定到每个元组上,%格式运算能被匹配到对应的元组元素上。
作用3:拆包 unpacking
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
for county, _ in traveler_ids:
print(county)
拆包:分别提取元组里的元素。
对于不用的元素赋值给“_"占位符。
*
运算符的用法
可以把一个可迭代对象拆开作为函数的参数。
divmod返回商和余数。
t = (20, 8)
quotient, remainder = divmod(*t)
print(quotient, remainder)
还可以让一个函数用元组的形式返回多个值,然后调用函数接受这些返回值,
比如函数os.path.split( )返回以路径和最后一个文件名组成的元组。
import os
_, file_name = os.path.split('/home/halo/lucas/eason.txt')
print(file_name)
除此以外,在拆包中用*也可以把注意力集中在元组的部分元素上。可以使用其来处理剩下的元素。
嵌套元组:
关于format方法的详情
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)),
}
print('{:15} | {:^9} | {:^9}'.format('', 'lat.', 'long.'))
fmt = '{:15} | {:9.4f} | {:9.4f}'
for name, CC, pop, (latitude, longitude) in metro_areas:
print(fmt. format(name, latitude, longitude))
> | lat. | long.
New York-Newark | 40.8086 | -74.0204
Tokyo | 35.6897 | 139.6917
Delhi NCR | 28.6139 | 77.2089
Mexico City | 19.4333 | -99.1333
Sao Paulo | -23.5478 | -46.6358
具名元组
from collections import namedtuple
City = namedtuple('City', 'name county population coordinates')
tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
实现事例:
创建一个具名元组需要两个参数,第一个是类名,第二个是类的各个字段的名字(可以是由数个字符串组成的可迭代对象或者是由空格分割开的字段名组成的字符串)
存放在对应字段里的数据要以一串参数的形式传入到构造函数中,只接受单一的可迭代对象。
除了从普通的元组继承来的属性外,具名元组还拥有专有属性。
_fields
属性,是一个包含这个类所有字段名称的元组。
_make( )
, 通过接受一个可迭代对象来生成这个类的一个事例,作用与City(*delhi_data)
一样
_asdict()
,把具名元组以collections.OrderedDict的形式返回。