Python调试

本教程内容主要来源于《Python编程导论》 6-8章

供2018年小学期 Python数据科学 课程使用 PowerBy 刘相

调试

调试是一种需要学习的技能,好消息是学会调试并不难

人们至少花费了40年建立被称为‘调试器’的工具,所有流行的Python IDE中都带有调试器工具,这些调试工具帮助人们找到程序中的错误,但事实上帮助并不大。更重要的是接近问题,经验丰富的程序员可能根本不用调试工具,也许他们认为最重要的调试工具是 print()

调试过程可以看做是一个搜索过程,每次试验尽力缩减搜索空间。一个有效方法是,设计一个实验。该实验大致分为以下几步:

  1. 调查测试结果,弄清楚什么样的数据通过测试,什么样的数据未通过测试
  2. 建立一个符合现有数据的假设,假设可以很具体(403行x\<y改成x=y即可)也可以很宽泛(50-100行的循环出了问题)
  3. 设计一个推翻上述假设的实验,你应该能够明确解释出实验每种可能的结果
  4. 将你的实验记录下来

Tips for 调试

  • 排除常见错误(这个需要经验) coding everyday
  • 不要问自己为什么没有像你想的那样做,而是考虑程序为什么像现在这样做
  • 错误可能不在你认为会出错的地方
  • 试着向他人解释你的问题
  • 不要盲目相信书上的东西(不要相信文档)大家应该首先学会读文档:)
  • 暂停调试,先写文档
  • 出去散散步,回头接着做

调试案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 调试案例
# 下面程序有若干处bug

def isPal(x):
"""
假设x是列表
如果列表是回文,则返回True,否则返回False
"""
temp = x
temp.reverse()
if temp == x:
return True
else:
return False

def silly(n):
"""
假设n是正整数
接收用户的n个输入
如果所有的输入组成一个回文列表,则返回‘Yes’
否则返回‘No’
"""
for i in range(n):
result = []
elem = input('Enter element: ')
result.append(elem)
if(isPal(result)):
return True
else:
return False

Python的可变数据类型与不可变数据类型

python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化.

可变数据类型(mutable)

  • Dictionary(字典)

  • List(列表)

不可变数据类型(unmutable)

  • Number(数字)

  • String(字符串)

  • Tuple(元组)

  • Bool(布尔值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 不可变数据类型
a = 15
b = 15
print("a的地址是"+ str(id(a)))
print("b的地址是"+ str(id(b)))
print("**********友爱的分割线************")

b = 20
print("a的值是"+ str(a))
print("b的值是"+ str(b))
print("a的地址是"+ str(id(a)))
print("b的地址是"+ str(id(b)))
print("**********友爱的分割线************")

# 可变数据类型
a = [1,2,3]
b = a
c = [1,2,3]

print("a的地址是"+ str(id(a)))
print("b的地址是"+ str(id(b)))
print("c的地址是"+ str(id(c)))
print("**********友爱的分割线************")

b[0] = 4
c[0] = 5
print("a的值是"+ str(a))
print("b的值是"+ str(b))
print("c的值是"+ str(c))
print("a的地址是"+ str(id(a)))
print("b的地址是"+ str(id(b)))
print("c的地址是"+ str(id(c)))

1541837361506