人工智能基础教程:Python篇(青少版)
上QQ阅读APP看书,第一时间看更新

2.1 分数和复数的表示

先来谈谈分数和复数,这都是我们在数学上学习或是将要学习的知识。通过本章的学习后,我们可以利用Python处理更多的操作。

2.1.1 分数

Python可以处理分数,但是要使用一个分数模块。我们对模块的概念可能还很模糊,但在后面会正式认识它。现在,我们只需把它看作一个黑盒,知道它是可以处理分数的工具即可。

接下来,程序2.1将分数的定义以及各种使用方法列出,我们对照程序分析学习具体的方法。

程序2.1:

输出:

分析:

程序的第1行将Fraction引入。程序的3、6、9行对应着不同的分数指定方法,第3行中我们使用Fraction(1, 2)的方式,第6行将浮点数2.5作为参数,第9行甚至将一个字符串作为参数传入。但是,看看前3行输出结果:这3种分数声明方式都是正确的,都会返回一个分数,即我们可以根据实际的需求选用任意一种分数声明方式。

程序的第12行我们指定了分数122/368,这是一个可约分的分数,通过第4行的输出可以看到约分已经完成。

程序的第15、18、20行都是简单的加法运算,但输出的结果却不同。第15行,两个Fraction对象相加时,输出同之前的一样。第18行,Fraction对象和一个整型数相加,输出也同之前一样。但是,我们来看看第20行,当Fraction对象和一个浮点数相加时,输出的结果却变成了浮点数。如果程序对输出要求很严格的话,应该想好需要使用什么类型。

最后,来看看程序的第23行和第27行。第23行是两个Fraction对象相乘返回一个分数,它们不是简单地互乘,相乘的结果会自动约分之后再输出。第27行使用了Fraction中的numerator和denominator两个属性,它们分别是分数的分子和分母。

关于Python中分数的操作先介绍到这里。后续若有其他关于分数的操作我们再根据具体的程序进行分析。

2.1.2 复数

到目前为止,我们接触到的都是实数,但是不管是在学校的课程(人教版课本是高中数学选修2—2。若你还没有学到复数这一概念,可以先跳过这节,或是查阅数学教材再来阅读。我们不在这里细谈数学概念)中还是在实际的工程操作中,这都是远远不够的。

Python为我们提供了复数以及关于复数的操作。注意,在数学课上通常用i来定义复数的虚部,但是在Python中使用的是j。例如,在笔算时通常会写2+3i这种形式,但是,在Python中我们要输入2+3j。接下来用程序2.2来看看复数的具体操作。

程序2.2:

输出:

分析:

程序的第1行和第2行使用了两种方法指定复数,第一种使用了我们很熟悉的方法,但是一定注意Python中虚部不是用i表示。第二种方法是使用complex函数,它的第一个参数是实部,第二个参数是虚部,第2行语句的结果同b = 4 + 9j一样。第3~4行是将它们的类型输出,可以看到输出结果中第1行和第2行是a和b的类型。关于输出中的class关键字在这里先不细谈。

程序的第6~9行对应了复数的加减乘除运算,这个相比较笔算而言就很有优势了。我们可以将较为复杂的步骤交给Python去做。输出结果中的第3~6行是运算结果。

程序的第11行分别输出了复数的实部与虚部,这里我们要注意的是输出结果中的第7行,使用real和imag属性输出的是浮点型的数。

程序的第12行,我们直接使用conjugate方法来输出a的共轭复数,结果在输出的第8行。

最后,程序的第13行,我们使用abs方法来计算复数的大小,这和语句“(a.real ** 2 + a.imag **2) ** 0.5”的运算结果是一样的。