1. 慎重使用tuple处理string生成的list
首先我要把从文件里逐行读取的字符串转变为数字列表,正确的是:
>>> [float(item) for item in "1e2 to 2".split() if item not in ["to", " "]] [100.0, 2.0]</span>接着读取到某一行时,出现一个“le” 无法转换类型,于是报错:
>>> [float(item) for item in "1e2 to 1e".split() if item not in ["to", " "]] Traceback (most recent call last): File "<pyshell#27>", line 1, in <module> [float(item) for item in "1e2 to 1e".split() if item not in ["to", " "]] ValueError: invalid literal for float(): 1e</span>捕获并抛出这个异常,定位报错字符串位置,发现if语句没有执行:
>>> try: a = [float(item) for item in "1e2 to 1e".split() if item not in ["to", " "]] except: print "error:", a error: -1e13 to 0.1 1.06148e10 to 1e由于读取的这个字符串是字典的key,因此多加了一个tuple()函数,结果令人费解,因为字符串被彻底打散了:
>>> try: a = [float(item) for item in "1e2 to 1e".split() if item not in ["to", " "]] except: print "error:", tuple(a) error: ('-', '1', 'e', '1', '3', ' ', 't', 'o', ' ', '0', '.', '1', ' ', '1', '.', '0', '6', '1', '4', '8', 'e', '1', '0', ' ', 't', 'o', ' ', '1', 'e', ' ')测试tuple()
>>> tuple("123") ('1', '2', '3')查看说明文档:tuple(iterable) -> tuple initialized from iterable's items。也就是说tuple把传给它的str内容逐个读取为元祖的内容,于是有了上面的一团散沙。
这说明两个结果:
(1) float()语句执行失败后,列表并没有生成,而是把字符串内容直接赋值给a,a成为一个str类型
>>> try: a = [float(item) for item in "1e2 to 1e".split() if item not in ["to", " "]] except: print "error:", type(a),tuple(a) error: <type 'str'>(2) 字符串与list、tuple()嵌套使用时一定小心,一个错误就会让你得到完全不同的结果。
---------------------------------------------------------------------------------------------
2. 无所不在的NoneType
tuple说完了,接着上面你的思路,说说这个NoneType()报错。
由于上面捕获了异常,因此程序没有中断,读取完字典的key之后,按key调用字典内容:dic[key].items(),连环报错:
AttributeError: 'NoneType' object has no attribute 'items'
那么什么是Nonetype?
要理解这个,首先要理解Python对象,python对象具有三个特性:身份、类型、值。
三特性在对象创建时被赋值。只有值可以改变,其他只读。类型本身也是对象。
Null与None是Python的特殊类型,Null对象或者是None Type,它只有一个值None.
它不支持任何运算也没有任何内建方法. None和任何其他的数据类型比较永远返回False。
None有自己的数据类型NoneType。你可以将None复制给任何变量,但是你不能创建其他NoneType对象。
一句话总结:Null对象是python对象,又叫做NoneType,None是这个对象的值。
>>> type(None) <type 'NoneType'>但是根本没有定义Nonetype。为什么这里会报错?
在我看来八竿子打不着,虽然tuple()导致字符被打散,但是也好歹返回了key(虽然不正确),凭什么不给人家key应有的权利(调用字典内容)。
随后上网查,明白NoneType之所以出现是因为定义了一个变量或函数,却没有值或者返回值,因此会默认值为None。
在出现异常之后,虽然能print key,但是却没有返回值,因为一场的捕获跳过了赋值,因此key仍然是None。
Tips: float(1e13) = inf