python中特殊函數 python函數中的函數

Python中幾個特殊的函數

1、 定義一個特殊的 __slots__ 變量,來限制該class實例能添加的屬性

創(chuàng)新互聯建站是一家專注于成都網站建設、成都網站設計與策劃設計,博興網站建設哪家好?創(chuàng)新互聯建站做網站,專注于網站建設10年,網設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:博興等地區(qū)。博興做網站價格咨詢:13518219792

2、 內置的 @property(關鍵字) 裝飾器就是負責把一個方法變成屬性調用的。@property.setter(這里的property是類里面的屬性名)負責把一個setter方法變成屬性賦值。

3、 __str__(),__repr__(),__iter__(),__next__(),__getitem__(),__setitem__(),__delitem__(),__getattr__(),__call__()

Python如何調用特殊函數

__call__

在Python中,函數其實是一個對象:

f = abs

f.__name__

'abs'

f(-123)

由于 f 可以被調用,所以,f 被稱為可調用對象。

所有的函數都是可調用對象。

一個類實例也可以變成一個可調用對象,只需要實現一個特殊方法__call__()。

我們把 Person 類變成一個可調用對象:

class Person(object):

def __init__(self, name, gender):

self.name = name

self.gender = gender

def __call__(self, friend):

print 'My name is %s...' % self.name

print 'My friend is %s...' % friend

現在可以對 Person 實例直接調用:

p = Person('Bob', 'male')

p('Tim')

My name is Bob...

My friend is Tim...

單看 p('Tim') 你無法確定 p 是一個函數還是一個類實例,所以,在Python中,函數也是對象,對象和函數的區(qū)別并不顯著。

任務

改進一下前面定義的斐波那契數列:

class Fib(object):

???

請加一個__call__方法,讓調用更簡單:

f = Fib()

print f(10)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

詳解Python中的__new__、__init__、__call__三個特殊方法

__new__: 對象的創(chuàng)建,是一個靜態(tài)方法,第一個參數是cls。(想想也是,不可能是self,對象還沒創(chuàng)建,哪來的self)

__init__ : 對象的初始化, 是一個實例方法,第一個參數是self。

__call__ : 對象可call,注意不是類,是對象。

先有創(chuàng)建,才有初始化。即先__new__,而后__init__。

上面說的不好理解,看例子。

1.對于__new__

可以看到,輸出來是一個Bar對象。

__new__方法在類定義中不是必須寫的,如果沒定義,默認會調用object.__new__去創(chuàng)建一個對象。如果定義了,就是override,可以custom創(chuàng)建對象的行為。

聰明的讀者可能想到,既然__new__可以custom對象的創(chuàng)建,那我在這里做一下手腳,每次創(chuàng)建對象都返回同一個,那不就是單例模式了嗎?沒錯,就是這樣。可以觀摩《飄逸的python - 單例模式亂彈》

定義單例模式時,因為自定義的__new__重載了父類的__new__,所以要自己顯式調用父類的__new__,即object.__new__(cls, *args, **kwargs),或者用super()。,不然就不是extend原來的實例了,而是替換原來的實例。

2.對于__init__

使用Python寫過面向對象的代碼的同學,可能對 __init__ 方法已經非常熟悉了,__init__ 方法通常用在初始化一個類實例的時候。例如:

這樣便是__init__最普通的用法了。但__init__其實不是實例化一個類的時候第一個被調用 的方法。當使用 Persion(name, age) 這樣的表達式來實例化一個類時,最先被調用的方法 其實是 __new__ 方法。

3.對于__call__

對象通過提供__call__(slef, [,*args [,**kwargs]])方法可以模擬函數的行為,如果一個對象x提供了該方法,就可以像函數一樣使用它,也就是說x(arg1, arg2...) 等同于調用x.__call__(self, arg1, arg2) 。模擬函數的對象可以用于創(chuàng)建防函數(functor) 或代理(proxy).

總結,在Python中,類的行為就是這樣,__new__、__init__、__call__等方法不是必須寫的,會默認調用,如果自己定義了,就是override,可以custom。既然override了,通常也會顯式調用進行補償以達到extend的目的。

這也是為什么會出現"明明定義def _init__(self, *args, **kwargs),對象怎么不進行初始化"這種看起來詭異的行為。(注,這里_init__少寫了個下劃線,因為__init__不是必須寫的,所以這里不會報錯,而是當做一個新的方法_init__)

python函數高級

一、函數的定義

函數是指將一組語句的集合通過一個名字(函數名)封裝起來,想要執(zhí)行這個函數,只需要調用函數名即可

特性:

減少重復代碼

使程序變得可擴展

使程序變得易維護

二、函數的參數

2.1、形參和實參數

形參,調用時才會存在的值

