显式优于隐式(Python 之禅)
join 自动把数字、None、对象等转成字符串,你可能无意中拼出脏数据例如:" ".join(iterable)这里面的iterable必须每项都是str
str 类型,否则会抛出:TypeError: sequence item 0: expected str instance, XXX found
自动转换意味着每次都要遍历 + str(),如果列表很大,性能损耗不可忽略。
Python 选择把控制权交给开发者,需要转换就显式 map(str, ...)
强制 str 类型让错误尽早暴露,而不是默默生成脏字符串,后期调试更难
join 是字符串的方法,只处理字符串符合“单一职责”原则。其他类型想进来?先自己变成字符串,别让别人帮你擦屁股。
map(str, iterable)是 Python 的一个内置高阶函数调用,作用是把任意可迭代对象里的每个元素依次传给 str(),惰性地返回一个迭代器,最终得到全是字符串的序列。
nums = [1, 2, 3, 4]
strs = map(str, nums) # 得到一个迭代器
list(strs) # 显式转成列表:['1', '2', '3', '4']
# 常见用法:直接配合 join
" ".join(map(str, nums)) # 得到 '1 2 3 4'
str.split() 的返回值一定是 List[str],每个元素都是字符串;
s = "1 2 3"
parts = s.split() # 必然得到 ['1', '2', '3']
assert all(isinstance(x, str) for x in parts)