本文将介绍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 = 017
b = 0xf
print '变量a的值的十进制形式为%d' %a
print '变量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 = 6812347598L
b = 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:获取复数的实数部分、虚数部分和共轭复数 |
二、算术运算符
对于数值型数据,常见的算术运算有加法、减法、乘法、除法,以及求幂和取模等,这些运算所对应的运算符分别为:
? 加法运算符:+,例如代数表达式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__ import division
|
下图显示了两种除法运算符在作以上声明前后的区别:
|
图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中,不同的数值型数据是可以混合运算的,如下面以交互方式在整型、浮点型、复数型的数据进行运算:
|
图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。②然后计算有内而外的第二个圆括号中的式子2+2,计算结果为4。③然后计算最外围的圆括号中的式子4+3,计算结果为7。④最后计算7+4,得到最终计算结果11。
我们再看一下求幂运算符的右结合性,如下所示:
该表达式的计算顺序为,首先计算3**1,即3的1次方:31,计算结果为3。然后计算2**3,即2的3次方:23,计算结果为8。实际上,上面的表达式等价于:
由此可见,可以在算术表达式中添加额外的圆括号,这样能使我们的代码更加容易阅读和维护。
五、整型数据的位运算
Python语言能够对整数进行逐位操作,它支持的运算符及含义如下所示:
? &:按位与
? |:按位或
? ^:按位异或
? ~:取反
? <<:左移
? >>:右移
对于整型数据,各种位操作是对该数据的补码进行的;对于长整型数据,由于其位宽不定,所以进行位运算时,认为其补码的符号位向外无限扩展。下面对各运算符进行举例说明:
|
图5:位运算举例 |
我们先说明取反运算。前面说过,Python的整型数据的位宽是32位,所以1的补码为00000000 00000000 00000000 00000001,我们进行取反运算后,变为11111111 11111111 11111111 11111110,这正好是-2的补码。
对于按位与,就是对参加运算的两个整数的补码逐位进行逻辑与运算,即参加运算的两个运算量,如果两个相应位都为1,则该位的结果为1,否则为0。3&2的二进制补码形式为00000011&00000010(我们这里只显示它们的最低字节,因为前面的三个字节都是0),所以结果为00000010(前三个字节中的各个位都是0,所以逻辑与后还是0,在此略过),正好是十进制数2的补码。注意,正整数的补码跟原码一致。
对于按位或,就是对参加运算的两个数字的补码逐位进行逻辑或运算,即参加运算的两个运算量,只要两个相应位中有一个为1,那么该位的结果为1;只有两个相应位都为0时,该位的结果才为0。所以3 | 2的二进制补码形式为00000011 | 00000010(我们这里只显示它们的最低字节,因为前面的三个字节都是0),所以结果为00000011(前三个字节中的各个位都是0,所以逻辑与后还是0,在此略过),正好是十进制数3的补码。注意,逻辑或是不进位的,许多初学者觉得结果应该是5,这是错误地当成算术加法了。
对于按位异或,就是对参加运算的两个数字的补码逐位进行逻辑异或运算,即参加运算的两个运算量,如果两个相应位相同,那么该位的结果为0;如果两个相应位不同即相异,那么该位的结果为1。所以3 ^ 2的二进制补码形式为00000011 ^ 00000010(我们这里只显示它们的最低字节,因为前面的三个字节都是0),所以结果为00000001,正好是十进制数1的补码。
对于左移运算,就是将一个数的二进制位整体向左移若干位,移位后在低位补零,高位溢出部分舍弃。所以1<<2就是把整数1的二进制补码00000000 00000000 00000000 00000001整体左移2位,舍弃溢出的高位并在低位补零后得到结果00000000 00000000 00000000 00000100,正好是十进制数4即22的补码。实际上,将一个数左移几位,就相当于将这个数乘以2的几次幂。
对于右移运算,就是将一个数的二进制位整体向右移若干位,如果该数为正数,移位后的低位溢出部丢弃,高位补零;如果该数为负数,则移位后的低位溢出部丢弃,高位补1,以保持符号不变。所以4>>2就是把正整数4的二进制补码00000000 00000000 00000000 00000100整体右移2位,舍弃溢出的低位并在高位补零后得到结果00000000 00000000 00000000 00000001,正好是十进制数1即20的补码。实际上,将一个数右移几位,就相当于将这个数除以2的几次幂。
在优先级方面,取反运算符~跟算术运算符中的单目运算符(即只有一个操作数参加运算)同级,并且是所有位运算符中优先级最高的;然后是移位运算符(左移<<和右移>>),它们比取反运算符和算术运算中的加减运算符低;最后是逐位与、或和异或运算符。各位运算符按照优先级有高到低排列如下所示:
取反运算符 > 左移运算符 > 右移运算符 > 按位与运算符 > 按位异或运算符 > 按位或运算符
在位运算符中,取反运算符(单目运算符)~的结合性是从右向左结合,其余双目运算符的结合性是从左向右结合。这里以左移和右移运算符为例进行演示,如下图所示:
|
图6:位运算的优先级和结合性举例 |
当然,读者也可以像图中所示的那样,通过使用加括号的方法对其他的位运算符的优先级和结合性进行试验。
六、小结
本文详细介绍了Python语言各种数值类型以及相应的算术运算和它们的优先级、结合性。最后,我们又对整型的位运算做了深入的解释。在本文的续篇中,我们将为读者介绍与数值类型有关的内建函数和程序库。
分享到:
相关推荐
`python-currencies`库的核心功能在于其货币格式化,它支持多种货币类型,如美元(USD)、欧元(EUR)和人民币(CNY)等,并能根据地区的不同货币格式进行调整。例如,你可以轻松地将数字转换为具有适当货币符号的...
在Windows操作系统上,特别是64位系统,Python-2.7.18.amd64.msi是专门为64位处理器设计的安装包,AMD64代表Advanced Micro Devices的64位架构,但同样适用于Intel的64位芯片。 Python 2.7.18的关键特性包括: 1. *...
- 变量与数据类型:Python支持整型、浮点型、字符串、布尔型等多种数据类型,以及列表、元组、字典和集合等复合类型。 - 注释与代码格式:Python使用#进行单行注释,多行注释可以使用三引号包裹。Python代码注重...
这份"python-cheat-sheet-basic.pdf"是一个Python基础知识的速查表,涵盖了读取文件、字符串操作、数值类型与数学运算以及列表操作等多个核心概念。 首先,文件操作在Python中是通过内置的`open()`函数实现的。例如...
- **类型错误**:注意Python中的类型系统,避免常见的类型错误。 - **异常处理**:正确处理异常可以提高代码健壮性。 - **性能问题**:关注代码执行效率,避免不必要的计算开销。 **2.7 许可证选择** - **考虑因素...
- 变量:Python中无需预先声明变量类型,变量赋值后自动确定类型。 - 数据类型:包括整型(int)、浮点型(float)、字符串(str)、布尔型(bool)、列表(list)、元组(tuple)、字典(dict)和集合(set)等。...
- 变量与数据类型:Python 支持整型(int)、浮点型(float)、字符串(str)、布尔型(bool)等基本类型,以及列表(list)、元组(tuple)、字典(dict)和集合(set)等复合类型。 - 控制结构:包括条件语句...
它采用数据流图模型,支持分布式计算,并提供了丰富的数学操作符和高级功能,如自动微分,用于优化模型参数。 **TensorRec框架特性** 1. **易于使用**:TensorRec的API设计简洁明了,允许快速搭建推荐模型,同时...
2. **数值计算**:Theano 支持高效的数值计算,包括矩阵运算和向量操作,适用于神经网络模型的构建。 3. **GPU 支持**:Theano 能够利用 GPU 进行大规模并行计算,这对于处理大量的数据和复杂的模型尤其有用。 4. **...
1. **Python基础知识**:变量、数据类型、操作符、流程控制(条件语句和循环)、函数、模块导入。 2. **Jupyter Notebook使用**:创建和运行代码单元格,使用Markdown编写文档,插入图表和图像。 3. **数学概念**:...
1. **赋值表达式(Walrus Operator)**: 新引入的`:=`操作符,允许在条件语句或表达式中直接赋值,减少了代码的行数和复杂性。 2. **类型注解改进**: Python 3.8增强了类型提示的功能,支持函数和类的类型注解,有...
- **按位与(&)、按位或(|)、按位异或(^):**用于按位操作。 #### 四、总结 Python作为一种广泛使用的编程语言,其设计简洁、功能强大且易于学习。通过了解上述基本概念和运算符,你可以开始编写自己的Python程序...
首先,了解Python基础是必要的,包括数据类型、控制结构、函数和类等概念。Python以其简洁的语法和丰富的库支持,成为科学计算和数据分析的理想选择。在机器学习领域,NumPy库用于处理多维数组,Pandas用于数据清洗...
### Python中的List操作详解 #### 一、列表(List)简介 列表是Python中最常用的数据结构之一,它是一种可变序列,可以存储不同类型的...掌握列表的各种方法和操作符可以帮助提高编程效率,同时使代码更加简洁和易读。
1. **walrus** 操作符(:=):这是Python 3.8新增的一项语法特性,允许在条件表达式中赋值,提高了代码的可读性和简洁性。 2. **位置只有参数**(Positional-Only Parameters):在函数定义中,可以限制某些参数只能...
在Python编程语言中,TensorFlow是一个强大的开源库,专门用于数值计算和大规模机器学习任务。这个"python-TensorFlow机器学习-材料"压缩包显然包含了关于如何使用Python和TensorFlow进行机器学习的教程、示例代码...
9. 条件语句:`a > 'b' or 'c'`,`a > 'b'`为`False`,由于`or`操作符,后面的`'c'`会被转化为布尔值`True`,因此整个表达式的结果是`True`。 10. 元组定义:元组的定义可以是空元组`()`或包含元素的元组,如`(1,)`...
Python 是一种高级编程语言,它的基本类型构成了编程的基础。这些基本类型包括整型(int)、浮点型(float)、字符串(string)...熟悉这些基本类型及其操作,能帮助程序员更好地理解和编写Python代码,提高编程效率。
最后,Python 3.3.7还改进了PEP 465,即矩阵乘法操作符(@),这使得处理数值计算和科学计算的代码更加简洁和直观。 综上所述,Python 3.3.7是一个在性能、内存管理、语言特性和标准库方面都有所进步的版本。对于...
在Python的世界里,`format`函数替代了早期版本中的`%`操作符,提供了更丰富的功能和更清晰的语法。这个"python-format.rar"压缩包可能包含了一个名为"FormatList.exe"的执行文件,这可能是一个用于演示或辅助处理`...