Python基础学习(第7天)
第6課
1、循環對象:包括一個next方法,這個方法的目的是進行到下一個結果,結束后拋出StopInteration異常;
當循環結構如for循環調用一個循環對象時,每次循環的時候都會調用next方法,知道最后拋出StopInteration異常,循環結構知道結束,停止調用next方法。
如:
1 #text.txt內容為 2 123 3 123 4 123 5 for line in open('text.txt'): 6 print line
open方法返回的是一個循環對象,包含next方法,for循環自動調用next方法,直至出現StopInteration異常。
用循環對象的好處在于:不用在循環還沒有開始的時候,就生成好要使用的元素。所使用的元素可以在循環過程中逐次生成。這樣,節省了空間,提高了效率,編程更靈活。
2、迭代器:
從技術上來說,循環對象和for循環調用之間還有一個中間層,就是要將循環對象轉換成迭代器(iterator)。這一轉換是通過使用iter()函數實現的。但從邏輯層面上,常常可以忽略這一層,所以循環對象和迭代器常常相互指代對方。
3、生成器:
構造一個用戶自定義的循環對象
1)生成器的定義方法和函數定義類似,只是在return的地方換成yield;
2)生成器中可以有多個yield,當生成器遇到一個yield,會暫停運行生成器,返回yield后面的值;當再一次調用生成器時,會從剛才的地方繼續執行,直到遇到下一個yield;
3)生成器本身是一個循環器,每次循環返回一個yield后面的值
下面是一個生成器:
def gen():
a = 100
yield a
a = a*8
yield a
yield 1000
#該生成器有3個yield,用作循環器時,會進行3輪循環
for i in gen():
print i
1 def gen(): 2 for i in range(4): 3 yield i
這段代碼還可以寫成生成器表達式(Generator Expression):G = (x for x in range(4));生成器表達式是生成器的一種簡單編寫方式
4、表推導(list comprehension):是快速生成表(list)的方法。
假如要生成表:
L = []
for i in range(4):
L.append(i**2)
還有更簡單的方法,即:表推導的方法
1 L = [x**2 for i in range(4)]
練習題:
1 x1 = [1,3,5] 2 y1 = [9,12,13] 3 L = [x**2 for (x,y) in zip(x1,y1) if(y)>10]
L = [9,25]
View Code
第7課:函數對象
函數(function)也是一個對象,函數也有屬性和方法,不僅可以賦值給其它對象名,還可以作為參數傳遞。
1、lambda函數:定義1個函數
1 func = lambda x,y:x+y 2 print func(3,4) 3 4 等價于 5 def func(x,y): 6 return x+y 7 print func(3,4)
lambda生成1個函數對象,參數為x,y,返回值為x+y,函數對象的值賦給func
2、函數作為參數傳遞
函數可以作為對象,進行參數傳遞,函數名即為對象:
def test(f,a,b):
print 'test'
print f(a,b)
func = lambda x,y:x+y
test(func,1,2)
test函數的第一個參數就是一個函數對象,將func賦值給f,也可以這樣寫:test((lambda x,y:x+y),1,2)
3、map函數:格式:map( func, seq1[, seq2...] ),是Python的內置函數,第一個參數是一個函數對象,第二、第三個。。。是數列。
map函數的作用是:將函數對象作用于后面的數列的每一個元素,將每次作用的結果存儲在數列中(在Python 3.X中,map()的返回值是一個循環對象。可以利用list()函數,將該循環對象轉換成表。)
如下:
re = map((lambda x:x+3),[1,2,3])
print re
def func(x,y):
return x**2,y**2
re = map(func,[1,2,3,4],[2,3,4,5])
print re
輸出:
[4,5,6]
[(1,4),(4,9),(9,16),(16,25)]
4、filter函數:第一個參數也是函數對象,將函數對象作用于后面數列的每一個元素,如果函數對象返回的是True,則該次的元素儲存于返回的數列中,filter函數通過函數對象來篩選數據(同理在Python3.x中 filter返回的不是list,還是循環對象),如下例子所示:
1 def func (x): 2 if x>100: 3 return True 4 else: 5 return False 6 ru = filter(func,[100,104,99,101,123]) 7 輸出: 8 [104, 101, 123]
PS:filter函數最多2個參數,1個函數對象,1個數列,不像map函數可以有多個數列參數。
5、reduce函數:格式:reduce( func, seq[, init] ),第一個參數也是函數對象,且要求它能接受2個參數,然后每次迭代,將上一次的迭代結果(第一次時為init的元素,如沒有init則為seq的第一個元素)與下一個元素一同執行一個二元的func函數。在reduce函數中,init是可選的,如果使用,則作為第一次迭代的第一個元素使用。返回多次迭代后的結果,如下例子所示:
1 m = 2 2 n = 5 3 print reduce(lambda x,y:x*y,range(1,n+1)) #120 4 print reduce(lambda x,y:x*y,range(1,n+1),m) #240 相當于((((2*1)*2)*3)*4)*5,2為init元素
PS:reduce()函數在3.0里面不能直接用的,它被定義在了functools包里面,需要引入包。
總結
以上是生活随笔為你收集整理的Python基础学习(第7天)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式数据库 HBase
- 下一篇: 找点