python order函式 Python函式之二

2021-10-13 08:37:32 字數 2987 閱讀 8130

關鍵字引數(**kwargs)

def foo(**kw):

if 'y' in kw:

print(kw['y'])

foo(x=123,y='1232')

如上面的示例關鍵字引數用於函式呼叫,通過「鍵-值」形式加以指定。這種方式可以根據傳入的引數來決定函式的執行方向。可以讓函式更加清晰、容易使用,同時也清除了引數的順序需求,及時傳入了多個與函式無關的引數同樣也不影響函式的執行,只有和函式相關的引數才會被使用,不相關的不影響函式執行。

示例:def say_hello(**kwargs):

if 'name' in kwargs:

print('您好,%s' % kwargs['name'])

if 'age' in kwargs:

age = kwargs['age']

if age <= 16:

print('你還是乙個小屁孩!')

else:

print('你是乙個成年人')

if 'name' not in kwargs and 'age' not in kwargs:

print('請提供個人資訊')

dict1 =

say_hello(**dict1)

您好,王大錘

你還是乙個小屁孩!

說明:在向函式傳入可變引數的時候,這些可變引數在函式呼叫時自動組裝為乙個tuple,而在向函式傳入關鍵字引數的時候這些關鍵字引數在函式內部自動組裝為乙個dict。所以上面的例子中向函式傳入的便是乙個字典,程式同樣能夠正常執行。

命名關鍵字引數

寫了這麼久的程式,相信大家一定遇到過這種情況,就是在使用某個函式的時候,給函式指定引數的時候必須得寫成"agrs=..."的形式才能將引數傳進去,而有些引數不需要這麼寫,比如下面這個例子:

def person(name, age, *, city, job):

print(name, age, city, job)

x = person('zhang',18,city='chengdu',job=none)

如上面的例子,當我們需要限制使用者輸入引數名的時候我們就需要用到命名關鍵字引數了,上面的例子就表示只接受引數名為city和job的關鍵字引數。定義命名關鍵字引數和關鍵字引數(kw)不同,命名關鍵字引數的定義需要乙個特殊分隔符,之後的所有引數被視為命名關鍵字引數,在傳參時必須跟上引數名,如果沒有引數名,除錯的時候就會報錯。命名關鍵字引數也支援預設引數。

注意:定義不定長引數的時候使用的是args,定義關鍵字引數的時候使用的是kwargs,而定義命名關鍵字引數的時候是在定義函式的時候在引數中插入分隔符,*之後的引數被視作是關鍵字引數。

高階函式(higher-order function)

高階函式,聽名字都覺得好高大上,好難懂的樣子。那麼事實是不是這樣呢?對於我們這種初學者小白來說確實是挺難的,但是知道它的原理後其實也不是太難理解,具體怎麼回事呢?且看我一步一步的分析:

以python內建的求絕對值的函式為例:

print(abs(-10))

print(abs)

print(id(abs))

由此可見abs(-10)是函式呼叫,而abs是函式本身,它的id是2067312,如果某個變數的id和abs的id一樣會怎麼樣呢?

foo = abs

print(foo)

print(abs)

print('foo的id:', id(foo))

print('abs的id:', id(abs))

print(foo(-10))

print(abs(-10))

foo的id: 2067312

abs的id: 2067312

呼叫函式abs()函式和呼叫變數foo()得到結果是相同的,而且foo和abs的id是相同的。既是說明變數foo已經指向了abs函式本身,也說明了函式本身是可以賦值給變數的,同時這裡的示例再次向我們證實了python中變數賦值是位址賦值。

a = 10

print(abs(-5))

print(id(abs))

print(id(a))

abs = a

print(id(abs))

print(id(a))

print(abs(-5))

如上**,將a的值賦值給abs後abs儲存的就是a的位址,後兩個輸出的id是同乙個id,而且最後一行還會報錯,因為在最後這裡abs存的是a的值,就調不到絕對值函式了,因此在最後就會報錯。通過這裡也就說明了我們完全可以把函式名看作是乙個變數,只是這個變數比較特殊,在一開始就指向了乙個函式可以呼叫。

注意:在實際**中我們絕對不能像上面這麼寫,這裡是為了說明函式名也是變數。恢復abs函式,重啟python互動環境即可。由於abs函式實際上是定義在import builtins模組中的,所以要讓修改abs變數的指向在其它模組也生效,要用import builtins; builtins.abs = 10。

既然變數可以指向函式,函式的引數也能接收變數,那麼乙個函式就可以接收另乙個函式作為引數,這種函式就稱之為高階函式。

這裡就以計算乙個列表中所有元素之和和所有元素之積做乙個示例:

def calc(my_list, op):

total = my_list[0]

for i in my_list[1:]:

total = op(total, i)

return total

def add(x, y):

return x + y

def mul(x, y):

return x * y

list1 = [1, 2, 3, 5, 8, 9, 10, 15, 18, 19, 26]

sum1 = calc(list1, add)

mul1 = calc(list1, mul)

print('list1中所有項的和為:', sum1)

print('list1中所有項的乘積為:', mul1)

list1中所有項的和為: 116

list1中所有項的乘積為: 2881008000

py 定義函式

在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。我們以自定義乙個求絕對值的my abs函式為例 請注意,函式體內部的語句在執行時,一旦執行到return時,函式就執行完畢,並將結果返回。因此,函...

py相關函式問題

合理地拼接乙個或多個路徑部分。返回值是 path 和 paths 所有值的連線,每個非空部分後面都緊跟乙個目錄分隔符 os.sep 除了最後一部分。這意味著如果最後一部分為空,則結果將以分隔符結尾。如果引數中某個部分是絕對路徑,則絕對路徑前的路徑都將被丟棄,並從絕對路徑部分開始連線。在 window...

py函式式程式設計

函式式程式設計把計算視為函式而非指令,純函式式程式設計不需要變數,沒有 測試簡單,python支援的函式式程式設計不是純函式式程式設計,允許有變數存在,支援高階函式,支援閉包,有限度的支援匿名函式 變數可以指向函式,而函式又可以把變數作為引數,所以高階函式就是把函式作為引數的函式。def add x...