特性
切片
1 L=[0,1,2,3,4,5,6,7,8,9,10] 2 L[:3]=[0,1,2] 3 L[-2:]=[9,10] 4 L[1:3]=[1,2] 5 L[::3]=[0,3,6,9] 6 L[:5:2]=[0,2,4] 7 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 8 >>> alist[-1: -5: -1] 9 [9, 8, 7, 6] 10 >>> alist[9: 5: -1] 11 [9, 8, 7, 6] 12 >>> alist[-1::-1] 13 [9, 8, 7, 6, 5, 4, 3, 2,1,0] 14 >>> alist[6:-8:-1] 15 [6, 5, 4, 3]
列表生成式
例如:生成一个1,2,3 …… 的平方的List,用列表生成式就很方便
[x*x for x in range(1:n)]
还可以添加条件筛选
[x*x for x in range(1:n) if x%2 ==]
可以生成全队列
[x+y for x in ‘AB’ for y in ‘CD’]
[‘AC’,’AD’,’BC’,’BD’]
dict用于行列生成式
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> [k + '=' + v for k, v in d.items()] ['y=B', 'x=A', 'z=C']
列表生成器
由于当列表生成式生成大量数据时会占用大量的内存,所以如果列表的元素可以通过一边循环一边计算出来,可以节省大量的空间,这种一边循环一边计算的方式成为生成器:generator
g = (x*x for x in [1,2,3,4,5,6,7,8,9]) #定义一个生成器
next(g) 1
next(g) 4
…..
因为生成器也是可迭代对象,所以可以用for n in g print(n)读取生成器数据
例子:斐波拉契数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到 1,1,2,3,5,8,13,21,34…
def fei(n) a,b = 0,1 while n: yield b a,b = b,a+b n = n-1 return ‘done’
其中yield是关键字,可以把定义的函数变成一个generator,这里最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
f = fei(6)
next (f) 1
next(f) 1
或者for x in fib(6)
print(x)
但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
>>> g = fib(6) >>> while True: ... try: ... x = next(g) ... print('g:', x) ... except StopIteration as e: ... print('Generator return value:', e.value) ... break ...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
例子
def yang () L = [1] while True yield L L = [1] + [L[i]+L[i+1] for i in range(len(L)-1)] + [1]