python 學習筆記3(循環方式;list初始化;循環對象/生成器/表推導;函數對象;異常處理)


### Python的強大很大一部分原因在於,它提供有很多已經寫好的,可以現成用的對象

16. 循環方式筆記:

1)range(0, 8, 2)  

#(上限,下限,步長)  可以實現對元素或者下標的循環控制

2)enumerate()

每次返回包含兩個元素的定值表tuple,分別被賦予index, char

可以實現對元素和下標的同時控制,for (index,char) in enumerate(s):

3)zip()  聚合列表

如果有多個等長的序列,然后每次循環可以從各個序列分別取一個元素,組成一個元組。

zip(a,b)    #聚合

zip(*ab)   #分解聚合

例子:

ta = [1,2,3]
tb = [9,8,7]
zipped = zip(ta,tb)
print(zipped)

# decompose
na, nb = zip(*zipped)
print(na, nb)

17. 對list初始化賦值的方式

list1 =[0]*2    #[0,0]

list2=[i for i in range(2)]   #[0,1]

對於list 的賦值方式可以是多樣的。

list1: 你可以看做是兩個同樣的列表[0]相加,

list2: 利用for循環遍歷的方式。 

這兩種一般用於知道list長度,進行初始化,便於后面賦值/計算。

18. 循環對象

1)循環對象

一個對象,包含有一個next()方法(__next__()方法,在python 3x中), 目的是進行到下一個結果,而在結束一系列結果之后,報出StopIteration錯誤。

for line in open('test.txt'):
    print line                       #手動循環:f=open('test.txt')      f.next()

open() 返回的是一個循環對象,包含next() 方法;

循環直到出現StopIteration的時候結束.

相對於序列,循環對象的好處:不用事先就生成要使用的元素,可以在循環過程中逐次生成。這樣,節省空間提高效率。

 

迭代器(iterator),  循環對象和循環調用實際上有一個中間層,通過方法 iter()將循環對象轉化為一個迭代器。)

2)生成器(generator)

生成器(generator)主要是為了構成一個用戶自定義的循環對象。

與函數編寫類似,用yield代替了return,並且可以有多個yield。

生成器自身構成一個循環器。(每次循環使用一個yield返回的值。)

生成器表達式(generator expression)

是生成器的簡單寫法:

            G = (x for x in range(4))

3)表推導(list comprehension)

可以快速生成表。本來:

L = []
for x in range(10):
    L.append(x**2)

簡潔一點: 

L = [x**2 for x in range(10)]

19. 一些函數對象

函數作為對象,可以具有屬性(用dir() 查詢),也可以賦值給其他對象,還可以作為參數傳遞。

1) lambda()

可以定義函數,生成的函數對象與正常函數的調用無差異。

func = lambda x,y: x + y
print func(3,4)

2)函數作為參數傳遞

函數也可以作為參數傳遞,函數名即該對象

test((lambda x,y: x**2 + y), 6, 9)
test(func,6,9) #func(x,y): return x**2+y

3) map()

 可以將函數對象依次作用於表的每一個元素,每次作用的結果儲存於返回的表中.

re = map((lambda x: x+3),[1,3,5,6])  #函數有一個參數,對應一個輸入表
re = map((lambda x,y: x+y),[1,2,3],[6,7,9])  #函數有多個參數,對應多個輸入表

4) filter()

第一個參數也是函數,可以將函數作用於多個元素。

filter通過讀入的函數來篩選數據,如果函數的結果是True,  則該元素被存儲於返回的表中。

def func(a):
    if a > 100:
        return True
    else:
        return False

print filter(func,[10,56,101,500])

5) reduce()

第一個參數是函數,但是要求該函數能接收兩個參數;

可以累進地將該函數作用於各個參數

print reduce((lambda x,y: x+y),[1,2,5,7,9])

相當於 (((1+2)+5)+7)+9

 

20. 異常處理

1)StopIteration

該異常是在循環對象窮盡所有元素時的報錯。

re = iter(range(5))

for i in range(100):
    print re.next()

print 'not run'

 報StopIteration,整個程序中斷。

2)try... except

我們可以針對異常的類型,提前定義好應急方案:

try程序段中,我們放入容易犯錯的部分。

然后跟上except,來說明如果在try部分的語句發生StopIteration時,程序該做的事情。

try:
    ...
except exception1:
    ...
except exception2:
...
except ...
else: ... finally: ...

3) 自己可以拋出異常

raise StopIteration


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM