【Python符号】python里的@符号含义(详解)
@作為修飾符
這是最難理解的一個含義。咱們看下面這個示例代碼:
def funB(funA):print("in funB")return "return from FunB()"@funB def funA():print("in FunA")return "return from FunA()"第一,@funB等價于funB(funA)
@funB這里的funB就是修飾函數,用來修飾輸入進來的函數,所以funB的參數是一個函數,也就是這里的funA。直接運行以上代碼,得到的輸出如下:
in funB也就是說,程序進入了funB函數。
第二,修飾函數返回的是修飾完的函數
重點啊!這是理解修飾符含義的核心!修飾函數返回的是修飾完的函數!!!
在 上面的例子,funB返回的是修改后的funA函數,也就是說,修改后funA = "return from FunB()"變成字符串了!!啥?你不信?運行下面代碼看看結果!
我們把@funB注釋掉,先看一下沒有修飾的情況下,funA是個什么東西。理論上輸出的是一個function對象。輸出:
<function funA at 0x0000016CB7AD0CA0>果然沒錯。
再看看加上修飾后的結果:
輸出的第一行in funB是之前所說進入funB函數內print的內容;第二行就是print(funA)的輸出結果,可見funA = "return from FunA()",是一個字符串,而不是函數對象。
那如果我們希望輸出的還是一個函數怎么辦?按照剛才的邏輯,只要修飾函數funB返回的還是一個函數即可。例如:
def funB(funA):print("in funB")return funA@funB def funA():print("in FunA")return "return from FunA()"print(funA)輸出結果為:
in funB <function funA at 0x0000019B3CCA0D30>第三,先修飾后調用
剛才那些例子中,程序都沒進入到funA函數中,如果我們要在修飾后正常調用進入funA怎么辦?舉個例子:
def funB(funA):print("in funB")return funA@funB def funA():print("in FunA")return "return from FunA()"funA()輸出結果為:
in funB in FunA可見它的邏輯是:先運行到@funB等價運行funB(funA),進入funB后打印in funB,返回的修飾后的函數還是funA,然后再運行到最后一行的funA()進入funA函數內打印in funA。總結來講就是先修飾后調用
若我們把最后一行的funA()改為print(funA()),那么funA函數返回的"return from FunA()"字符串也會被打印出來,輸出結果如下:
in funB in FunA return from FunA()@作為運算符
用于向量、矩陣乘法,等價于np.dot。直接看下面的例子:
import numpy as npnum1 = np.array([1,2,3]) num2 = np.array([[1,2,3]]) print(num1.shape) print(num2.shape) print('==============') print(num1 @ num1) print(num2 @ num2.T) print(num2.T @ num2) print('==============') print(np.dot(num1, num1)) print(np.dot(num2, num2.T)) print(np.dot(num2.T, num2))輸出結果:
(3,) (1, 3) ============== 14 [[14]] [[1 2 3][2 4 6][3 6 9]] ============== 14 [[14]] [[1 2 3][2 4 6][3 6 9]]自行體會~
總結
以上是生活随笔為你收集整理的【Python符号】python里的@符号含义(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 讲讲期货的那点事——主力、交割和主力换月
- 下一篇: python abs的功能_Python