
特性
切片
L=[0,1,2,3,4,5,6,7,8,9,10]
L[:3]=[0,1,2]
L[-2:]=[9,10]
L[1:3]=[1,2]
L[::3]=[0,3,6,9]
L[:5:2]=[0,2,4]
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[-1: -5: -1]
[9, 8, 7, 6]
>>> alist[9: 5: -1]
[9, 8, 7, 6]
>>> alist[-1::-1]
[9, 8, 7, 6, 5, 4, 3, 2,1,0]
>>> alist[6:-8:-1]
[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]