天天看點

Python學習(14)--内置函數Python學習(14)--内置函數

         在Python中有很多的内置函數供我們調用,熟練的使用這些内置函數可以讓編寫代碼時事半功倍,所謂内置函數就是那些Python已經預定義并且已經實作的,可以供我們直接調用的函數,很多進階語言都有内置函數,比如java語言中的Math類中就提供了很多有關數學方面的函數供我們調用。

     下面我們來看一個求一個數絕對值的例子,代碼如下:

<b>[python]</b> view plain copy

def fun(x):

    if x&lt;0:

        return -x

    return x

print(fun(-10))

print(fun(10))

代碼很簡單,函數fun(x)接收一個實參,如果x&gt;0,直接傳回x;否則傳回x的相反數.代碼運作結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      Python作為一種資料處理能力超強的進階語言,以代碼簡潔可讀性強著稱。很重要的一個原因就是Python為我們提供了很多有關資料處理的内置函數,是以我們在用Python解決一個問題的時候,首先考慮的是Python是否把問題已經為我們解決了。當然,對于求一個數絕對值這件小事,Python已經為我們提供了内置函數.下面我就為大家介紹下Python中常用的内置函數。如下:

print(abs(-5))

print(abs(5))

l=[1,2,3,4,5,6,34,45,14]

print(max(l))

print(min(l))

以上代碼分别有abs(x),max(x),min(x)3個内置函數,abs(x)是Python為我們提供的求一個數絕對值的内置函數,相比較之前我們編寫的代碼,使用内置函數abs(x)隻需要一行代碼就能使問題迎刃而解。内置函數max(x)是求一個序列的最大值,内置函數min(x)則是求一個序列中值最小的元素。

      列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      再看以下2個内置函數:

print(len(l))

print(divmod(5,2))

列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      以上代碼有兩個函數,len(x)函數的功能是求一個序列的長度,divmod的列印結果為(2,1),這個結果是怎麼來的呢?其實Python中的很多内置函數,我們都知其名卻未必知其意,比如divmod(x,y),那麼如何擷取這個内置函數的功能呢?其實Python為我們提供了擷取内置函數資訊的指令,就是help指令。如下:

print(help(divmod))

