【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()"变成字符串了!!啥?你不信?运行下面代码看看结果!

def funB(funA):
    print("in funB")
    return "return from FunB()"

# @funB
def funA():
    print("in FunA")
    return "return from FunA()"

print(funA)

我们把@funB注释掉,先看一下没有修饰的情况下,funA是个什么东西。理论上输出的是一个function对象。输出:

<function funA at 0x0000016CB7AD0CA0>

果然没错。
再看看加上修饰后的结果:

in funB
return from FunB()

输出的第一行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 np

num1 = 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]]

自行体会~

  • 11
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值