Python3學習筆記(2)——特性和語句

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]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章