通常我们所见的@符号是用于邮箱中,而在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/
转载文章受原作者版权保护。转载请注明原作者出处!