python中@是什么意思

通常我们所见的@符号是用于邮箱中,而在python中@符号也有着重要的作用:一个是表示修饰符,另一个则是表示矩阵乘法(不常用)。表示修饰符时,可以在模块或者类的定义层内对函数进行修饰。虽然表示矩阵乘法不常用,但是也是很好的一个方法。值得注意的是@符号的这两种含义,都是在python3.5以后的。

一、表示修饰符

用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰;

出现在函数定义的前一行,不允许和函数定义在同一行。

一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西(如果返回不是一个可调用的对象那么会报错)。

#Example 1
def test(func):
    print("a")
    return func()
    
@test     #从这里可以看出@test等价于 test(xxx())
def xxx():
    print('Hello world!')

运行结果:

a
Hello world!

可以看出,先执行test()下的print(“a”),再return func()即返回xxx()函数

那么,如果前后连续出现两个及以上的@修饰器呢?处理的顺序如何?看下面的例子:

#Example 2
def FA(fn):
    def warp():
        return "<a>"+fn()+"<a>"
    return warp
def FB(fn):
    def warp():
        return "<b>"+fn()+"<b>"
    return warp
    
@FA         #相当于makebold(test1),也就是把当前函数作为入参传过去
def test1():
    return "test1"
 
@FB
def test2():
    return "test2"
    
@FA
@FB
def test3():     #函数和装饰器是倒着执行的,从下往上,从内而外,一层层执行
    return "test3"
    
print(test1())
print(test2())
print(test3())

运行结果:

<a>test1<a>
<b>test2<b>
<a><b>test3<b><a>

以上结果可以看出,函数前面有两个及以上装饰器时,先执行函数,返回的值作为参数传入上一层即FA(),FA()返回的值传入FB(),最终得到FB()返回的值。

二、表示矩阵乘法

#Example 3
class Mat(list):
    def __matmul__(self, B):
        A = self
        return Mat([[sum(A[i][k]*B[k][j] for k in range(len(B)))
                    for j in range(len(B[0])) ] for i in range(len(A))])
A = Mat([[1,3],[7,5]])
B = Mat([[6,8],[4,2]])
print(A @ B)

运行结果:

[[18, 14], [62, 66]]
Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