在 Pandas 中,該apply()
方法將函式作為輸入。
該方法的檔案建議您可以將另一個函式像sum()
or傳遞給像ornumpy.sqrt()
的函式 。apply(sum)
apply(numpy.sqrt)
如何撰寫一個接受另一個函式作為其輸入之一的函式?
uj5u.com熱心網友回復:
僅憑我對python語法的理解,我不確定您如何撰寫[接受另一個函式作為引數的函式]?
就像你寫它來接受其他任何東西一樣。Python 的def
陳述句不需要任何型別說明:
def example(parameter):
pass
你可以傳遞任何物件;函式是物件;因此,您可以傳遞函式:
def argument():
print("This message won't be printed this time, but keep reading")
example(argument)
為了可以將函式作為引數傳遞,您什么都不做。
這同樣適用于方法和普通函式:
class Example:
def method(self, parameter):
pass
Example().method(argument)
“但是我如何在函式內部使用它呢?”
除非您正在做一些非常不尋常的事情(在這個問題之外的研究級別上),否則與函式有關的唯一真正有趣的事情 - 除了像這樣傳遞它 - 就是呼叫它。
您通過獲取函式來呼叫函式,然后在其后撰寫函式呼叫語法(括號之間的引數串列)。函式是物件;您通過評估運算式來獲取物件;因此,您可以通過評估運算式來獲得函式(只要它確實評估為函式)。
通常,該運算式是...函式的名稱,在全域命名空間中查找(如上例所示)。但就像任何其他物件的情況一樣,您可以通過其他方式進行操作。
特別是,您可以為該值指定其他名稱 - 例如,通過將其作為引數傳遞。這就是呼叫函式時發生的情況:函式使用其引數名稱作為作為引數傳遞的任何內容的名稱。
包括如果那是另一個功能。
然后,在被呼叫函式內部,通過命名傳遞的函式(使用引數名稱)然后使用正常的函式呼叫語法來呼叫傳遞的函式。
def example(parameter):
parameter()
現在列印了(誤導性的)訊息。
更復雜的運算式是可能的。一種常見的模式是在字典中查找它們(盡管 3.10 的match... case
構造使這稍微不那么有用)。另一種方法是動態編譯代碼(有很多方法,它們都至少有點危險,所以我不會在這里命名或展示它們。有合法用途的人也有這樣做的技能必要的研究。)
uj5u.com熱心網友回復:
接受其他函式作為引數或回傳函式的函式稱為高階函式。
所以 Panda'sapply()
是一個高階函式。它接受另一個函式,如 egsum
并在內部呼叫或呼叫它作為sum(args)
.
要定義接受函式作為引數的高階函式,請使用簽名,就像普通函式一樣。
在下面的示例中,這將是def md_heading(phrase):
.
如何呼叫功能引數(不帶引數)
查看如何呼叫預期為函式的引數:
def md_heading(phrase):
return "# " phrase()
筆記:
- 該引數在這里被命名為變數名 - 而不是像 Panda 的
apply(func)
. - 這個引數仍然
phrase
應該是一個函式參考,因為它將使用括號(不帶引數)呼叫。 md_heading()
是包裝函式,phrase
函式引數。
傳遞文字
現在嘗試將像 `'Hello World' 這樣的字串文字作為引數傳遞時會發生什么。
result = md_heading('Hello World') # this would pass it in, then try to call it .. and ?
print(result)
作為引數傳遞的字串的呼叫將引發錯誤。正是在該宣告return "# " phrase()
中:
TypeError: 'str' object is not callable
將函式(參考)作為引數傳遞
現在您應該將函式作為引數傳遞,但只是作為參考(不帶括號):
def greeting():
return 'Hi'
result = md_heading(greeting)
print(result)
印刷:Hi
將 lambda 作為引數傳遞
或者你可以傳遞一個 lambda 作為引數:
result = md_heading(lambda: "Hello!")
print(result)
印刷:'Hello!
注意: lambda 不能有位置引數。這接近于傳遞一個常量,就像從頭開始的字串一樣。
傳遞 lambda 時沒有(必需)引數
當我們像lambda name: "Hello " name
這里這樣使用位置引數定義 lambda 時,它會引發:TypeError: <lambda>() missing 1 required positional argument: 'name'
因為在我們的高階函式中,它是在沒有引數的情況下呼叫的,就像phrase()
.
uj5u.com熱心網友回復:
發生了什么,因為您在 function apply only link in memory for function sum。在您的應用函式中,將呼叫此鏈接。
def apply(some_func):
result = some_func(28, 79)
return result
此函式回傳總和 28 和 79 (107)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/479698.html
下一篇:重新排序串列中的字典