Python数值类型全解析:整数、浮点、复数与集合
本文深入解析Python中的核心数值类型,涵盖整数精度、浮点数IEEE754标准、复数运算及布尔类型。详细讲解除法运算符/与//的行为差异、进制转换方法、位操作逻辑,以及集合对不可变对象的要求。通过代码示例阐明混合类型计算规则与类型转换机制,帮助开发者掌握Python数据处理基础。
一、整数
在Python 2中,整型分为普通整型和长整型,而在Python 3中,这两种类型已合并为统一的整型(int)。Python的整型支持无限精度,理论上仅受限于可用内存大小,因此可以表示任意位数的数字。例如:
>>> 1111_2222_3333_4444_5555_6666_7777_8888_9999_0000 1111222233334444555566667777888899990000
Python的一个人性化设计是支持在数字字面量中使用下划线进行分隔,每四位一组,使长数字更易读。这种格式类似于某些地区习惯的三位分隔法,旨在提升代码的可读性。
>>> 123_456_789 123456789 >>>
二、浮点数
CPython的标准实现基于C语言的双精度类型(double),每个浮点数占用8字节。更重要的是,Python遵循IEEE 754标准进行浮点运算。例如:
>>> 1.234 1.234 >>> 1.23412313131231233 1.2341231313123124 >>> 1.231123E100 1.231123e+100
浮点数支持科学计数法表示法。
三、复数
Python内置了复数类型,这在处理坐标系统、复变函数或积分变换计算时提供了极大便利。尽管数值计算通常推荐使用NumPy库,但Python仍支持直接初始化复数,例如通过类似1+1j的语法,或使用内置函数complex(real, imag)。例如:
>>> a = 1+2j >>> a (1+2j) >>> type(a) <class 'complex'> >>> b = complex(2,2) >>> b (2+2j) >>>
Python同样提供了复数的基本算术运算支持,例如:
>>> b + a (3+4j) >>> a - b (-1+0j) >>> a * b (-2+6j) >>> a / b (0.75+0.25j) >>>
四、运算符,优先级以及结合性
每种编程语言都支持特定的运算符,且运算符之间存在优先级和结合性。虽然无需死记所有运算符的优先级关系,但在编写复杂表达式时,建议多使用括号()来明确表达式的精确含义。例如:
>>> x = 1 >>> y = 2 >>> not x and y or y > x != 1 False
此类表达式过于复杂,逻辑难以直观理解。实际上,预期的意图可能是:
>>> ((not x) and y) or (y > (x != 1)) True
此时运算结果将截然不同。因此,除非必要,应避免编写复杂的表达式;若必须使用,请务必添加括号以明确表达意图。
五、混合类型计算
混合类型的计算结果会自动向更复杂的类型转换。例如:
>>> num = 1 + 2.3 >>> type(num) <class 'float'> >>> num = 1 + (2 + 3j) >>> type(num) <class 'complex'>
六、除法
在Python 3中,除法分为真除法和取整除法两种。鉴于Python 2已停止维护,本系列内容仅针对Python 3。 /: 在Python 3中,/运算符始终执行真除法,无论操作数类型如何,结果均包含小数部分。 //: 执行向下取整除法。若操作数均为整数,结果为整数;若任一操作数为浮点数,结果为浮点数。 请仔细观察以下示例:
>>> 3 / 2 1.5 >>> 3.0 / 2 1.5 >>> 3 // 2 1 >>> 3.0 // 2 1.0
尽管此类表达式较少见,但需注意其结果仍遵循先执行向下取整除法,再处理小数部分的逻辑。以下示例进一步证实了这一点。
>>> -2.9 // 1 -3.0 >>> -2.1 // 1 -3.0
七、十进制,八进制,十六进制和二进制
Python默认字面量为十进制,也可通过以下方式生成其他进制的字面值:
>>> 0o12 # 8进制 10 >>> 0xA # 16进制 10 >>> 0b10 # 2进制 2
这些字面值均以0开头,后跟表示进制的字母:8进制用o(大小写均可),16进制用x,2进制用b,随后跟随数值部分。Python还提供了相应的函数进行进制间的相互转换。
>>> a = 3
>>> oct(a) # 转成8进制字符串
'0o3'
>>> hex(a) # 转成16进制字符串
'0x3'
>>> bin(a) # 转成2进制字符串
'0b11'
>>> int('0b10',2) # 将2进制转为10进制
2
>>> int('0xa',16) # 将16进制 转为10进制
10
>>> int('0o12',8) # 将8进制 转为10进制
10
int()函数(实为类构造器)用于将字符串或数字转换为整型。其用法如下:
int(x, base=10)
其中x为数值字符串,base指定该字符串的进制,默认值为10。 Python中还存在另一个函数eval(),它将字符串作为Python代码执行,效果如下:
>>> eval('0o12')
10
>>> eval('0xa')
10
>>> eval('0b10')
2
该函数运行速度较慢,因为它会将字符串编译为代码片段执行,因此使用时存在较大的安全风险。
八、位操作
Python支持C语言的位操作,尽管大多数场景下并不常用。下表列出了位操作运算符:
| 位运算符 | 功能 |
| << | 按位左移 |
| >> | 按位右移 |
| | | 按位或 |
| & | 按位与 |
| ^ | 按位异或 |
| ~ | 按位取反 |
值得注意的是,按位左移N位相当于原数字乘以2的N次方,按位右移N位相当于原数字除以2的N次方。在Python中,位运算几乎很少被使用。
九、集合
Python中的集合(set)属于数值类型,提供了基础集合论的功能,满足确定性、互异性和无序性。需特别注意,集合仅包含不可变对象(即可哈希对象),列表和字典不能嵌入其中,但元组可以。集合本身是可变对象。关于集合运算可参考集合论相关知识。 以下示例展示集合元素必须为不可变对象,但集合本身可变。
>>> a.add(1)
>>> a
{1}
>>> a.add("123")
>>> a
{'123', 1}
>>> b = 1,2
>>> a.add(b)
>>> a
{'123', 1, (1, 2)}
向集合中添加数字、字符串、元组等不可变对象没有问题。下面查看添加可变对象时的情况。
>>> c = [1,2,3]
>>> a.add(c)
Traceback (most recent call last) :
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> d = {'1':1,'2':2}
>>> a.add(d)
Traceback (most recent call last) :
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> e = set()
>>> a.add(e)
Traceback (most recent call last) :
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
可见,无论是list、dict还是set,添加时均会提示类型错误,因为它们是不可哈希类型。
十、布尔类型
Python提供了显式的布尔类型,True和False是两个预置的布尔值。实际上,True和False是bool类的两个实例,而bool是内置类型int的子类。True和False的行为与1、0一致。bool类重新定义了str和repr的字符串格式,因此打印时显示为True和False,而非1和0。 有趣的是,Python仅定义了1和0两种情况下的显示规则,未定义其他值的显示。因此显示时会出现以下情况。
>>> True + 1 2
十一、其他数值类型
小数(Decimal)和分数(Fraction)类型需导入模块创建,此处不作过多介绍。与浮点数相比,它们是精确的。尤其在需要高精度计算时,这十分必要,但在大多数常规场合下,通常不需要使用它们。
>>> from decimal import Decimal
>>> a = Decimal('0.1')
>>> a
Decimal('0.1')
>>> from fractions import Fraction
>>> b = Fraction(1,3) # 1是分子,3是分母
>>> b
Fraction(1, 3)
至此,关于Python基础数值类型的详解介绍完毕。如需了解更多Python数值类型内容,请搜索本站往期文章或继续浏览相关文章,希望大家今后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













