讲解

Python 是强类型语言,几乎不做隐式类型转换:'1' + 1 直接报 TypeError,而不会像 JavaScript 那样拼成 '11'。想让不同类型的值一起运算,必须显式转换。三个内置函数是主力:int() 转整数、float() 转浮点、str() 转字符串。int('42') 得 42,int(' 42 ') 也能容忍首尾空白,但 int('3.14') 会抛 ValueError——小数字符串要先过 float();int(3.99) 则是直接截断得 3,不是四舍五入。

转换失败的规则要心里有数:int('abc')、float('') 都抛 ValueError,处理用户输入时要么先校验,要么用 try/except 兜底(异常一章会细讲)。str() 几乎不会失败,任何对象都能转成字符串;反过来 bool() 也从不失败,它按上一节的真假值规则转换。另外还有 ord() 和 chr() 这对函数在字符和 Unicode 码点之间转换:ord('中') 得 20013,chr(20013) 得 '中'。

容器类型之间也经常互转:list('abc') 把字符串拆成字符列表 ['a', 'b', 'c'],''.join(list) 拼回来;tuple([1, 2]) 列表转元组,list((1, 2)) 元组转列表;dict 可以由键值对列表构造:dict([('a', 1), ('b', 2)])。集合 set([1, 1, 2]) 顺带完成去重。判断一个值的类型用 type(),判断「是不是某类型」的规范写法是 isinstance(x, int),它能正确处理继承关系,比 type(x) == int 更推荐。

示例

# 字符串与数字互转
print(int('42'), float('3.14'), str(100) + '分')
print('容忍空白:', int('   42   '))
print('int 截断小数:', int(3.99), int(-3.99))

# 小数字符串不能直接 int():先过 float
print('曲线救国:', int(float('3.14')))

# 进制转换:int 的第二个参数指定进制
print("int('ff', 16) =", int('ff', 16), ",int('1010', 2) =", int('1010', 2))

# bool() 永不出错
print(bool(''), bool('False'), bool(0), bool([]))

# 字符与码点
print("ord('中') =", ord('中'), ',chr(20013) =', chr(20013))

# 容器互转
chars = list('abc')
print('字符串拆列表:', chars, ',拼回:', ''.join(chars))
print('列表去重:', list(set([1, 1, 2, 2, 3])))
print('键值对造字典:', dict([('语文', 80), ('数学', 90)]))

# 类型判断
value = 42
print(type(value), isinstance(value, int), isinstance(value, (int, float)))

常见坑

  • int('3.14') 直接报错:带小数点的字符串先 float() 再 int()。处理用户输入的数字时这是高频崩溃点。
  • 以为 int() 会四舍五入:int(3.99) 是 3,负数 int(-3.99) 是 -3(向零截断)。要四舍五入用 round()。
  • 输入忘了转换直接比较:age = input(...) 拿到的是字符串,if age >= 18 在 Python 3 里直接 TypeError——先 int(age)。
  • bool('False') 是 True:任何非空字符串都是真值。从配置文件、环境变量读到的 'False' 要自己解析,不能指望 bool()。

小结

Python 不做隐式转换,int/float/str/bool 显式转;容器之间 list/tuple/set/dict 互转;类型判断用 isinstance。下一节把运算符一次讲透。