最贊回答 / 慕粉1149065707
你這兩種代碼,咋一看沒區別,其實有區別的啊,本質上的區別就是:左邊的是最后調用的時候,是調用fn(x),fn(x)函數封裝了變化,實際上print('call')與原來的f1函數是作為一個整體封裝咋fn(x)里面,print是在f1函數上的拓展。而右邊,不能看成是拓展,你只能看成是在原f2函數的邏輯之前,在加了一個print('call')打印的邏輯。如果還是有點懵逼,我只能舉個粒子了:你試試左邊再多調用幾次print(f1(6))print(f1(7))這當然是正常的,但是右邊很容易出問題,如果你是這樣...
2018-11-03
已采納回答 / 慕UI8134040
兩端代碼其實是一樣的。因為你在定義第二個函數def f(j=i)的時候引用了另外一個變量j,此時數組中的引用變量指向的也不是i,而是j所指向的內容。但是這里又因為外面套了一個for循環,所以,可以看做循環一次,調用一個變量j。如果你理解堆和棧,那就更容易理解了??傊?,你可以理解成你的這個代碼是答案的簡寫版。
2018-11-01
已采納回答 / coolandcold
通俗地講:比如a=8; 意為變量a指向整型8對于某個函數來說,比如g(),那么函數的名字g也就是變量g表示指向了g()這個函數,和a指向8一個道理;最外層函數f返回變量g,由于g表示指向g(),所以也相當于返回了函數g()本身
2018-10-25
已采納回答 / wow蝸牛
所謂裝飾器,你可以理解為:在保持原函數factorial(n)內部程序不變的基礎上,給他增加一行代碼?print ('call '+ f.__name__ + '()...'),得到一個新函數,而現在我們又把這個新函數也命名為factorial(n)。于是我們可以看作是factorial()的功能增強了(原函數只能計算階乘,新函數不僅可以計算階乘還能打印出函數名稱),也就是可以看成是原函數factorial(n)被裝飾了一下,加了一行輸出代碼,所以叫做裝飾器。大家在學這個裝飾器的時可以先忽略掉@Log這個...
2018-10-24
已采納回答 / JefferyZ
如果子類和父類不在同一個文件里面,你可以把父類封裝成模塊,然后引入子類中繼承。不存在無法繼承的問題。甚至在不同的包里面也可以繼承,只要你的文件路徑對。
2018-10-14