while True:
line = raw_input('> ')
if len(line) > 0 and line[0] == '#' :
continue
if line == 'done':
break
print line
print "done!"
那么为什么,如果行的长度 > 0 并且 line[0] == '#' : 如果我什么都没有就按回车键,这不是错误吗?该行不是 0,因此该行不 > 0 吗?如果你把原始代码放在其中
if line[0] == '#' :
当你按下回车键时就会出错。
那么为什么,如果行的长度 > 0 且 line[0] == '#' :如果我只是按回车键,那里什么也没有,那不会出错吗?不,它不会抛出错误。 Python 使用惰性求值,可以使用
and
运算符进行短路。请参阅文档。 换句话说,只有当第一部分是
line[0] == '#'
时,才会计算布尔表达式的第二部分,即
True
。我相信这就是作者将其称为
守护者模式的原因,以便表达式的第一部分避免(guards)表达式第二部分中可能出现的错误。
如果您删除第一部分(如您所显示的示例中所示),那么当line
中没有元素时,您将尝试访问
line[0]
(
line
) 的第一个元素。
该行不是 0,因此该行不 > 0 吗?如果您只按 Enter 键,则行是
""
。一个空字符串。该字符串
len(line)
的长度为 0(因此,一旦计算
and
语句的第一个情况,程序就会继续执行。如果您访问空行的第一个索引
0
,它将抛出错误。因此,在访问它之前始终检查您是否确实有第一个索引...
示例: 如果您请求数组的第 10 个元素,而该数组只有 5 个元素,则会出现索引错误。在请求 my_array[10] 之前,守护者模式会检查以确保数组至少有 11 个元素(想一想)。
def somefunction(content):
if len(content) > 11:
return content[10]
else:
return None
另一种方法是用 try/catch 块包围代码。如果您有多种可能导致问题的情况,并且您不关心其中哪一个是问题所在,那么这将为您省去一些挑剔的麻烦。老实说,我必须查一下这个。当我学习编程时,我们只是将其称为“验证”。
if len(wds) < 3 or wds[0] != 'From' :
continue