3.4 数值
在本章开头提到了Python的几种内置数据类型,有数字、字符串、列表、元组、集合和字典。数据类型是编程语言的语法基础。计算机所处理的大量数据中均含有数值。在编程术语中,数值称为数字字面常量(Number Literal)。本节将介绍数值显示的方式以及对数值的各种操作。
3.4.1 基本数值:整型和浮点型
Python3的数字类型分为整形(Integer)、浮点型(Floating Point)、布尔型、分数类型、复数类型。我们多次提到,使用Python编写程序时,不需要声明变量的类型。由Python内置的基本类型来管理变量,在程序的后台实现数值与类型的关联,以及类型转换等操作。Python根据变量的值自动判断变量的类型,只需知道创建的变量放了一个数,以后的工作都是对这个数进行操作。
Python支持整型和浮点型数值。无任何类型声明可用于区分,Python通过是否有小数点来分辨它们。一个没有小数点的数值称为整型,一个带有小数点的数字称为浮点型。
Python定义的type类可以查看变量的类型。type是Python内联模块__buildin__模块的一个类,该类能返回变量的类型。内联模块不需要import语句,由Python解释器自动导入。
例如,1为int类型。同样,还可使用isinstance()函数判断某个值或变量是否为给定某个类型。将一个int与一个int相加将得到一个int,将一个int与一个float相加将得到一个float。Python把int强制转换为float以进行加法运算,然后返回一个float类型的结果。
Python里面的整数类型可正可负,不像其他的语言,Python的整数并没有取值范围的限制。
Python中除了十进制,其他进制的数据只能用字符串来表示,可以将二进制、八进制、十六进制转换成十进制整型。二进制以0b或0B开头,八进制以0o或0O开头,十六进制以0x或0X开头。不同进制的使用见代码清单3-6。
代码清单3-6 不同进制的表示
运行结果:
3.4.2 算术运算符
5种基本的算术运算符加、减、乘、除和幂运算对数值进行各种运算。Python中加、减、除的运算符分别使用标准的符号+、-、/来表示,用于表示乘法和幂运算的运算符略有不同,分别为*和**。
“/”运算符执行浮点除法,即便分子和分母都是int,它也返回一个float类型的浮点数。
“//”运算符执行整数除法。如果结果为正数,可将其视为朝向小数位取整(不是四舍五入),但是要小心这一点;当整数除以负数,//运算符将结果朝着最近的整数“向上”四舍五入。从数学角度来说,由于-6比-5要小,它是“向下”四舍五入,如果期望将结果取整为-5,它将会误导你。//运算符并非总是返回整数结果。如果分子或者分母是float,它仍将朝着最近的整数进行四舍五入,但实际返回的值将会是float类型。
“**”运算符的意思是“计算幂”,112结果为121。
“%”运算符给出了进行整除之后的余数。11除以2结果为5以及余数1,因此此处的结果为1。
注意 与其他编程语言不同,Python不支持自增运算符和自减运算符,如k++、i--是错误的语法。
经常会出现变量的当前使用值被使用、修改、然后重新赋值给同一变量的情况。例如,下面的语句就是给变量count加1。
Python允许使用便捷(或合成)运算符将赋值运算和加法运算符结合在一起。例如,前面的语句可以写作:
运算符+=被称作加法赋值运算符。所有的增强型运算符都在表3-4中给出。需要注意的是,增强运算符中间没有空格。
表3-4 增强型赋值运算符
(续)
3.4.3 数值变量
数值表达式中也可以使用变量,表达式的计算需要依次将每个变量替换为其值后再进行算术运算。
变量是一个名称,对应着存储在内存中的一个数据。当变量第一次出现在赋值语句的左边时,该变量即被创建,以后对该变量的赋值语句只是为这个变量赋予不同的值。每个变量均指向了一个存储其数值的内存地址。在表达式使用变量之前,该变量必须被赋值。
赋值语句本质上就是计算出一个值并将它赋给操作符左边变量的一个表达式。
3.4.4 括号与优先级
Python表达式的求值和数学表达式求值是一样的。用Python编写数值表达式就是使用Python操作符对算术表达式进行直接翻译。例如,算术表达式
可以翻译成如下所示的Python表达式。
尽管Python有自己在后台计算表达式的方法,但是,Python表达式的结果和它对应的算术表达式的结果是一样的。因此,可以放心地将算术运算规则应用在计算Python表达式上。首先执行的是包括在圆括号里的运算。圆括号可以嵌套,嵌套时先计算内层括号。当一个表达式中有多于一个的操作符时,以下操作符的优先级规则用于确定计算的次序。
(1)乘法、除法和求余运算首先计算。如果表达式中包含若干个乘法、除法和求余操作符,可按照从左到右的顺序执行。
(2)最后执行加法和减法运算。如果表达式中包含若干个加法和减法操作符,则按照从左到右的顺序执行。
下面是一个如何计算表达式的例子。
提示 好的编程习惯应该尽可能多地使用括号,这样就不需要刻意记忆优先级的规则。例如,将2×3+4写为(2×3)+4。
3.4.5 内存中的数字对象
Python支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。数字提供了标量存储和直接访问,它是不可更改类型,也就是说变更数字的值会生成新的对象。创建数值对象和给变量赋值一样简单。
通过给数字对象(重新)赋值,可以“更新”一个数字对象。实际上并没有更新该对象的原始数值,这是因为数值对象是不可改变对象。这里的更新实际上是生成了一个新的数值对象,并得到它的引用。
在学习编程的过程中,我们一直被灌输这样的观念:变量就像一个盒子,里面装着变量的值。在Python中,变量更像是一个指针指向装变量值的盒子。对不可改变类型来说,你无法改变盒子中的内容,但是可以将指针指向一个新的盒子。每次将另外的数字赋给变量的时候,实际上是创建了一个新的对象并把它赋给变量(不仅仅是数字,对于所有的不可变类型,都是如此)。
图3-3中展示了在内存中这两行代码被执行时内存的变化情况。内存中首先分配一块内存保存数字10,当执行第二段代码时,Python又分配了一个新的内存地址保存数值100,并将变量number重新指向新的内存地址。而内存中的数字10最终会被垃圾回收进程处理,并解除占用的内存空间。
图3-3 内存中的数值对象
3.4.6 常见的数值函数
Python现在拥有一系列针对数字类型的内建函数。一些函数用于数字类型转换,另一些则执行一些常用运算。
1.转换工厂函数
int函数将字符串或者数值对象转换为整型,float函数将字符串转换为浮点型(float函数也可以将整型转换为浮点型)。
complex函数返回一个字符串的复数表示,或者根据给定的实数(及一个可选的虚数部分)生成一个复数对象。
2.功能函数
abs返回给定参数的绝对值。如果参数是一个复数,那么就返回math.sqrt(num.real2 +num.imag2)。
函数pow()和双星号**操作符都可以进行指数运算。
round(n,r)函数的结果是四舍五入保留数值n的小数点后r位,参数r可选。