Python 笔记:处理数字(Working with Numbers)1

基本数学运算

启动 Python 3 的 IDLE 界面, >>> 是提示符。 Python 可以像一个神奇的计算器那样进行简单的计算,只要输入一个表达式, Python 就会对它进行计算。按 Enter 键后,结果会立刻显示。

>>> 1+2
3
>>> 1+3.5
4.5
>>> -1+2.5
1.5
>>> 100-45
55
>>> -1.1+5
3.9

使用乘法运算符( * ) 进行乘法运算:

>>> 3*2
6
>>> 3.5*1.5
5.25
>>> 

使用除法运算符( / ) 进行除法运算:

>>> 3/2
1.5
>>> 4/2
2.0

如你所见,当要求 Python 执行除法运算时,它也会返回数字的小数部分。如果希望结果为整数形式,则应该使用向下取整除法(floor division)运算符(//):

>>> 3//2
1

向下取整运算法(floor division) 运算符(operator) 将第一个数字除以第二个数字,然后将结果向下取整到最接近的小的整数。当其中一个数字为负数时,这将变得有趣。例如:

>>> -3//2
-2

最终结果是小于除法运算结果的整数(除法运算结果是 -3/2=-1.5, 所以最终结果是 -2)。

另一方面,如果只需要余数,则应该使用模运算符( % ):

>>> 9%2
1

可以使用指数运算符( ** ) 计算数字的幂。下面的例子展示了这一点:

>>> 2**2
4
>>> 2**10
1024
>>> 1**10
1

我们也可以使用指数运算符号计算指数小于 1 的幂。例如,n 的平方根可以表示为 n^{1/2}, 立方根表示为 n^{1/3} :

>>> 8**(1/3)
2.0

你也可以使用括号将数学运算式组合成更复杂的表达式。 Python 会按照标准的 PEMDAS 规则评估表达式的计算顺序——括号(parentheses), 指数(exponents), 乘法(multiplication), 除法(division), 加法(addition) 和 减法(subtraction).

考虑以下两个表达式,一个没有括号,而另一个有括号:

>>> 5+5*5
30
>>> (5+5)*5
50

在第一个表达式中,Python 首先计算乘法:5 乘以 5 等于 25; 25 加 5 等于 30.

在第二个表达式中,Python 首先计算括号中的表达式,正如我们预期的:5 加 5 等于 10; 10乘以 5 等于 50.

这些是在 Python 中操作数字的最基本原则。接下来我们学习如何给数字命名。

标签(labels):给数字命名

当开始设计更复杂的 Python 程序时,我们会给数字命名,有些时候是为了方便,但大部分情况是出于必要。这里有一个简单的例子:

>>> a=3 #1
>>> a+1
4
>>> a=5 #2
>>> a+1
6

其中 # 是注释符号。井号(#)常被用作单行注释符号,在代码中使用#时,它右边的任何数据都会被忽略,当做是注释。

在 #1 处,我们将数字 3 命名为 a. 当计算表达式 a+1 的结果时,Python 发现 a 指代的值是 3, 然后将 3 加上 1, 最后显示结果 4.

在 #2 处,a 指代的值变为 5, a+1 的结果在第二次加法运算时也发生了变化。

使用名称 a 的方便之处在于,你只要简单地改变其指代的值,Python 再引用 a 这个名称时就会使用新值。

这种名称被称为标签,你可能在其他地方听到过变量(variable) 这个术语,变量也是用来表达相同的想法的。然而,考虑到变量也是一个数学术语(例如在方程式 x+2=3 中的 x), 为了避免概念上的混淆,本书只在数学方程式和表达式语境中使用变量这个术语。

不同类型的数字

你可能注意到了,之前在介绍数学运算时我们使用了两类数字——没有小数点的数字(称为整数 integers)以及带有小数点的数字(称为浮点数 floating point numbers)。无论数字是整数(integers), 浮点数(floating point decimals), 分数(fractions), 还是罗马数字(roman numerals), 人类都能很容易地识别和处理它们。但是,这里编写的一些程序只有在某些特定类型的数字上执行才有意义,所以我们经常需要编写代码来检查是否输入了正确的数字类型。

Python 将整数和浮点数视为不同的类型。如果使用 type() 函数,Python 会显示你刚刚输入的数字类型。例如:

>>> type(3)
<class 'int'>
>>> type(3.5)
<class 'float'>
>>> type(3.0)
<class 'float'>

在这里,你可以看到 Python 将数字 3 分类为整数(类型 "int"), 但将 3.0 分类为浮点数(类型 "float"). 我们都知道 3 和 3.0 在数学上是等同的,但是在许多情况下, Python 会以不同的方式处理这两个数字,因为它们是两种不同的数字类型。

我们在这里编写的一些程序仅在输入为整数的情况下才能正常工作。正如我们刚刚看到的那样,Python 不会将 1.0 或 4.0 这样的数字识别为整数,所以如果我们想将类似的数字作为这些程序的有效输入,我们必须把它们从浮点数转换为整数。幸运的是,Python 内置的一个函数可以做到这点:

>>> int(3.8)
3
>>> int(3.0)
3

int() 函数获取输入的浮点数,去掉小数点后的所有内容,返回得到的整数。float() 函数的工作原理有点儿类似,但它是执行反向的转换:

>>> float(3)
3.0

float() 获取输入的整数,并在整数后添加一个小数点,将其转换为浮点数。

分数的操作

Python 也可以操作分数(fractions),但要做到这一点,我们需要使用 Python 的 fractions 模块(module)。你可以将模块视为由他人编写的程序,但你可以在自己的程序中使用。模块包括类(classes), 函数(functions)甚至标签定义(label definitions). 它可以是 Python 标准库的一部分,也可以从第三方位置分发。在后一种情况下,你必须先安装该模块才能使用它。

fractions 模块是标准库的一部分,意味着它已经安装了。它定义了一个类 Fraction, 这是用来在我们的程序输入分数的。在使用之前,我们需要导入(import) 该模块,这是一种通知 Python 我们要使用这个模块中的类的方法。我们来看一个简单的例子,创建一个新的标签 f, 它指代的是分数 3/4:

>>> from fractions import Fraction #1
>>> f=Fraction(3,4) #2
>>> f #3
Fraction(3, 4)

#1 首先我们从 fractions 模块那里导入 Fraction 类

#2 接下来,通过传递分子和分母两个参数来创建这个类的对象,这样就为分数 3/4 创建了一个 Fraction 对象

#3 当我们输出对象时,Python 会以 Fraction(分子,分母) 的形式显示分数,即 Fraction(numerator, denominator)

基本的数学运算,包括比较运算(comparison operations), 都适用于分数(fractions). 你还可以在单个表达式中组合分数(fraction), 整数(integer)和浮点数(floating point number):

>>> Fraction(3,4)+1+1.5
3.25

当表达式中只有一个分数和一个整数时,结果就是分数,即使结果的分母为 1.

>>> Fraction(3,4)+1+Fraction(1/4)
Fraction(2, 1)

以上我们了解了在 Python 中使用分数的基础知识。接下来介绍另一类数字。

复数

到目前为止,我们看到的数字是所谓的实数。Python 还支持复数,其中虚部由字母 j 或 J 标识(与在数学符号中常用字母 i 来表示不同)。例如,复数 2+3i 在 Python 中表示为 2+3j:

>>> a=2+3j
>>> type(a)
<class 'complex'>

正如你所看到的,当我们对一个复数使用 type() 函数时,Python 告诉我们这是一个复数类型的对象。你还可以使用 complex() 函数定义复数:

>>> a=complex(2,3)
>>> a
(2+3j)

这里我们将复数的实部和虚部作为两个参数传递给 complex() 函数,并返回一个复数。

你可以用与实数相同的方式对复数进行加减运算:

>>> a=complex(2,3)
>>> b=3+3j
>>> a+b
(5+6j)
>>> a-b
(-1+0j)

复数的乘法和除法也可以进行类似的操作:

>>> a*b
(-3+15j)
>>> a/b
(0.8333333333333334+0.16666666666666666j)

但模 modulus (%) 和向下取整除法(//) 操作对复数无效。

可以使用 real 和 imag 属性来提取复数的实部(real part) 和虚部(imaginary part),如下所示:

>>> z=2+3j
>>> z.real
2.0
>>> z.imag
3.0

复数的共轭(conjugate) 具有相同的实部,但是具有相同大小和相反符号的虚部。可以使用 conjugate() 函数获得:

>>> z=2+3j
>>> z.real
2.0
>>> z.imag
3.0
>>> z.conjugate()
(2-3j)

复数的实部和虚部均为浮点数。借助实部和虚部,你可以通过以下公式计算复数的模:\sqrt{x^2+y^2}, 其中 xy 分别是复数的实部和虚部。在 Python 中,可以如下计算:

>>> (z.real**2+z.imag**2)**0.5
3.605551275463989

计算复数的模的一个更简单的方法是使用 abs() 函数。当使用实数作为参数调用时,abs() 函数将返回绝对值。例如,abs(5) 和 abs(-5) 都返回 5. 然而,对于复数,它返回复数的模:

>>> abs(5)
5
>>> abs(-5)
5
>>> z=2+3j
>>> abs(z)
3.605551275463989

标准的 cmath 模块(其中 c 表示复数)提供了许多专门的函数来处理复数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙珩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值