1.4.2 算术运算和预定义函数

Python包含基本的算术运算符,例如+-*(乘)、/(除)和**(幂运算)。

Python使用双星号**表示求一个数的幂。

例如,a**2表示“a的平方”(符号a^2在其他一些数学软件中表示平方,但在Python中具有完全不同的含义)。

与标准数学符号不同,Python中的乘法必须包含乘法符号。尝试输入以下命令:

(2)(3)
a = 2; a(3)
3a
3 a

每个命令都会产生一条错误消息。但是,它们都不会生成这样的消息:“你忘了一个'*'!”根据Python使用的求值规则,这些表达式没有意义。Python不知道你试图表达什么,所以它无法确切地告诉你出了什么问题。不妨研究这些错误消息;你可能会再次遇到它们。附录D描述了这些错误消息和其他常见的错误。

算术运算的优先级(排序)与常识相符。

使用圆括号可以改变运算符的优先级。

与数学教科书不同,在Python中,只能使用圆括号改变优先级排序。方括号和花括号则用于其他目的。前面已经看到,圆括号还有另一种含义:将函数的参数括起来。此外,圆括号还有第三种含义:指定元组。Python根据上下文来确定要使用哪种含义。

例如,如果要使用数字,你可能会输入1/2*np.pi(原生Python不知道π的值,但NumPy知道)。试试看。

问题出在哪里?为什么?插入括号可以修复表达式的问题。稍后我们会遇到其他类型的运算符,如比较和逻辑运算符,它们也有一定的优先级排序。你可能并不想记住所有运算符的优先级,不过,你可以自由地使用括号来准确地表达你的意图。

为了熟悉Python的算术运算,试回答下面两个语句解决了什么样的著名数学问题,并检查Python能否正确处理:

a, b, c = 1, -1, -2
(-b + np.sqrt(b**2 - 4*a*c))/(2*a)

前面曾介绍过,np.sqrt是一个函数的名称,Python在启动时是无法识别它的,但一旦导入NumPy模块后,它就变得可用了。当Python遇到第二行中的表达式时,它会执行以下操作。

(1)通过用数值替换变量并执行算术运算来计算np.sqrt函数的参数的值,参数是指函数名后圆括号内的所有内容(参数本身可能包含函数)。

(2)中断表达式的计算,并执行一段名np.sqrt的代码,将步骤(1)中找到的结果传递给该代码。

(3)用np.sqrt返回的值替换表达式。

(4)按照正常程序完成表达式的求值。

如何知道哪些函数可用?参见1.2.3小节:在IPython控制台提示符下输入dir(np)dir(__builtins__)

Python和NumPy预先定义了若干符号。这些符号不需要任何参数或括号。试试np.pi(常数π)、np.e(自然对数的底数)和1j(虚数单位)。另外,NumPy还提供标准的三角函数,但在使用时要注意:

np.sinnp.cosnp.tan等三角函数中,参数的角度都采用弧度。