中午,弟弟看电视剧《碧血剑》。此剧由金庸原著改编而来。第十集中,女主角抱怨,官兵到处奸淫掳掠、无恶不作,早该死了。政治敏感的我,马上觉得有问题——这明显是对国家不满嘛!
过去的官兵,与现今“为人民服务”的城管何异?我支持城管捣毁播放《碧血剑》的电视台,敢映射我英武的平民武装,该被教训教训了。
下午,练习Python。发现在IDLE解释器中输入:
for n in range(2,10):
for x in range(2,n):
if n % x==0:
print n,’equals’,x,’*’,n/x
break
else:
print n,’is a prime number’
结果是:
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3
不对,9并非素数,怎会出来“9 is a prime number”这样的字句呢。而且,“7”出现的频次也太高了吧?
如果我复制代码:
for n in range(2,10):
for x in range(2,n):
if n % x==0:
print n,’equals’,x,’*’,n/x
break
else:
print n,’is a prime number’
就可得出:
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
结果正确。为何?为何直接打开Python就毫无问题?
几经试验,最终发现是IDLE缩进的问题。只需在else:一行前摁一下backspace,即可解决。此外,还发现一个问题,在IDLE中输入以下代码:
while True:
pass # busy-wait for keyboard interrupt
会导致IDLE陷入死循环,进而崩溃。而在终端的Python中输入以上代码则毫无问题。按照一个案例,我输入以下代码:
def fib2(n): # return Fibonacci series up to n
“””Return a list containing the Fibonacci series up to n.”””
result=[]
a,b=0,1
while b<n:
result.append(b)
a,b=b,a+b
return result
摁下enter后,输入:
f100=fib2(100)
>>> f100
得出结果:[1]
而我复制案例中的:
def fib2(n): # return Fibonacci series up to n
“””Return a list containing the Fibonacci series up to n.”””
result = []
a, b = 0, 1
while b < n:
result.append(b) # see below
a, b = b, a+b
return result
f100 = fib2(100) # call it
f100 # write the result
得出的结果是:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
在命令行中用Python编写也能得出以上结论。难道,我的IDLE出问题了?
几经查证,发现IDLE搞不清楚Python的缩进。只需在IDLE中的return result一行摁一下Backspace键,即可得出正确结论:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
解释器有问题,如何校正?
几天之后,我在教程里找到这样几句话:“Python的解释器不会从多行的文档字符串中去除缩进,所以必要的时候应当自己清除缩进。这符合通常的习惯。第一行之后的第一个非空行决定了整个文档的缩进格式。(我们不用第一行是因为它通常紧靠着起始的引号,缩进格式显示的不清楚。)留白“相当于”是字符串的起始缩进。每一行都不应该有缩进,如果有缩进的话,所有的留白都应该清除掉。留白的长度应当等于扩展制表符的宽度(通常是8个空格)。”
我的疑问终获解释。