1 特性
1.1 切片操作
可以對列表、字符串、元組等序列類型操作
list1=[1,2,3];a=list1[:2];a[0]=2 #list1 由於列表元素是不可變的數值類型,所以改變數據時,顯式的創建了新的數據,因此改變a,list1不受影響(但是對於numpy的array類型,切片只是原數組的視圖,任何改變都會反映到原數組,應該用.copy()方法複製一份)
從0開始計數
list1=[1,2,3,4,5]list1[:3] #[1,2,3]不包含索引爲3(即元素4)
最後一個元素 list1[-1]
最後十個元素 list1[-10:]
步長 list1[::-1]翻轉
1.2 迭代器
1.2.1 迭代器(Iterator)
是一個實現了__next__()方法的對象。迭代器同時也是可迭代對象。而不是通過索引來計數。不能向後移動,不能回到開始,也不能被複制。
*注:Iterator實現的__iter__是爲了兼容Iterable的接口,從而讓Iterator成爲Iterable的一種實現。
Iterator也是一種Iterable,所以也需要實現Iterable的接口,也就是__iter__,這樣在for當中兩者都可以使用。Iterator的__iter__只需要返回自己就行了。比如for i in list1: 和for i in iter(list1):都對。
list、dict等對象可以重複和併發遍歷,通過__iter__每次返回一個獨立的迭代器,可以保證不同的迭代過程不互相影響。而生成器表達式的結果往往是一次性的,不可以重複遍歷,所以直接返回一個Iterator就好。讓Iterator也實現Iterable的兼容就可以很靈活地選擇返回哪一種。
1.2.2 可迭代對象(lterable)
可以直接作用於for循環的對象統稱爲可迭代對象。是實現了__iter__()方法的對象,可以被迭代。
一類是集合數據類型,如list、tuple、dict、set、str等,一類是generator,包括生成器表達式和帶yield的generatorfunction返回的生成器對象。
可以調用iter()函數,返回一個迭代器。
可以使用如下語句判斷一個對象xx是否是Iterable對象。
from collectionsimport Iterable
isinstance(xx,Iterable)
內建函數iter(): 調用對象的__iter__()方法。例如 i=iter([1,2,3,4]);i.next() #
字典:字典的迭代器會迭代它的鍵。iter(dict1) # 會返回鍵的迭代器
文件:for循環可以自動調用文件對象的readline() 方法.
for eachLine in myFile:
*不要在迭代可變對象的時候修改它們。比如遍歷列表時刪除滿足條件的項。而迭代器是與原始對象捆綁在一起,語法上禁止迭代中改變對象長度。
1.2.3 相關模塊:itertools
1.3 列表解析
迭代 iterable 對象的所有條目. 前邊的expr應用於序列的每個成員, 最後的結果值是該表達式產生的列表.con_exdr是篩選或過濾條件
[expr for iter_val in iterable]
[expr for iter_val in iterable ifcond_expr]
[x**2 for x in range(8) if not x % 2]
迭代二維對象,相當於循環嵌套:
[expr for iter_val1 in iterable1 ifcond_expr2 for iter_val2 in iterable2 ifcond_expr2]
[(x+1,y+1) for x in range(3) for y inrange(5)]
len([word for line in myFile for wordin line.split()])#迭代每個單詞
1.4 生成器(generator)
1.4.1 生成器表達式
與列表解析式相似,但是不生成整個列表,而是每次計算出一個條目,就把它yield出來,內存上更有效。
(expr for iter_var in iterable if cond_expr)
例1:計算文本中非空白字符總和
sum(len(word) for line in data for wordin line.split())#每計算出一個len(word)就傳給sum()
1.4.2 生成器
生成器實現了__next__()方法,因此本身是一個迭代器,同時也是可迭代對象。它是一個帶yield 語句的函數, 生成器能暫停執行並返回一箇中間的結果.
生成器函數的默認返回值是一個生成器。調用生成器函數將返回一個生成器:val1=gen()
當到達函數結束或return,(當調用next()),拋出StopIteration異常。
def foo(): print(1) yield ('yield:1') print(2) yield ('yield:2') return 'done' |
o=foo() next(o) next(o) next(o) |
#必須用變量調用生成器函數,才能獲得一個生成器 #或者o.__next__(), 返回1 yield:1 #返回2 yield:2 # 返回異常StopIteration: done |
.send()函數:在生成器函數中,將yield變成一個表達式,使其有一個值n = (yield n),這個值就是外部調用send(val)時傳進來的參數,可供生成器下一次使用。
.close()函數:用於關閉生成器。
1.4.3 相關模塊:pipe
2 語句
2.1 語句基礎
換行:跨行符: \ 語句分行; 三引號:''' 字符串跨行; 括號元素:() {} []等
同一行寫多個語句:用分號 ;(不提倡)
2.2 成員關係操作(in, not in)
可以對列表、字符串、元組、字典(查詢的是鍵)類型操作,返回bool邏輯值
2.3 三元操作符
val1=1 if x==1 else 2 #如果x==1,則val1=1,否則val1=2
2.4 for循環
for循環訪問一個可迭代對象,序列、迭代器。
2.4.1 迭代序列
①通過序列項迭代:for item in seq1:
②通過索引: for index in range(len(seq1)):
③使用項和索引: for index,item in enumerate(seq1):
2.4.2 用於迭代器類型
迭代器對象有一個next()方法, 調用後返回下一個條目. 所有條目迭代完後,自動地調用迭代器的next()方法, 捕獲 StopIteration 異常並結束循環。
2.4.3 range函數
range() 函數返回的是一個可迭代對象,不是整個列表(可以用list())。
range(start, end, step =1) |
生成k,start <= k < end,以step步長 |
range(end) |
返回[0,end)的可迭代對象 |
2.5 continue
在開始下一次迭代前,如果是條件循環,將驗證條件表達式.如果是迭代循環,將驗證是否還有元素可以迭代. 只有在驗證成功的情況下, 纔會開始下一次迭代.
2.6 循環中的else
循環執行完畢正常退出(而不是通過break退出),執行else中的內容。
while xxx: [codes] else: [codes] |
for i in XXX: [codes] else: [codes] |