Python陷阱:tuple与Nonetype

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


你可能感兴趣的:(Python陷阱:tuple与Nonetype)