Python数字编程 第三、四节

第三节 不同类型的数字

刚刚的计算过程中,我们看到有两类数字,整数(int,称为整型)和小数(float,称为浮点型),不论对于什么数字,人们一眼即可看出数字的类型,那在程序中应该如何看出来呢?答案揭晓:使用type()函数即可进行查看,如


 >>> type(3)  >>> type(3.0) 

此处要理解关于数字的数据类型,整型(int),浮点型(float),比如3和3.0,虽然我们知道这两个数字是等价的,但是Python会对这两种数进行不同的处理,因为在Python看来他们他们是两种数。

并且我们要编写的一些程序也只有输入是整数或者小数才能够去正常工作。

但是,Python提供了内置函数,可以将两种数进行转换

首先,浮点数转成整数,使用int()函数,仅保留小数部分的整数


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

整数转成浮点数,使用float()函数,在整数后面添加小数点,转成浮点数


 >>> float(3) 3.0

1.3.1 分数的操作

Python可以操作分数,但要借助Python的fractions模块。模块可以认为是他人编写的程序,但是我们可以在自己的程序中使用。模块可以是Python标准库的一部分,也可以从第三方位置分发,后一种情况下需要安装该模块才能使用。

fractions模块是标准库的一部分,也就是不需要再主动安装。他在其中定义了一个类,这是用来在程序中输入分数的。只需要使用import导入即可,即告诉Python我们要使用fractions里面的类Fraction,例子如下,创建一个新的标签f,f指代分数3/4


 >>> from fractions import Fraction  # ① >>> f = Fraction(3, 4)              # ② >>> f                               # ③ Fraction(3, 4)

①:首先从fractions模块里面导入Fraction类

②:传递分子分母两个参数到Fraction类创建一个Fraction对象,这样就为3/4创建了一个Fraction对象

③:此时f为一个Fraction对象,输出f时,Python会以Fraction(分子,坟分母)的形式显示

那我们就可以把这个对象当作是一个分数来进行数学运算,如下


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

注意:表达式中有浮点数,上述例子中为1.5,运算结果返回浮点数

当表达式中只有分数和整数时,返回结果为分数形式,即使分母为1,例子如下


 >>> Fraction(1, 4) * 2 + Fracction(1/2) Fraction(1, 1)

1.3.2 复数

上述我们看到的都是实数,Python还支持复数,其中虚数部分使用字母j或J来表示(这与数学中使用i来表示不同,但类似),如,复数2+3i可以表示为2+3j


 >>> a = 2 + 3j >>>type(a) 

我们依然可以使用type()函数来返回复数的类型,可以看到是

还可以使用complex()函数来定义一个复数,传入的参数为这个复数的实部和虚部,返回一个复数


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

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


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

复数的乘法和除法也可以进行类似操作,首先我们来复习一下复数的乘法和除法计算方法

复数乘除法计算公式


 >>> a * b (-3 + 15j) >>> a / b (0.83333333334 + 0.16666666666j)        

