切片
L是一个list或tuple或string,对L的切片可以表示为L[a:b::c]
表示从索引a开始取到b(不含)为止,每隔c个取一个。当a为0时可缺省。a、b可为负值因为[-1]表示最后一个元素以此类推。全缺省L[:]
则复制list。L[::-1]
则逆序复制了一个list
迭代
list, tuple, dict(默认迭代key,顺序不定。迭代值可以用d.value()), str都是可迭代对象。可迭代对象的判断可以使用以下代码
from collections import Iterable
isinstance(a, Iterable)
enumerate()可以将list变为索引-元素对,从而在for中同时迭代索引和元素
列表生成式
列表生成式提供了一个简洁快速的方法来生成列表
[f(x) for x in L if g(x)]
使用满足g(x)的L的各元素生成对应的f(x)list
[(x,y) for x in l1 for y in l2]
两层循环,实现l1和l2的笛卡尔积
生成器
将列表生成式的[]改成()就成为了一个生成器g。生成器可以节省资源,保存的是算法,因此直接调用g返回的是对象而不是结果。因为生成器是可迭代对象,因此输出其生成的值可以用循环来输出。
生成器还有一种定义方法。函数定义中如果有yield
关键字,则函数就成为一个生成器。如果最后有返回值,则使用for循环生成器不能拿到返回值。如果想拿到返回值,要在try
中使用next(g)
将g的生成结果逐个输出,然后用except StopIteration as e
捕获错误,e.value()
就是返回值
最后有一个使用生成器生成杨辉三角的习题。下一行的元素是上一行相邻元素之和,两头再追加1。进而可以考虑下一行实际上是两个上一行错位相加形成,缺少对应的加数则补0。考虑到这里的时候就可以构造出l.append(0)
然后l[::-1]
构造两个顺序相反的补0list,对应元素相加就可以得到下一行。然而这种方法还得构造逆序,仍然有些麻烦。
如果只使用补0之后的l,则l[i]+l[i+1]
需要注意索引i+1不能越界,而且第一个1还要另外计算。但是list有个特性就是l[-1]是最后一个元素。因此使用l[i]+l[i-1]
不仅解决了索引越界问题,而且还能将最后补的0用两次,可谓是一种十分简洁安全的算法
def triangle():
l = [1]
while True:
yield l
l.append(0)
l = [l[i] + l[i-] for i in range(len(l))]
迭代器
凡是可以用next()的对象都是迭代器类型。凡是可以用for的对象都是可迭代类型。可迭代类型不一定是迭代器,如list,dict,str等。但可以使用iter(对象)来获得迭代器。因为迭代器的序列长度是未知的,其计算也是惰性的。