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,用列表生成式就很方便python
[x*x for x in range(1:n)]函數
還能夠添加條件篩選spa
[x*x for x in range(1:n) if x%2 ==]code
能夠生成全隊列對象
[x+y for x in ‘AB’ for y in ‘CD’]blog
[‘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']
因爲當列表生成式生成大量數據時會佔用大量的內存,因此若是列表的元素能夠經過一邊循環一邊計算出來,能夠節省大量的空間,這種一邊循環一邊計算的方式成爲生成器:generatorgenerator
g = (x*x for x in [1,2,3,4,5,6,7,8,9]) #定義一個生成器it
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]