python函數調用的四種方式 --基礎重點


第一種:參數按順序從第一個參數往后排#標准調用

# -*- coding: UTF-8 -*- 
def normal_invoke(x, y): print "--normal_invoke:--"  
    print "x is %d" %x print "y is %d" %y 
#標准調用  
normal_invoke(1, 2)  

運行結果:

--normal_invoke:-- x is 1 y is 2  

 

第二種:#關鍵字調用  

def keyword_invoke(x, y): print "--keyword_invoke--:"  
    print "x is %d" % x print "y is %d" % y 

#關鍵字調用  
keyword_invoke(y=1, x=2) 
注意:關鍵調用從哪開始的,從哪以后都必須使用關鍵字調用除了‘*’收集參數。不能寫成這樣的:keyword_invoke(y=1, 2),這樣就會報錯。

運行結果:

--keyword_invoke--: x is 2 y is 1

 

第三種:#非關鍵字可變長參數(tuple) def normal_tuple_invoke(x, y=2, *values):  

print "--normal_tuple_invoke--"  
    print "x is %d" % x print "y is %d" % y for value in values: print "tuple's value has", value

#非關鍵字可變長參數(tuple)  

 normal_tuple_invoke(1, 3, 'xyz', 123.4) 

注意:收集參數  ‘*’當你參數不確定有多少是你可是使用它,他會把不確定的部分存在values元組中,當然這個元組名字要看‘*’后面跟的是啥了。

運行結果:

--normal_tuple_invoke-- x is 1 y is 3 tuple's value has xyz 
tuple's value has 123.4 

第四種:#關鍵字可變長參數(dict) 

def keyword_dict_invoke(x, y=2, **value_dict): print "--keyword_dict_invoke--"  
    print "x is %d" % x print "y is %d" % y for key in value_dict: print "key is ", key print "value is ", value_dict[key] 

#關鍵字可變長參數(dict)  

 keyword_dict_invoke(y=1, x=2, arg2='def', arg1='put at the last') 

注意:**value_dict 傳回來的參數以字典:key-value的形式存放,單招順序首先傳回來的是:key,其次是:value。

運行結果:

--keyword_dict_invoke-- x is 2 y is 1 key is arg1 value is put at the last key is arg2 value is  def Process finished with exit code 0 

第五中:還有一種是以整個函數為參數傳回來,目前我知道是裝飾器在使用

裝飾器實際上就是為了給某程序增添功能,但該程序已經上線或已經被使用,那么就不能大批量的修改源代碼,這樣是不科學的也是不現實的,因為就產生了裝飾器,使得其滿足:

  1. 不能修改被裝飾的函數的源代碼
  2. 不能修改被裝飾的函數的調用方式
  3. 滿足1、2的情況下給程序增添功能

那么根據需求,同時滿足了這三點原則,這才是我們的目的。因為,下面我們從解決這三點原則入手來理解裝飾器。

等等,我要在需求之前先說裝飾器的原則組成:

< 函數+實參高階函數+返回值高階函數+嵌套函數+語法糖 = 裝飾器 >

這個式子是貫穿裝飾器的靈魂所在!

improt time def test(): time.sleep(2) print("test is running!") def deco(func): start = time.time() func() #2
    stop = time.time() print(stop-start) deco(test) #1

我們來看一下這段代碼,在#1處,我們把test當作實參傳遞給形參func,即func=test。注意,這里傳遞的是地址,也就是此時func也指向了之前test所定義的那個函數體,可以說在deco()內部,func就是test。在#2處,把函數名后面加上括號,就是對函數的調用(執行它)。因此,這段代碼運行結果是:

test is running! the run time is 3.0009405612945557

關於裝飾器我在另一篇文章中有詳細解釋!

 

 

---每天進步一點點!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM