python中@详解

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

一、表示修饰符

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

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

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


def test(func):
    print("a")
    return func()

@test
def xxx():
    print('Hello world!')

运行结果:

a
Hello world!

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

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


def FA(fn):
    def warp():
        return ""+fn()+""
    return warp
def FB(fn):
    def warp():
        return ""+fn()+""
    return warp

@FA
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()返回的值。

二、表示矩阵乘法


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

Original: https://blog.csdn.net/ningqingzy/article/details/126122078
Author: ningqingzy
Title: python中@详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/723389/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球