>>> m = matrix([1,2,3])
>>> m @= m.T
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: In-place matrix multiplication is not (yet) supported. Use 'a = a @ b' instead of 'a @= b'.
当它实现时,我希望结果看起来像这样:
>>> m = matrix([1,2,3])
>>> m @= m.T
>>> m
matrix([[14]])
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)
rule = "/"
view_func = hello
# They go as arguments here in 'flask/app.py'
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
pass
11 回答
如果您指的是使用 Numpy 库的python笔记本中的某些代码,则
@ operator
表示 Matrix Multiplication . 例如:@符号还用于访问plydata / pandas数据帧查询中的变量
pandas.DataFrame.query
. 例:用不同的方式说出别人有什么:是的,它是装饰者 .
在Python中,它就像:
创建一个函数(在@调用下面)
调用另一个函数来操作您创建的函数 . 这将返回一个新函数 . 您调用的函数是@的参数 .
替换用返回的新函数定义的函数 .
这可以用于各种有用的东西,因为函数是对象,只是必要的指令 .
“at”(@)符号在Python中有什么作用?
简而言之,它用于装饰器语法和矩阵乘法 .
在装饰器的上下文中,这个语法:
相当于:
在矩阵乘法的上下文中,
a @ b
调用a.__matmul__(b)
- 使用以下语法:相当于
和
相当于
例如,
dot
是numpy矩阵乘法函数,a
和b
是矩阵 .你怎么能自己发现这个?
如果您希望对python语法的特定内容有一个相当完整的视图,请直接查看语法文件 . 对于Python 3分支:
我们在这里可以看到
@
在三种情况下使用:装饰者
因素之间的运算符
增强赋值运算符
装饰器语法:
谷歌搜索"decorator python docs"作为最佳结果之一,"Python Language Reference."滚动到section on function definitions的"Compound Statements"部分,我们可以通过搜索单词"decorator"找到它,我们看到......有很多东西需要阅读 . 但是,"decorator" is a link to the glossary这个词告诉我们:
@staticmethod
def f(...):
...
类存在相同的概念,但在那里不太常用 . 有关装饰器的更多信息,请参阅有关函数定义和类定义的文档 .
所以,我们看到了
在语义上与以下相同:
它们并不完全相同,因为Python在使用装饰器(
@
)语法的bar之前评估foo表达式(可能是点缀查找和函数调用),但在另一种情况下在bar之后计算foo表达式 .(如果这种差异对你的代码的意义产生影响,你应该重新考虑你在生活中做了什么,因为那将是病态的 . )
堆叠装饰器
如果我们回到函数定义语法文档,我们会看到:
这是一个演示,我们可以首先调用一个装饰器的函数,以及堆栈装饰器 . Python中的函数是第一类对象 - 这意味着您可以将函数作为参数传递给另一个函数,并返回函数 . 装饰者会做这两件事 .
如果我们堆叠装饰器,那么定义的函数首先被传递到紧接在它上面的装饰器,然后是下一个,依此类推 .
那就是在装饰器的上下文中总结
@
的用法 .运营商,@
在语言参考的词法分析部分,我们有一个section on operators,其中包含
@
,这使它也成为一个运算符:在下一页的数据模型中,我们有section, emulating numeric types,
我们看到
__matmul__
对应于@
. 如果我们搜索"matmul"的文档,我们会在"PEP 465 - A dedicated infix operator for matrix multiplication" Headers 下找到What's new in Python 3.5与"matmul"的链接 .(所以现在我们知道
@=
是就地版本) . 它进一步解释说:虽然这个运算符可以重载以执行几乎任何操作,例如,在
numpy
中,我们将使用此语法来计算数组和矩阵的内部和外部乘积:Inplace矩阵乘法:@ =
在研究先前的用法时,我们了解到还有就地矩阵乘法 . 如果我们尝试使用它,我们可能会发现它尚未实现numpy:
当它实现时,我希望结果看起来像这样:
在Python 3.5中,您可以将
@
重载为运算符 . 它被命名为__matmul__
,因为它被设计用于矩阵乘法,但它可以是你想要的任何东西 . 有关详细信息,请参见PEP465 .这是矩阵乘法的简单实现 .
此代码产生:
@符号是一个语法糖python提供利用
decorator
,解释这个问题,这正是装饰师在Python中做了什么?
说实话
decorator
允许你修改一个给定的函数's definition without touch its innermost (it'的闭包) .从第三方导入精彩包装时,情况最多 . 你可以想象它,你可以使用它,但你不能触及它的内心和它的心脏 .
这是一个简单的例子,
假设我在Ipython上定义了一个
read_a_book
函数你看,我忘了为它添加一个名字 .
如何解决这样的问题?当然,我可以将函数重新定义为:
然而,如果我不被允许操纵原始函数,或者如果有数千个这样的函数要处理,该怎么办呢?
通过思考不同来解决问题并定义new_function
然后使用它 .
田田,你看,我修改了
read_a_book
而没有触及它的内部封闭 . 没有什么能阻止我装备decorator
.是什么关于
@
@add_a_book
是一种花哨而方便的方式来表达read_a_book = add_a_book(read_a_book)
,它对它来说没什么更好的了 .行开头的
@
符号用于类,函数和方法装饰器 .在这里阅读更多:
PEP 318: Decorators
Python Decorators
您将遇到的最常见的Python装饰器是:
@property
@classmethod
@staticmethod
如果你在一条线的中间看到
@
,那就是矩阵乘法 . 向下滚动以查看解决@
使用的其他答案 .序言
我承认我花了不少时间才能完全掌握这个概念,所以我将分享我所学到的拯救他人的麻烦 .
名称 decorator - 我们在函数定义之前使用
@
语法定义的东西 - 可能是这里的主要罪魁祸首 .示例
这表明你在 decorator 之后定义的
function
/method
/class
基本上在@
符号之后立即作为argument
传递给function
/method
.第一眼见到
微框架 Flask 从一开始就以下列格式介绍 decorators :
这反过来转化为:
意识到这一点最终让我对Flask感到安宁 .
此代码段:
相当于这段代码:
在装饰器的定义中,您可以添加一些通常不会被函数返回的修改过的东西 .
从Python 3.5开始,'@'用作MATRIX MULTIPLICATION的专用中缀符号(PEP 0465 - 见https://www.python.org/dev/peps/pep-0465/)
它表明您正在使用装饰器 . 这是2008年的Bruce Eckel's example .