循序渐进学Python之数值类型

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

循序渐进学Python之数值类型(一)(1)本文将介绍Python语言的一种基本数据类型:数值类型。首先,我们会详细介绍Python语言各种数值类型以及相应的算术运算和它们的优先级、结合性。然后,我们还会对整型的位运算做深入的解释。本文将介绍Python语言的一种基本数据类型:数值类型。首先,我们会详细介绍Python语言各种数值类型以及相应的算术运算和它们的优先级、结合性。然后,我们还会对整型的位运算做深入的解释。一、数值类型Python语言的数值类型有四种,分别是:整型、长整型、浮点型和复数类型。下面我们首先介绍整型数据。1.整型Python语言的整型相当于C语言中的long型,在32位机器上,整型的位宽为32位,取值范围为-231~231-1,即-2147483648~2147483647;在64位系统上,整型的位宽通常为64位,取值范围为-263~263-1,即-9223372036854775808~9223372036854775807。Python中的整数不仅可以用十进制表示,也可以用八进制和十六进制表示。当用八进制表示整数时,数值前面要加上一个前缀“0”;当用十六进制表示整数时,数字前面要加上前缀0X或0x。例如,我们这里将整数15分别以八进制和十六进制的形式赋给整型变量a和b,然后再以十进制的形式输出它们:#-*-coding:cp936-*-a=017b=0xfprint'变量a的值的十进制形式为%d'%aprint'变量b的值的十进制形式为%d'%a当我们在IDEL中运行该程序时,结果如下所示:图1:以不同的数制输入、输出整数我们这里对打印语句print'变量a的值的十进制形式为%d'%a做一个简单的解释。这个语句的含义是将变量a以有符号整数的形式输出。这里的百分号%是Python语言中的格式化运算符,它可以在字符串中插入一个变量值。格式化运算符左边是一个字符串,即下面用蓝色字体表示的部分:print'变量a的值的十进制形式为%d'%a格式化运算符左边的字符串中可以含有一个或多个转换指示符,本例中只有一个转换指示符,即%d。就像这里看到的一样,转换指示符通常以百分号打头,后面紧跟一个字符串格式化字符,需要注意的是,转换指示符中的百分号是作为字符串格式化字符的前导符使用,而非格式化运算符。字符串格式化字符d表示将在当前字符串的指定位置放上一个整数。打印输出时,字符串中的转换指示符将被指定的值替换掉,所以转换指示符还起到占位符的作用。格式化运算符的右边,即上面用红色字体表示的部分,规定用谁来替换字符串中的占位符。就本例而言,我们要用变量a来替换字符串中的占位符%d。与数值有关的字符串格式化字符及其作用如下所示:d:有符号十进制整数u:无符号十进制整数o:无符号八进制整数x:无符号十六进制整数,a~f采用小写形式X:无符号十六进制整数,A~F采用大写形式f:浮点数e,E:浮点数,使用科学计数法g,G:浮点数,使用最低有效数位2.长整型跟C语言不同,Python的长整型没有指定位宽,也就是说Python没有限制长整型数值的大小,但是实际上由于机器内存有限,所以我们使用的长整型数值不可能无限大。在使用过程中,我们如何区分长整型和整型数值呢?通常的做法是在数字尾部加上一个大写字母L或小写字母l以表示该整数是长整型的,例如:a=6812347598Lb=6812347598l读者可能已经发现,小写字母l和数字1看上去很难区分,所以一般推荐使用大写字母L。注意,自从Python2.2起,如果发生溢出,Python会自动将整型数据转换为长整型,所以如今在长整型数据后面不加字母L也不会导致严重后果了。3.浮点型浮点型用来处理实数,即带有小数的数字。Python的浮点型相当于C语言的双精度浮点型。实数有两种表示形式,一种是十进制数形式,它由数字和小数点组成,并且这里的小数点是不可或缺的,如1.23,123.0,0.0等;另一种是指数形式,比如789e3或789E3表示的都是789×103,字母e(或E)之前必须有数字,字母e(或E)之后可以有正负号,表示指数的符号,如果没有则表示正号;此外,指数必须为整数。4.复数类型复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。注意,虚数部分的字母j大小写都可以,如5.6+3.1j,5.6+3.1J是等价的。对于复数类型变量n,我们还可以用n.real来提取其实数部分,用n.imag来提取其虚数部分,用n.conjugate返回复数n的共轭复数,如下图所示:图2:获取复数的实数部分、虚数部分和共轭复数循序渐进学Python之数值类型(一)(2)二、算术运算符对于数值型数据,常见的算术运算有加法、减法、乘法、除法,以及求幂和取模等,这些运算所对应的运算符分别为:加法运算符:+,例如代数表达式2+3的Python表达式为2+3;减法运算符:-,例如代数表达式2-3的Python表达式为2-3;乘法运算符:*,例如代数表达式2×3的Python表达式为2*3;除法运算符:/和//,例如代数表达式2÷3的Python表达式为2/3或2//3;求幂运算符:**,例如代数表达式23的Python表达式为2**3;取模运算符:%,例如代数表达式2mod3的Python表达式为2%3;在早期的版本中,Python只有一个除法运算符即/,该运算符既用于整除法,又用于真除法,这由参与运算的操作数的类型决定。具体而言,如果操作数皆为整数,那么就进行整除法运算,即两数相除后之后,只取其商的整数部分,并丢弃小数部分,不进行进位处理;此外,如果操作数中只要有一个为浮点数,那么就进行真除法运算,即得到的结果是一个精确的浮点数,包括小数点之后的数字。从Python2.2开始,除法运算符除了/之外,又引入了一个除法运算符://,后一种运算符只用于进行整除法。对于除法运算符/,默认时的行为跟Python2.2之前的一样,它视操作数而定,既可以进行整除,也可以进行真除法。如果想让这两个运算符有一个明确的分工,即/只用于真除法,而//仅用于整除法的话,需要作以下声明:from__future__importdivision下图显示了两种除法运算符在作以上声明前后的区别:图3:两种除法运算符的用法举例如上图所示,在声明之前,对表达式2/3进行计算时,结果为0,这是因为参加运算的两个操作数都是整数,所以运算符/进行的是整除法,但是表达式2.0/3的结果却是0.66666666666666663,这是因为操作数中的2.0是浮点数,所以运算符/进行的是真除法。表达式2//3和2.0//3进行求值时,进行的都是整除法,只不过返回值一个是整型,一个是浮点型而已。当我们用import语句进行相应的声明后,除法运算符/只能用于真除法,所以此时2/3和2.0//3的返回值都是0.66666666666666663。循序渐进学Python之数值类型(一)(3)三、不同数值型数据间的混合运算在Python中,不同的数值型数据是可以混合运算的,如下面以交互方式在整型、浮点型、复数型的数据进行运算:图4:不同数值型数据间的混合运算我们发现,上图中得到的结果是一个复数,这是因为在不同数值型数据间进行混合运算时,不同类型的数据会首先转换成同一类型,然后进行运算。转换的过程是,如果两个数字的类型不同,首先检查是否可以把一个数字转换为另一个数字的类型。如果可以的话,则进行转换,结果返回两个数字,其中一个是经过类型转换得到的。注意,转换时不同的类型之间的转换必须遵守一定转换方向,如不可以把一个浮点数转换为一个整数,也不能把一个复数转换为其它数值类型。正确的转换方向是,整数向长整数转换,长整数向浮点数转换,非复数向复数转换。由于算术运算符是双目运算符,即有两个操作数参加运算,当参加运算的两个操作数的类型不一致时,具体转换流程为:如果参加算术运算的两个操作数中有一个是复数,则把另一个也转换为复数;否则,如果两个操作数中有一个是浮点数,则把另一个也换成浮点数;否则,如果两个操作数中有一个是长整数,则把另一个也转换成长整数;否则,这两个操作数肯定都是整数,无需进行转换。下面以一个实例来讲解不同数值型数字运算时进行的类型转换:10+98789L+6.68+(3.3–6J)上式运算过程为:①进行10+98789L的运算,先将整数10转换为长整数10L,计算结果为98799L。②进行98799L+6.68的运算,先将长整数98799L转换为浮点数98799.0,计算结果为98805.679999999993。③进行98805.679999999993+(3.3–6J)的运算,先将浮点数98805.679999999993转化为复数(98805.679999999993+0J),计算结果为(98808.979999999996-6j)。四、算术表达式的求值顺序我们可以用算术运算符和括号将操作数连接起来,以组成算术表达式。这里的操作数可以是常量、变量和函数等。Python语言中,算术表达式的计算顺序是由圆括号、运算符的固定的优先级和结合性决定的,它们的使用规则跟代数中的规定基本一致:首先,计算圆括号中的表达式。所以我们可以根据需要,用圆括号强制按我们指定的顺序进行计算。这是因为,在所有运算符中,圆括号的优先级最高。如果圆括号出现嵌套,那么求值顺序,即圆括号的结合方向或结合性是由内而外计算。然后是求幂运算。如果表达式中出现多个求幂运算,那么就按从右向左的顺序进行求值,换句话说,求幂运算的结合方向是从右向左。然后是乘法、除法和取模运算。如果一个表达式中连续出现多个乘法、除法和取模运算,那么按照从左向右的顺序求值,即它们的结合方向是从左向右。最后进行加法、减法运算。如果连续出现加法、减法运算,则按照从左向右的方向计算,即它们的结合方向是从左到右。总结一下,按照算术运算符的优先级从大到小排列为:圆括号>求幂运算符>乘、除、取模运算符>加、减运算符为了便于记忆,各种算术运算符的结合性总结如下:圆括号的结合性为由内而外,求幂运算符的结合性为从右向左,剩下的算术运算符的结合性都是从左向右。现在举例说明。请看下面的表达式:(((1+1)+2)+3)+4对于嵌套的圆括号,按照它由内而外的结合性,就算顺序为:①计算最里边的圆括号中的1+1,得到计算结果2。②然后计算有内而外的第二个圆括号中的式子2+2,计算结果为4。③然后计算最外围的圆括号中的式子4+3,计算结果为7。④最后计算7+4,得到最终计算结果11。我们再看一下求幂运算符的右结合性,如下所示:2**3**1该表达式的计算顺序为,首先计算3**1,即3的1次方:31,计算结果为3。然后计算2**3,即2的3次方:23,计算结果为8。实际上,上面的表达式等价于:2**(3**1)由此可见,可以在算术表达式中添加额外的圆括号,这样能使我们的代码更加容易阅读和维护。循序渐进学Python之数值类型(一)(1)五、整型数据的位运算Python语言能够对整数进行逐位操作,它支持的运算符及含义如下所示:&:按位与|:按位或^:按位异或~:取反:左移:右移对于整型数据,各种位操作是对该数据的补码进行的;对于长整型数据,由于其位宽不定,所以进行位运算时,认为其补码的符号位向外无限扩展。下面对各运算符进行举例说明:图5:位运算举例我们先说明取反运算。前面说过,Python的整型数据的位宽是32位,所以1的补码为00000000000000000000000000000001,我们进行取反运算后,变为11111111111111111111111111111110,这正好是-2的补码。对于按位与,就是对参加运算的两个整数的补码逐位进行逻辑与运算,即参加运算的两个运算量,如果两个相应位都为1,则该位的结果为1,否则为0。3&2的二进制补码形式为00000011&00000010(我们这里只显示它们的最低字节,因为前面的三个字

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功