1.python可以為函式指定別名,import math; y = math.sqrt; callable(y): true #判斷是否可呼叫,即是否是函式
2.函式與條件語句以及迴圈語句一樣,也是通過縮進來識別,不同的是,由於函式用於重複呼叫,所以需要為其指定乙個別名,乙個標號:
def hello(name): #冒號不可忽略
print 'hello, '+name+'!'
return true #可忽略,函式頭不需要新增標示指定是否需要返回值
>>>hello("joy")
hello, joy!
3.有時為了給定義的函式寫一段注釋用以說明函式的作用,在c++中是直接在函式前方以注釋方式給出,而python則是通過新增說明文件的方式給出,說明語句一般以字串形式給出,直接放置在def語句下面(類定義也是如此),當呼叫時,只需使用hello.__doc__(注意,是雙下滑線)即可得到說明語句,也可用help(example)方式得到:
def example():
'this is an example, indentation as well'
return none
5.當函式中傳遞的引數數目過多時,可以通過只提供乙個引數名字,並在此引數前加上*,如此即可將所有輸入的引數統一到乙個元組中:
def print_par(*param):
print param
>>>print_par("name")
('name',)
>>>print_par(1,2,3)
(1,2,3)
不過,此方法在輸入引數中包含關鍵字(或者說變數名並賦予預設值),會報錯
>>>print_par("name",test=42) #報錯
另外,也可在引數前加兩個*,表示輸入的一系列關鍵字,當輸出時,會以字典的形式輸出,不過正如*param只能覆蓋非關鍵字一樣,**param也只能覆蓋關鍵字引數,所以如果乙個函式的輸入同時包含兩類引數時,須分開新增兩個引數,並確保順序。
最後,將若干引數輸入到乙個只給了乙個加*引數的函式中,這些引數均會轉換為乙個元組的相應元素,反之,如果將乙個元組實參通過加*方式輸入到具有若干形參的函式中,也可以將此元組解開分配到相應的形參上,相當於上述過程的逆過程,不過要保證引數數目的匹配。
6.python的內建函式vars()可以將當前所有變數與值組成的字典返回:
>>>x=1
>>>scope=vars()
>>>scope['x]
1不過,雖然可以修改,但是一般來說,避免出現不可知錯誤,vars返回的字典是不能修改的
7.函式會新開乙個作用域,自動遮蔽掉全域性作用域,當需要在區域性作用域中訪問全域性作用域中元素時,需要顯示指定此元素為全域性變數global x;#如此,當使用x時將自動從全域性變數中搜尋
8.類的建立:#表明此類有乙個成員,名為name,self是保留關鍵字,用以指明此函式時成員函式
class person():
def setname(self,name):
self.name = name #表明此類有乙個成員,名為name,self是保留關鍵字,用以指明此函式時成員函式
def getname(self):
return self.name
#def test():
#print "good" #如此定義會返回異常,成員函式必須要包含self變數
>>>foo = person()
>>>foo.setname("john")
>>>foo.getname()
"john"
此類中雖沒有顯式定義成員變數,但實際上已經暗含了乙個成員變數name,而實際上,在python中,也可以像c++一樣,顯式定義成員變數並可以賦予初值(此處不同於c++,c++除了靜態整型變數外不允許在類內初始化,而python則必須初始化,否則會報錯,就相當於在編譯器中直接輸入乙個從未使用過的標示一般,會報錯未定義),而類內變數的作用由於python的引用計數機制,實際上的作用相當於c++的靜態成員變數,另外,python中與c++不同的是,python在傳遞函式指標時,不需要新增括號:
>>>setn = foo.setname
>>>getn = foo.getname
>>>setn("john")
>>>getn
"john"
結果跟上面一種方法完全相同
9.python中也可以定義私有方法,只需要方法前加雙下劃線,即可,如此,方法將不能從類外訪問,而對於類內的訪問則無所阻礙,但實際上python對於此類方法的處理是將之翻譯成方法名(不包括雙下劃線)前面加上_secretive_,所以實際上可以通過修改**為此類方法名即可正常訪問,但是實際上不提倡這種訪問方式。
10.python中的類定義實際上是在執行**塊,如果在類定義中新增一句print語句,將會在類定義結束時,完成此語句
11.python中的類繼承定義方式如下:
class deprive(base1,base2): #多個基類用逗號隔開,如此實現多重繼承
def combine(self):
self.name = base1.name + base2.name
>> 多重繼承中,如果出現不同基類的同名方法衝突,則按照繼承順序定義優先順序
>> 在繼承中,如果基類定義了__init__(self,...)初始化方法,則在子類中必須顯示呼叫進行初始化(因為不能預設進行初始化)
>> 在呼叫方法時,會首先從子類中進行查詢,之後按照繼承順序依次從基類中查詢
>> 詳細可以參見
python學習筆記之五 抽象
本文會介紹如何將語句組織成函式,還會詳細介紹引數和作用域的概念,以及遞迴的概念及其在程式中的用途。一.建立函式 函式是可以呼叫,它執行某種行為並且返回乙個值。用def語句即可定義乙個函式 並非所有的函式都會返回一些東西 def fibs num result 0,1 for i in range n...
Python學習筆記 抽象
物件導向 物件 例項 由資料及其能對其實施的操作所構成的封裝體。類 描述了物件的特徵 資料和操作 類的定義 class classname object define classname class class suite 類的方法 class dog object def greet self p...
python之更加抽象 2014 4 6
更加抽象 12 50pm 14 50 p112 1.物件的魔力 多型 如count 在多種資料型別中都可以實現計數的功能 封裝 對全域性作用域中其他區域隱藏多餘資訊的原則 繼承2.類和型別 建立類class person def setname self,name self.name name de...