廖雪峰老師的python教程筆記
1、切片(Slice)
取列表或元組指定索引范圍的元素的簡(jiǎn)便寫(xiě)法(也可用循環(huán))
L[0:3] 表示索引從0開(kāi)始,till索引3為止,但不包括3
當(dāng)是0時(shí),也可以省略不寫(xiě)。
同時(shí)支持倒數(shù)切片 L[-2:],不寫(xiě)默認(rèn)到最后(取出后兩個(gè)數(shù))
L[-2:-1]不等于L[-2:]? 第一個(gè)不包括-1最后一個(gè)元素
L[:10:2] 前十個(gè)數(shù) 每隔兩個(gè)取一次
L[::5] 原列表L每隔5個(gè)取一個(gè)
對(duì)于不可變的元組和str也可以用切片
(0, 1, 2, 3, 4, 5)[:3]? 取前三個(gè)? 輸出類型仍未元組
'ABCDEFG'[::2]? 隔兩個(gè)取
2、迭代(for..in..)
其實(shí)就是遍歷list、tuple,python中也適用于無(wú)下標(biāo)的字典,但因?yàn)闊o(wú)序,所以每次運(yùn)行順序不同;字符串也適用,只要對(duì)象是可迭代對(duì)象即可。
>>> from collections import Iterable
>>> isinstance('abc', Iterable)? ?# str是否可迭代
True
默認(rèn)情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時(shí)迭代key和value,可以用for k, v in d.items()。
也可同時(shí)迭代索引和元素本身
for i, value in enumerate(['A','B','C']):
? print(i, value)
3、生成列表
(1)? ?list(range(1,11))
(2)? ?L = []
? ? ? ? for x in range(1,11):
? ? ? ? ? ? ? ?L.append(x * x)
(3)??[x * x for x in range(1,11)]
(4)兩個(gè)循環(huán)形成全排列
?>>> [m + n for m in 'ABC' for n in 'XYZ']['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ']
(5)for后還可加if篩選
>>> [x * x for x in range(1,11) if x %2 == 0][4,16,36,64,100]
前面x*x就是對(duì)遍歷后的元素進(jìn)行的操作,然后把所有元素組成列表
>>> d = {'x':'A','y':'B','z':'C'}
>>> [k +'='+ v for k, v in d.items()]
? ? ? ? ['y=B','x=A','z=C']
4、生成器generator
列表元素可以按照某種算法推算出來(lái),不必事先全部?jī)?chǔ)存在其中,浪費(fèi)內(nèi)存,要什么取什么。generator保存的是算法。
(1)只要把一個(gè)列表生成式的[]改成()
g = (x * x for x in range(10))
for n in g:
... print(n)
(2)如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator,在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語(yǔ)句返回,再次執(zhí)行時(shí)從上次返回的yield語(yǔ)句處繼續(xù)執(zhí)行。
return 也結(jié)束生成器函數(shù)
5、迭代器
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值,直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤的對(duì)象稱為迭代器:Iterator。
生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable可迭代對(duì)象,卻不是Iterator迭代器。
Python的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列,但我們卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò) next(生成器函數(shù)) 函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù)。