取模(%)和向下取整(//)操作对复数无效

可以使用real和imag属性来提取复数的实部和虚部,可以看到复数的实部和虚部都是浮点数。


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

可以通过conjugate()函数来获得某个复数的共轭复数

共轭复数:两个复数实部相,虚部互为相反数,如2+3j 和 2 - 3j


 >>> z.conjugate() (2 -3j)

借助复数的实部和虚部可以计算复数的模

复数的模计算公式:

复数的模计算公式


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

当然,还有更直接的办法,abs()函数,当传入的参数为实数时,计算其绝对值,传入参数为复数时,计算复数的模


 >>> abs(z) 3.605551275463989

第四节 获取用户输入

当编写程序时,经常使用input()函数来接收用户输入,我们它我们可以编写要求用户输入数字的程序,然后对数字执行特定的操作,例如


 >>> a = input()     # ① 1                   # ②

在①处,调用input()函数,此时系统会暂停运行,等待用户输入

在②处,用户输入,按Enter键,输入的数字将存储在a中

我们打印输出a


 >>> a '1'

此处可以看到输出的1是带着引号的,input()函数返回的都是字符串,字符串是两个引号之间的任何一组字符,python中可以使用单引号或者双引号来定义字符串

值得注意的是,即使这个字符串是纯数字,Python也不会将其视为数字,这时候我们需要将其进行转换,只有字符串仅包含数字才能进行转换,可以使用int()或者float()函数


 >>> a = '1' >>> int(a) + 1 2 >>> float(a) + 1 2.0

此处的int()和float()函数与之前的数据类型转换有所不同,之前传入的参数为数字,而现在为字符串。必须说明一下,int()只能转换整数型字符串,如果传入的是浮点型字符串,就会报错。例如


 >>> int('2.0') Traceback (most recent call last):   File "", line 1, in      int('2.0') ValueError: invalid literal for int() with base 10: '2.0'

同样,当你输入一个分数如3/4时,Python不能将其转化为等价的整数或者浮点数,再次引发ValueError异常:


 >>> a = float(input()) 3/4 Traceback (most recent call last):   File "", line 1, in      a = float(input()) ValueError: could not convert string to float: '3/4'

通常我们放在try...except块中来执行转换,提醒用户无效输入

1.4.1 处理异常和无效输入

try...except基本思想:在try...except程序块中执行一行或者多行代码时,如果程序发生错误,并不会立即停止,而是输出一个Traceback,然后,程序的执行会转到except后的块,我们可以继续一些适当操作,比如输出错误信息或者尝试其他操作等等,如


 >>> try:     a = float(input('Enter a number: ')) except ValueError:     print("You entered an invalid number")

上述代码中指定了需要处理的错误类型,如ValueError。

现在给出一个无效输入,如下所示


 Enter a number: 3/4 You entered an invalid number

你也可以使用intput()函数来输出一些提示信息,告诉用户需要输入什么样的数据


 >>> a = input("Input a integer: ")

用户看到提示信息后输入


 Input a integer: 1

本课程学习的内容中有许多程序会要求魱输入一个数字,所以必须确保在数字在使用之前已经做了适当的转换,我们可以在单个语句中组合输入函数和转换函数


 >>> a = int(input()) 1 >>> a + 1 2

此处,依然不能输入浮点型,不然会报ValueError类型异常

假设我们需要输入的数字为整数,此时我们可以像之前那样做一个ValueError异常捕获,这样一来,程序将会捕获浮点数,这些浮点数对于只针对整数的程序没有作用。然而,也需要标记像1.0,2.0这样的数字,他们的作用等同于整数,它们也可以作为整数程序的正确输入。

为了解决这个问题,我们可以使用is_integer()函数来过滤掉那些小数点后面还带有有效数字的浮点数,留下整数或等同于整数的浮点数(只适用于float数据,不适用以整数输入的数字)


 >>> 1.1.is_integer() False >>> 1.0.in_integer() True

通过上述例子,我们可以看到,is_integer()函数可以过滤掉非整数输入,同时保留等价于整数的浮点数,如1.0,稍后会将这种方法应用于更大的程序

1.4.2 将分数和复数作为输入

事实上,对于分数的接受操作我们之前已经有所接触了。那就是将一个分数使用Fraction类来转换成Fraction对象


 >>> a = Fraction(input('Enter a fraction: ')) Enter a fraction: 3/4 >>> a Fraction(3, 4)

尝试输入一个分数如:3/0


 >>> a = Fraction(input('Enter a fraction: ')) Enter a fraction: 3/0 Traceback (most recent call last):   File "", line 1, in      a = Fraction(input('Enter a fraction: '))   File "D:\User\Python\lib\fractions.py", line 178, in __new__     raise ZeroDivisionError('Fraction(%s, 0)' % numerator) ZeroDivisionError: Fraction(3, 0)

ZeroDivisionError异常信息告诉我们,分母为0的分数无效,所以我们一个正常的程序需要始终取捕获此类异常,可以这样做:


 >>> try:     a = Fraction(input('Enter a fraction: ')) except ZeroDivisionError:     print('Invalid fraction')      Enter a fraction: 3/0 Invalid fraction

此时对于分母为0的这种无效输入我们就可以捕获了,输出Invalid fraction信息。

类似,对于复数而言,complex()函数可以将一个如‘2+3j’字符串转化为复数


 >>> z = complex(input('Enter a complex number: ')) Enter a complex number: 2+3j >>> z (2+3j)

此处复数加号两边如果加了空格,就会报错,


 >>> z = complex(input('Enter a complex number: ')) Enter a complex number: 2 + 3j Traceback (most recent call last):   File "", line 1, in      z = complex(input('Enter a complex number: ')) ValueError: complex() arg is a malformed string

可以看出,它是一个ValueError异常,对于这类异常捕获刚刚已经说过了,只需要except 后指定异常类型即可,我们将字符串转换为复数时,最好捕获此类异常

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章