實慘,實際存在的值

2.2、默認參數

定義:當不輸入參數值會有一個默認的值,默認參數要放到最后

2.3、 關鍵參數

定義: 正常情況下,給函數傳參數要安裝順序,不想按順序可以用關鍵參數,只需要指定參數名即可,(指定了參數名的就叫關鍵參數),但是要求是關鍵參數必須放在位置參數(以位置順序確定對應的參數)之后

2.4、非固定參數

定義: 如你的函數在傳入參數時不確定需要傳入多少個參數,就可以使用非固定參數

# 通過元組形式傳遞

# 通過列表形式傳遞

# 字典形式(通過k,value的方式傳遞)

# 通過變量的方式傳遞

三、函數的返回值

作用:

返回函數執(zhí)行結果,如果沒有設置,默認返回None

終止函數運行,函數遇到return終止函數

四、變量的作用域

全局變量和局部變量

在函數中定義的變量叫局部變量,在程序中一開始定義的變量叫全局變量

全局變量作用域整個程序,局部變量作用域是定義該變量的函數

當全局變量與局部變量同名是,在定義局部變量的函數內,局部變量起作用,其他地方全局變量起作用

同級的局部變量不能互相調用

想要函數里邊的變量設置成全局變量,可用global進行設置

五、特殊函數

5.1、嵌套函數

定義: 嵌套函數顧名思義就是在函數里邊再嵌套一層函數

提示 在嵌套函數里邊調用變量是從里往外依次調用,意思就是如果需要調用的變量在當前層沒有就會去外層去調用,依次內推

匿名函數

基于Lambda定義的函數格式為: lambda 參數:函數體

參數,支持任意參數。

匿名函數適用于簡單的業(yè)務處理,可以快速并簡單的創(chuàng)建函數。

# 與三元運算結合

5.3、高階函數

定義:變量可以指向函數,函數的參數可以接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數稱之為高階函數 只需要滿足一下任意一個條件,即是高階函數

接收一個或多個函數作為輸入

return返回另一個函數

5.4、遞歸函數

定義:一個函數可以調用其他函數,如果一個函數調用自己本身,這個函數就稱為遞歸函數

在默認情況下Python最多能遞歸1000次,(這樣設計師是為了防止被內存被撐死)可以通過sys.setrecursionlimit(1500)進行修改

遞歸實現過程是先一層一層的進,然后在一層一層的出來

必須有一個明確的條件結束,要不然就是一個死循環(huán)了

每次進入更深層次,問題規(guī)模都應該有所減少

遞歸執(zhí)行效率不高,遞歸層次過多會導致站溢出

# 計算4的階乘 4x3x2x1

# 打印數字從1-100

5.5、閉包現象

定義:內層函數調用外層函數的變量,并且內存函數被返回到外邊去了

閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優(yōu)先使用自己外層包裹的作用域

Python魔法函數(特殊函數)

Python中如何實現運算符的重載,即實現例如a+b這樣的運算符操作呢?

在C++中可以使用 operator 關鍵字實現運算符的重載。但是在Python中沒有類似這樣的關鍵字,所以要實現運算符的重載,就要用到Python的魔法函數。Python魔法函數是以雙下劃線開頭,雙下劃線結尾的一組函數。我們在類定義中最常用到的 __init__ 函數就是這樣一個魔法函數,它在創(chuàng)建類對象時被自動調用。

下面我們來看個簡單的例子。

上述代碼示例了幾個魔法函數的用法。 __add__ 函數對應了二元運算符+,當執(zhí)行a+b語句時,python就會自動調用a. add (b)。 對于上述例子中的v1+v2+v3,則相當于調用了(v1. add(v2)). add(v3)。

代碼中還有一個在Python類定義經常使用的 __str__ 函數,當使用 str() 時會被調用。print函數對傳入的參數都調用了str()將其轉換成易讀的字符串形式,便于打印輸出,因而會調用類定義的__str__函數打出自定義的字符串。

代碼中還有一個特殊的 __call__ 函數,該函數在將對象采用函數調用方式使用時被調用, 例如v1()相當于v1. call ()。

以上就是魔法函數的基本使用方法。常見的魔法函數我們可以使用 dir() 函數來查看。

輸出結果為:

上述結果中形式為‘__函數名__’的函數為魔法函數,注意有些對象也是這種形式,例如__class__, __module__等, 這些不是魔法函數。具體的魔法函數說明可以參考Python官方說明文檔。

以上代碼在Python3.6運行通過.

標題名稱:python中特殊函數 python函數中的函數
文章出自:http://muchs.cn/article12/docoggc.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站策劃、關鍵詞優(yōu)化、搜索引擎優(yōu)化、品牌網站制作、建站公司、網頁設計公司

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都定制網站建設