skip to content
Logo Lostman_Wang的小站

Python数据类型-基础数据类型-Number 数字、bool 布尔、complex 复数

一、数字类型---int,float,complex

1、内置类型 int

1.1、基本语法

int(x=0, base=10)
  • x:要转换为整数的对象(字符串、数字等)。
  • base:可选参数,表示进制(默认为10),范围是 2 ≤ base ≤ 36。

1.2、构造方法详解

(1) 从整数构造
  • 如果 x 已经是整数,直接返回其值:
# 无实际转换,直接返回原值。
a = int(42) # 42
b = int(-7) # -7
(2) 从浮点数构造
  • 截取浮点数的整数部分(向下取整,非四舍五入):
a = int(3.14) # 3
b = int(-2.9) # -2
c = int(5.99) # 5
(3) 从字符串构造

字符串可以是十进制或其他进制的数字表示,需符合 base 的规则。

  • 十进制字符串(默认 base=10):
a = int("123") # 123
b = int("-456") # -456
  • 二进制base=2):
int("1010", 2) # 10
  • 八进制base=8):
int("12", 8) # 10
  • 十六进制base=16):
int("FF", 16) # 255
int("0xFF", 16) # 255(0x前缀可选)
  • 三十六进制base=36):
int("ZZ", 36) # 1295

前缀自动识别base=0):如果 base=0,字符串的前缀会被自动解析

  • 0b0B → 二进制
  • 0o0O → 八进制
  • 0x0X → 十六进制
  • 无前缀 → 十进制
int("0b1010", 0) # 10
int("0o12", 0) # 10
int("0xFF", 0) # 255
int("123", 0) # 123

无效字符串会报错

int("12.3") # ValueError: invalid literal for int()
int("abc") # ValueError: invalid literal for int()
(4) 从布尔值构造
  • 布尔值 TrueFalse 分别对应 1 和 0:
int(True) # 1
int(False) # 0
(5) 从其他类型构造

任何定义了 __int__()__index__() 方法的对象均可被转换:

  • __int__()(旧方法,已不推荐):
class MyNumber:
def __int__(self):
return 42
int(MyNumber()) # 42
  • __index__()(推荐,用于切片、位运算等):
class MyIndex:
def __index__(self):
return 100
int(MyIndex()) # 100

1.3、错误处理

  • 无效输入
int("abc") # ValueError
int("12", base=2) # ValueError("12" 不是合法二进制)
  • 超出进制范围
int("9", base=8) # ValueError(8进制无数字9)

1.4、进制转换

  • int() 转成十进制:int 可以将数字字符串和 Number 类型的值转成整数
# 转成十进制
print(0b101)
print(0o777)
print(0xBBB)
print(int(0b101))
print(int(0o777))
print(int(0xBBB))
print(int("-123"))
print(int(1.1))
print(int(1.9))
# 输出结果
5
511
3003
5
511
3003
-123
1
1
  • bin() 其他进制数转二进制
# 转成二进制
print(bin(10)) # 10 转成 2进制
print(bin(0o7)) # 7 转成 2进制
print(bin(0xA)) # 10 转成 2进制
print(bin(0o27)) # 8*2+7 转成 2进制
print(bin(0x22E)) # 16^2*2+16*2+14 转成 2进制
# 输出结果
0b1010
0b111
0b1010
0b10111
0b1000101110
  • oct() 其他进制转成八进制
# 转成八进制
print(oct(110))
print(oct(0b100))
print(oct(0xAAA))
# 输出结果
0o156
0o4
0o5252
  • hex() 其他进制转成十六进制
# 转成十六进制
print(hex(110))
print(hex(0b100))
print(hex(0o777))
# 输出结果
0x6e
0x4
0x1ff

2、内置类型 float

2.1、基本语法

float(x=0.0)
  • 仅有一个位置参数 x,可以是数字、字符串、实现了 __float__() 的对象,或干脆不传(返回 0.0)。
  • 没有 base 参数;进制转换只能先转成整数再除以幂次,或借助 decimal / fractions。

2.2、按输入来源分类

(1) 从整数构造
float(0) # 0.0
float(-42) # -42.0
  • 任意大小的 int 都能转换(Python 的 int 是无限精度),但最终会被截断到 53 bit 有效数字。
(2) 从浮点数构造
float(3.14) # 3.14 (idempotent)
  • 如果 x 已经是 float,直接返回同一对象(CPython 实现下的 C 级优化)。
(3) 从字符串构造
  • 十进制:支持科学计数法、正负号、前导 / 尾随空格、下划线(PEP 515)
float(" 12_34.5_6 ") # 1234.56
float("-1.75e-3") # -0.00175
float("inf") # inf
  • 十六进制浮点(PEP 754 / C99 风格):
float("0x1.921fb5p+1") # 3.1415927 ≈ π
  • NaN 字符串变体
float("nan") # nan
float("NAN") # nan
float("+NaN") # nan
  • 非法格式ValueError
