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) # 42b = int(-7) # -7(2) 从浮点数构造
- 截取浮点数的整数部分(向下取整,非四舍五入):
a = int(3.14) # 3b = int(-2.9) # -2c = int(5.99) # 5(3) 从字符串构造
字符串可以是十进制或其他进制的数字表示,需符合 base 的规则。
- 十进制字符串(默认
base=10):
a = int("123") # 123b = int("-456") # -456- 二进制(
base=2):
int("1010", 2) # 10- 八进制(
base=8):
int("12", 8) # 10- 十六进制(
base=16):
int("FF", 16) # 255int("0xFF", 16) # 255(0x前缀可选)- 三十六进制(
base=36):
int("ZZ", 36) # 1295前缀自动识别(base=0):如果 base=0,字符串的前缀会被自动解析
0b或0B→ 二进制0o或0O→ 八进制0x或0X→ 十六进制- 无前缀 → 十进制
int("0b1010", 0) # 10int("0o12", 0) # 10int("0xFF", 0) # 255int("123", 0) # 123无效字符串会报错:
int("12.3") # ValueError: invalid literal for int()int("abc") # ValueError: invalid literal for int()(4) 从布尔值构造
- 布尔值
True和False分别对应 1 和 0:
int(True) # 1int(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()) # 1001.3、错误处理
- 无效输入:
int("abc") # ValueErrorint("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))
# 输出结果5511300355113003-12311- 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进制
# 输出结果0b10100b1110b10100b101110b1000101110- oct() 其他进制转成八进制
# 转成八进制print(oct(110))print(oct(0b100))print(oct(0xAAA))
# 输出结果0o1560o40o5252- hex() 其他进制转成十六进制
# 转成十六进制print(hex(110))print(hex(0b100))print(hex(0o777))
# 输出结果0x6e0x40x1ff2、内置类型 float
2.1、基本语法
float(x=0.0)- 仅有一个位置参数 x,可以是数字、字符串、实现了 __float__() 的对象,或干脆不传(返回 0.0)。
- 没有 base 参数;进制转换只能先转成整数再除以幂次,或借助 decimal / fractions。
2.2、按输入来源分类
(1) 从整数构造
float(0) # 0.0float(-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.56float("-1.75e-3") # -0.00175float("inf") # inf- 十六进制浮点(PEP 754 / C99 风格):
float("0x1.921fb5p+1") # 3.1415927 ≈ π- NaN 字符串变体:
float("nan") # nanfloat("NAN") # nanfloat("+NaN") # nan- 非法格式 →
ValueError
float("12,34") # ValueError: could not convert string to floatfloat("0x10") # 16 进制整数字符串无法直接解析(4) 从布尔值构造
float(True) # 1.0float(False) # 0.0(5) 从 Decimal、Fraction 构造
decimal.Decimal→ 精确到二进制浮点的最近可表示值:
from decimal import Decimalfloat(Decimal("0.1")) # 0.1(但二进制近似)fractions.Fraction→ 同样先转成有理数再近似:
from fractions import Fractionfloat(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.752.3、特殊值与边界行为
| 字面量 / 字符串 | Python 结果 | 注解 |
|---|---|---|
float("inf") / float("INF") | math.inf | 正无穷 |
float("-Infinity") | -math.inf | 负无穷 |
float("nan") / float("NAN") | math.nan | Not-a-Number |
| 溢出整数 | 自动转为 inf | float(10**400) → inf |
| 下溢整数 | 自动转为 0.0 | float(10**-400) → 0.0 |
2.4、错误与异常
| 触发场景 | 异常类型 | 示例 |
|---|---|---|
| 非法字符串 | ValueError | float("1.2.3") |
非字符串且无 __float__ | TypeError | float([1, 2]) |
| 复合对象缺方法 | TypeError | float(object()) |
2.5、常见精度与比较陷阱
- 无法精确表示的十进制小数
>>> 0.1 + 0.2 == 0.3False>>> format(0.1 + 0.2, '.17f')'0.30000000000000004'- 推荐比较方法:使用 Decimal 或 fractions.Fraction 做金融运算。
3、complex:“实部+虚部”的复数类型,写作 a + bj(j 表示虚数单位),支持加减乘除、共轭、模等运算
4、所有数字类型(复数除外)都支持下列运算
| 运算 | 结果 | 备注 | 完整文档 |
|---|---|---|---|
| x + y | x 和 y 的和 | — | — |
| x - y | x 和 y 的差 | — | — |
| x * y | x 和 y 的乘积 | — | — |
| x / y | x 和 y 的商 | — | — |
| x // y | x 和 y 的商数 | (1)(2) | — |
| x % y | x / y 的余数 | (2) | — |
| -x | x 取反 | — | — |
| +x | x 不变 | — | — |
| 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 ** y | x 的 y 次幂 | (5) | — |
4.1、/(普通除法,浮点除法)
/运算符进行的是普通除法,结果总是浮点数(即使是整数除法,也会返回浮动的结果)。
a = 7b = 3result = a / b # 结果是浮点数print(result) # 输出 2.33333333333333354.2、//(地板除法,整数除法)
//运算符进行的是地板除法(又称整数除法),返回商的整数部分,向下取整。即使操作数是浮点数,结果也会是整数(或接近整数的浮动值,取决于类型)。
a = 7b = 3result = a // b # 结果是整数print(result) # 输出 2
#如果涉及浮点数运算,// 也会返回向下取整后的浮动值:a = 7.5b = 3result = a // b # 结果是浮点数print(result) # 输出 2.05、所有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) # 3math.ceil(3.2) # 4二、布尔类型---bool
1、代表真值的布尔对象,bool 类型只有两个常量实例: True 和 False。
2、内置函数bool() 可将任意值转换为布尔值,如果该值可以被解读为逻辑值的话。
3、转换
# 练习题:查看一些变量为True还是Falsev1 = bool(0)v2 = bool(-10)v3 = bool(10)v4 = bool("汪浩")v5 = bool("")v6 = bool(" ")v7 = bool([]) # [] 表示空列表v8 = bool([11,22,33]) # [11,22,33] 表示非空列表v9 = bool({}) # {} 表示空字典v10 = bool({"name":"汪浩","age":18}) # {"name":"汪浩","age":18} 表示非空字典