Python中 內置函數

Map

map 函數在python3裏面不再像以前一樣,返回的是結果集,現在它返回的是一個map object

Map對象也相當於一個生成器表達式,同樣擁有next()方法

>>> map((lambda x:x),(1,2,3))
<map object at 0xb714b7ac>
>>> F=map((lambda x:x),(1,2,3))            #所以說map對象也是一個可迭代對象,每次只求一個值
>>> next(F)
1

可以通過list函數或列表解析來實現對map對象進行循環調用

>>> list(map(abs,(-1,2,-4)))
[1, 2, 4]
>>> [i for i in map(abs,(-1,2,-4))]
[1, 2, 4]
Map對象每一次next()方法返回的都是經過expr處理過後的表達式的值,如F=map(iter,((1,2,3),(5,4),(6,7))) 它每次得到的就是元組迭代對象

Range

Range 函數返回一些列連續增加的整數,可用作for中的索引,指定重複的次數

>>> list(range(5, -5, -2))   #第一個爲“下限”,第三個爲步值
[5, 3, 1, -1, -3]
>>> for i in range(3):        #等價與C++中 for (i=0,i<3,i++)
... 	print(i, 'Python')

其實我以前一直有個疑問就是:比如形式for i in range(6),它是先求出(0,1,2,3,4,5)這個結果集,然後變成形式for i in (0,1,2,3,4,5)把後面當成一個元組進行處理,還是你每執行一次循環,range對象求一個值賦給你呢?

我當時之所以這麼認爲,因爲感覺for i in file,你看人家file就是一個整體數據塊在那放着,而range(6)是不是也得先轉換爲一個數據塊呢?其實完全有點進入誤區了。你只需把他們兩個都當成對象就行了,對於對象file,每一次循環它都是把next(temp)賦值給i;然後我range(6)也就類似唄,每一次也都將next(temp)賦值給i就行了。只是它倆的表現形式是對於file,它是取得了一行數據,而range(6)我們是得到了一個數,看着可能有點疑問,我本身是一個range(6)對象,怎麼最後會出來一個數字呢?可以想象的是range對象中的next方法肯定是return一個迭加數值,或者說是yield出來一個值。。

編譯結束後,是否是一個數據塊等待着你來進行處理,關鍵是看它的next方法,到底是返回一個generator object,還是一個列表解析;最直接的方式就是把給嵌套函數賦予相應的值,查看它的結果


>>> a=range(6)
>>> a
range(0, 6)                                                #從結果可以看出它是每一次循環才求出一個值付給i
>>> next(a)
TypeError: range object is not an iterator
>>> temp=iter(a)
>>> next(temp)
0
>>> next(temp)
1
>>> temp2=iter(a)
>>> next(temp2)
0


list 

list 對對象進行iter調用,然後for循環加入到一個元組中。

>>> list('me')
['m', 'e']
>>> list((1,2,3))
[1, 2, 3]
>>> list(((1,2,3),(4,5,6)))     
[(1, 2, 3), (4, 5, 6)]
>>> list(2,3,3)
TypeError: list() takes at most 1 argument (3 given)
>>> list((1,2,3),(4,5))
TypeError: list() takes at most 1 argument (2 given)

list 可以對一個迭代對象,循環處理,並返回每次循環結果組成的元組,相當於進行列表解析

>>> M=map(pow,(1,2,3),(4,5,6))            #我們前面已經說了,現在的map函數是返回一個map object 不再是結果集 
>>> M
<map object at 0xb714aa8c>
>>> list(M)
[1, 32, 729]
>>> [i for i in map(pow,(1,2,3),(4,5,6))] #列表解析形式
[1, 32, 729]

並行遍歷zip

函數返回並行元素的元組的列表,
zip不僅僅是用於列表,同樣可以用於string,Zip會以最短序列長度爲準來截斷所得到的元組

>>> L1 = [1,2,3,4]
>>> L2 = [5,6,7,8]
>>> zip(L1,L2)
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> for (x,y) in zip(L1,L2)

根據下面的輸出結果,我們可以知道如果zip在被嵌入調用的時候,它是隨着循環一次求出一個值,然後付給i

>>> Z=zip((1,2,3),(3,4))
>>> Z
<zip object at 0xb714aa6c>
>>> next(Z)
(1, 3)
>>> next(Z)
(2, 4)
>>> list(zip((1,2,3),(3,4)))   #list等價與列表解析,對它進行for循環輸出顯示
[(1, 3), (2, 4)]
>>> list(zip((1,2)))
[(1,), (2,)]

Dict構造字典

平時讓你寫字典的話,很簡單,直接大括號裏面鍵值對就行。但是如果就給你兩個列表呢?可以zip和內置函數dict

>>> keys = ['spam', 'egg', 'toast']
>>> vals = [1,3,5]
>>> D3 = dict(zip(keys,vals))
>>> D3
{'toast': 5, 'egg': 3, 'spam': 1}

enumerate 產生偏移和元素

>>> s = 'spam'
>>> e = enumerate(s)
>>> e
<enumerate object at 0xb72938c4>
>>> next(e)                                        #第一次next讀的是第一個元素
(0, 's')
>>> for (offset,item) in enumerate(s):
... 	print (item, 'appear at offset', offset)   #因爲它每次返回一個元組包含兩項,一項位移,一項元素值
... 
('s', 'appear at offset', 0)
('p', 'appear at offset', 1)
('a', 'appear at offset', 2)
('m', 'appear at offset', 3)

下面是一個易錯點

>>> L=[1,2,3,4,5]            #我們想使列表中每個元素都加1,方式一會失敗。
>>> for x in L:
... 	x +=1
... 
>>> L
[1, 2, 3, 4, 5]
>>> for i in range(len(L)):  #千萬別用形式in L,因爲你想當於對L遍歷,這個並不會造成死循環,但卻會有出界問題。
... 	L[i] +=1
... 
>>> L
[2, 3, 4, 5, 6]

Iter

是產生一個對象的迭代器,也就是說它裏面可以儲存訪問所指對象的狀態信息。例如對對象next()到那個位置了。

>>> F=map(iter,((1,2,3),(5,4),(6,7)))
>>> F
<map object at 0xb710550c>
>>> for i in F:
... 	print(i)
... 	print(next(i))
... 
<tuple_iterator object at 0xb710574c>    #每次next都會指向下一層,就現在而言是元組的開頭
1
<tuple_iterator object at 0xb710576c>
5
<tuple_iterator object at 0xb710574c>
6






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