float("12,34") # ValueError: could not convert string to float
float("0x10") # 16 进制整数字符串无法直接解析
(4) 从布尔值构造
float(True) # 1.0
float(False) # 0.0
(5) 从 DecimalFraction 构造
  • decimal.Decimal → 精确到二进制浮点的最近可表示值:
from decimal import Decimal
float(Decimal("0.1")) # 0.1(但二进制近似)
  • fractions.Fraction → 同样先转成有理数再近似:
from fractions import Fraction
float(Fraction(1, 10)) # 0.1
(6) 从实现了 __float__() 的自定义对象
class Percent:
def __init__(self, v): self.v = v
def __float__(self):
return float(self.v / 100)
float(Percent(75)) # 0.75

2.3、特殊值与边界行为

字面量 / 字符串Python 结果注解
float("inf") / float("INF")math.inf正无穷
float("-Infinity")-math.inf负无穷
float("nan") / float("NAN")math.nanNot-a-Number
溢出整数自动转为 inffloat(10**400)inf
下溢整数自动转为 0.0float(10**-400)0.0

2.4、错误与异常

触发场景异常类型示例
非法字符串ValueErrorfloat("1.2.3")
非字符串且无 __float__TypeErrorfloat([1, 2])
复合对象缺方法TypeErrorfloat(object())

2.5、常见精度与比较陷阱

  • 无法精确表示的十进制小数
>>> 0.1 + 0.2 == 0.3
False
>>> format(0.1 + 0.2, '.17f')
'0.30000000000000004'
  • 推荐比较方法:使用 Decimal 或 fractions.Fraction 做金融运算。

3、complex:“实部+虚部”的复数类型,写作 a + bj(j 表示虚数单位),支持加减乘除、共轭、模等运算

4、所有数字类型(复数除外)都支持下列运算

运算结果备注完整文档
x + yx 和 y 的和
x - yx 和 y 的差
x * yx 和 y 的乘积
x / yx 和 y 的商
x // yx 和 y 的商数(1)(2)
x % yx / y 的余数(2)
-xx 取反
+xx 不变
abs(x)x 的绝对值或大小abs()
int(x)将 x 转换为整数(3)(6)int()
float(x)将 x 转换为浮点数(4)(6)float()
complex(re, im)一个带有实部 re 和虚部 im 的复数;im 默认为 0(6)complex()
c.conjugate()复数 c 的共轭
divmod(x, y)(x // y, x % y)(2)divmod()
pow(x, y)x 的 y 次幂(5)pow()
x ** yx 的 y 次幂(5)

4.1、/(普通除法,浮点除法)

  • / 运算符进行的是普通除法,结果总是浮点数(即使是整数除法,也会返回浮动的结果)。
a = 7
b = 3
result = a / b # 结果是浮点数
print(result) # 输出 2.3333333333333335

4.2、//(地板除法,整数除法)

  • // 运算符进行的是地板除法(又称整数除法),返回商的整数部分,向下取整。即使操作数是浮点数,结果也会是整数(或接近整数的浮动值,取决于类型)。
a = 7
b = 3
result = a // b # 结果是整数
print(result) # 输出 2
#如果涉及浮点数运算,// 也会返回向下取整后的浮动值:
a = 7.5
b = 3
result = a // b # 结果是浮点数
print(result) # 输出 2.0

5、所有numbers.Real 类型 (int 和float) 还包括下列运算:

运算结果
math.trunc(x)x 截断为 Integral
round(x[, n])x 舍入到 n 位小数,半数值会舍入到偶数;若省略 n,默认为 0
math.floor(x)≤ x 的最大 Integral
math.ceil(x)≥ x 的最小 Integral
import math
# 1) 正数截断 vs 四舍六入
>>> math.trunc(3.9), round(3.9)
(3, 4)
# 2) 负数截断 vs 四舍六入
>>> math.trunc(-3.9), round(-3.9)
(-3, -4)
# 3) 五留双(偶数优先)
>>> round(2.5), round(3.5) # 2 是偶数 → 2;4 是偶数 → 4
(2, 4)
# 4) 指定小数位
>>> math.trunc(3.1415926 * 100) / 100 # 手动保留 2 位小数 → 截断
3.14
>>> round(3.1415926, 2) # 四舍六入到 2 位
3.14
math.floor(3.7) # 3
math.ceil(3.2) # 4

二、布尔类型---bool

1、代表真值的布尔对象,bool 类型只有两个常量实例: True 和 False。

2、内置函数bool() 可将任意值转换为布尔值,如果该值可以被解读为逻辑值的话。

3、转换

# 练习题:查看一些变量为True还是False
v1 = bool(0)
v2 = bool(-10)
v3 = bool(10)
v4 = bool("汪浩")
v5 = bool("")
v6 = bool(" ")
v7 = bool([]) # [] 表示空列表
v8 = bool([112233]) # [11,22,33] 表示非空列表
v9 = bool({}) # {} 表示空字典
v10 = bool({"name":"汪浩","age":18}) # {"name":"汪浩","age":18} 表示非空字典