Python學習(14)--内置函數Python學習(14)--内置函數

      倒數第三行,Return the tuple(x//y,x%y),告訴我們divmod(x,y)傳回的是一個元組,元組中有兩個元素,第一個元素是x//y,即x整除y,第二個元素是x%y,即x對y取餘;這就解釋了divmod(5,2)列印結果為什麼為(2,1),因為5//2=2,5%2=1。

      再介紹下以下2個數學計算中常用的内置函數,如下:

print(pow(2,3))

print(pow(2,3,4))

print(round(8/3,3))

         代碼列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      函數pow(x,y,z)傳回的結果為:(x的y次方)%z,如果參數調用函數時沒有參數z,則傳回結果為:x的y次方。

      round(x,y)是按照四舍五入的方式對浮點型資料x保留到小數點後y位,比如round(8/3,3),8/3=2.6666...,是一個無限循環小數,保留小數點後3位為2.667。這個函數适用于保留一個無限小數小數點後y位。

      callable(x)函數是檢查一個對象是否能夠被調用,代碼如下:

def f():

    pass

print(callable(f))

如上我們定義了一個函數f,并使用callable(x)函數判斷f是否能夠被調用,傳回值是一個布爾值.列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      因為函數f是可調用的,是以列印結果為true,若變量f不是一個函數對象,比如是一個整數,則不能被調用,傳回為false.如下:

f=100

Python學習(14)--内置函數Python學習(14)--内置函數

       當我們在Python中接收一個對象時,有的時候可能需要判斷對象的類型來決定我們對其相應的操作,擷取一個對象的類型可以使用函數type(x),x為未知類型對象。在Python又如何判斷一個對象的類型呢,下面舉一個不使用内置函數的例子:

lt=[1,2,3,4,5,6]

print(type(lt))

if type(lt)==type([]):

    print('is list')

如上所示,lt為一個清單,[]為一個空清單,兩者雖然元素不同,但對象類型都是一樣的,通過type(x)函數擷取對象類型進行比較,來判斷一個對象是不是清單類型.

       代碼列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

     其實Python已經為我們提供了内置函數來判斷一個對象的類型,内置函數為isinstance(x,y),x為待判斷類型的對象,y為Python中的資料類型,函數傳回的是布爾值,如下代碼:

print(isinstance(lt,list))

print(isinstance(lt,int))

代碼是使用内置函數isinstance(x,y),isinstance(lt,list)為判斷對象lt的是否是list類型,即清單類型,若是傳回true,若不是傳回false。isinstance(lt,int)為判斷對象lt是否為int類型,若是傳回true,否則傳回false。

Python學習(14)--内置函數Python學習(14)--内置函數

       在Python中還有很多類型轉換函數,即将一種類型的對象轉換成另一種類型的對象。如int(x),就是把x類型的對象轉換成整數類型,如下:

print(int('123'))

print(int('zhangsan'))

Python學習(14)--内置函數Python學習(14)--内置函數

       以上是将字元串'123'和'zhangsan'轉換成int類型,但這種轉換卻不一定能夠成功,如将‘123’可以轉換成整數123,但是‘zhangsan’卻不能轉換成整數,是以這種轉換是在一定條件下的轉換,被轉換對象必須具有一定的合理性。

      此外,我們還可以将對象轉換成其他各種類型,如tuple(x)将對象x轉換成元組,str(x)将對象x轉換成字元串等等。以如下代碼為例:

list=[1,2,3,4,5,6,7]

print(tuple(list))

print(type(str(123)))

代碼列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      如上tuple(list)将序列list轉換成元組,str(123)将整數123轉換成字元串'123',使用函數type(x)列印轉換後的對象類型如上為&lt;class 'str'&gt;。

2.有關字元串的内置函數  

      Python同樣為我們提供了許多有關字元串操作的内置函數,了解并掌握這些函數可以讓我們在今後的Python程式設計中遊刃有餘。下面我們一一介紹這些内置函數.

      (1)capitalize()函數

       capitalize()函數是Python為字元串對象提供的一個首字母變大寫的函數,需使用字元串對象來調用這個函數。代碼例子如下:

s='hello world'

print(s.capitalize())

列印結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

       (2)replace(old,new,count)函數

      函數replace(old,new,count)同樣也是Python為字元串對象提供的内置函數,調用者也必須是字元串對象,有3個參數old,new,和count,功能為将字元串對象的模式子串替換為新的字元串,old為模式子串,即被替換的子字元串,new為要替換的新字元串,count為需要被替換的old模式子串的數量,即會替換前count個old模式子串。如果count大于字元串對象中old模式子串的數量的話,那麼所有模式子串都将被替換。如果調用函數時,沒有為count提供實參,預設所有的old模式子串都被替換。代碼例子如下:

ss='123123123'

print(ss.replace('1','0'))

print(ss.replace('1','0',1))

print(ss.replace('1','0',2))

print(ss.replace('1','0',3))

print(ss.replace('1','0',4))

運作結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

        代碼中字元串對象'123123123',使用的old模式子串為'1',替換之後的新字元串為'0',count分别為1,2,3,4,如上count=1時隻替換了第1個模式子串'1'。

        (3)split(sep,maxsplite)函數

        函數split(seq,maxsplite)是把一個字元串對象分割成若幹個字元串對象的内置函數,其中seq表示分隔符,函數split(seq,maxsplite)就是根據分隔符seq分割字元串對象的,參數maxsplite是控制分割的次數,maxsplite=1會把一個字元串對象分割1次,分割成2個字元串對象,即此内置函數會把字元串對象分割成maxsplite+1個字元串對象,并把每個分割成的字元串對象封裝到清單中傳回,如果不指定參數maxsplite的值,預設情況下會把字元串對象分割成最多的字元串對象。代碼案例如下:

ss='192.168.12.13'

print(ss.split('.'))

print(ss.split('.',1))

print(ss.split('.',2))

print(ss.split('.',3))

代碼運作結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

      如上代碼所示,字元串對象為'192.168.12.13',分割符seq='.',不指定maxsplite的值的話預設有一個'.'就分割1次,直至把所有的'.'都周遊并分割完。maxsplite=1,則分割按照字元串對象從左至右的順序遇到的第一個'.'分割,将字元串對象分割成兩個字元串對象,并封裝到清單中傳回。同理,maxsplite=2或3,則從左至右把字元串對象分割2或3次。

      介紹完有關字元串操作的内置函數,下面我們來介紹幾個常用的有關序列操作的内置函數。

3.序列操作的内置函數

      (1)過濾函數filter(function,iterable)

       内置函數filter(function,iterable)的功能為把可疊代對象中不符合條件的資料元素過濾出去,把符合條件的元素封裝到一個集合内并傳回。它的資料來源是參數iterable,這是一個可疊代對象,什麼是可疊代對象呢?說白了就是一個可以被周遊的資料集合,可以是序列,字典或者字元串。function是一個傳回布爾值的函數,内置函數filter(function,iterable)會把iterable對象中的每一個元素取出來,作為判斷函數function的參數,通過function的判斷,如果該元素符合條件則傳回true保留此元素,否則把此元素過濾出去。看如下代碼:

def f(x):

    if x&gt;5:

        return True

li=[0,1,2,3,4,5,6,7,8,9,10]

fil=filter(f,li)

print(li)

代碼為把清單中所有&lt;=5的元素過濾出去,代碼運作結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

       通過代碼發現,似乎并沒有把序列li中&lt;=5元素過濾掉,其實不然。因為filter(function,iterable)對元素的過濾并不是在原有iterable對象上做出修改,它實質上是把符合條件的元素放到一個filter對象中,不符合條件的元素則不被放入.而filter(function,iterable)傳回的其實就是這個filter對象。如上的fil就是傳回的filter對象,所有符合條件的元素都在這個集合中。如果要想擷取符合條件的元素,隻需要周遊這個filter對象就可以了。方法有兩種,代碼如下:

       方法一:

print(list(fil))

     方法一是list(fil),是把疊代器對象轉換成一個清單,就像我們之前介紹的每一種資料類型都有類型轉換函數,比如int(x)把x轉換成整數類型,這裡同樣用到的是類型轉換。代碼運作結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

       方法二:

for i in fil.__iter__():

    print(i)

    方法二使用filter對象的__iter__()方法傳回一個疊代器iterator對象,

這個對象是可周遊的,通過for循環可以把其中的每個元素取出來.代碼運作結果如下:    

Python學習(14)--内置函數Python學習(14)--内置函數

        (2)zip(iter1,iter2,iter3,...)函數

       zip(iter1,iter2,iter3,...)函數的參數是一個個的可序列化對象,而它的功能就是把一個個可序列化對象中的每個元素按次序取出并組成一條記錄的形式放到元組裡作為傳回清單的一個元素,直至把可序列化對象中的所有元素都取出。這麼說有點抽象,代碼例子如下:

name=['zhangsan','lisi','wangwu']

age=[20,30,40]

tel=['123','456','789']

print(list(zip(name,age,tel)))

Python學習(14)--内置函數Python學習(14)--内置函數

         如上所示,分别有3個序列依次是name,age和tel, zip(name,age,tel)會把每一個序列的元素按照順序依次取出,如name[0],age[0],tel[0]組成一個元組('zhangsan',20,'123'),最後傳回的是一個zip對象,擷取zip對象中的元素可以把它轉換成清單list,也可以通過for循環通路每個元素,代碼如下:

for x in zip(name,age,tel):

    print(x)

Python學習(14)--内置函數Python學習(14)--内置函數

      需要注意的是如果zip(iter1,iter2,iter3,...)的每個可序列化對象中元素個數不一緻,内置函數zip(iter1,iter2,iter3,...)會在最短的可序列化被周遊完之後就不在周遊其他可序列化對象,比如上面的例子如果清單name隻有兩個元素,代碼如下:

name=['zhangsan','lisi']

Python學習(14)--内置函數Python學習(14)--内置函數

      如上所示,清單name隻有'zhangsan','lisi'兩個元素,當周遊完他們之後就函數就結束了,因為name在三個清單中元素是最少的.

        (3)map(function,iter1,iter2,iter3,...)函數

map函數與zip函數其實差不多,隻是map函數比zip函數更加靈活,功能更加強大,zip函數可以實作的,map函數也可以實作。

       map(function,iter1,iter2,iter3,...),第一個參數為一個函數,後面的參數都是可疊代對象,map會把可疊代對象的每一個元素依次取出來作為function對象的實參,取元素的過程和zip函數是一樣的。代碼如下:

def fun(x,y):

    return x*y

lis=[1,2,3]

lis2=[4,5,6]

print(list(map(fun,lis,lis2)))

      代碼功能為把清單lis和lis2中的元素依次取出來做乘積,如1和4作為fun(x,y)的實參,傳回1*4;代碼運作結果如下:

Python學習(14)--内置函數Python學習(14)--内置函數

       在map函數取元素的過程中,也會遇到可疊代對象元素個數不一緻的情況,其處理方法與zip函數是一緻的.代碼例子如下:

lis=[1,2]

Python學習(14)--内置函數Python學習(14)--内置函數

      如上所示,清單lis比清單lis2少一個元素,在取完lis中的元素後map函數就結束了,其處理疊代對象長度不一緻的情況所用方法與zip函數是一樣的.

      不知不覺寫了好多,其實想把内置函數當做兩節來寫的,但是寫着寫着就忘了.

      下一節我們來學習Python中的包和子產品,敬請期待.