原帖地址:程序设计入门——python
这是一份姗姗来迟的文章,主要是太水了,一直不想写。但看见都五周了依然有些同学不知道该怎么看自己的程序,就勉强写了出来。
初入门时,由于尚未教授程序监测的内容,很多人写完程序后不知道如何检查,而且使用debug又是一堆堆鬼蓄文,对着蚯蚓技术文更是让人头晕。
那么该怎样监查自己的程序呢?那就是所有入门者一开始就会的一个大法:print大法。
print虽然简单,但要用起来也不容易。它只有放在正确的位置才能使我们快速追踪分析检查;否则就是跳出一堆堆无用的垃圾资讯让人茫茫然。
print检测原则:先主干,再侧枝;由上而下,逐步追踪;针对疑点,细心观察。
print应用规则:标注清楚要检查的变量、参数名,一定要能看出是那里在输出。
为了能用汉语监测,所以大家先得给程序头标上#-*- coding:utf-8 -*-,使用print u'输出x,y: ', x, y这样的方式比较好阅读。
由于本人汉语水平低,可能导致某些语句让人看不懂,对此表示抱歉。
下面就针对print大法应用进行举例说明:
(一)先主干,再侧枝
到了目前这个学习阶段,大家都已学会将一个大程序分解成多个小函数来写。那么为了快速准确抓问题,对主程序的的关键点进行监控就比较重要。
(二)由上而下,逐步追踪
这是因为很多人认为自己没大错误,只是某个地方疏忽了。那避免乱找,我们最好就按照程序流程,一步步监查。
(三)针对疑点,细心观察。
这点可以用的方面很多,比如借鉴老师或其它地方来的,但比较模糊没弄清原理,那就可以用print观察为啥会如此。
案例1:
第五周测验题第二题遍历 names.txt 文件输出长度最长的回文人名
输出结果是空字符呢?
def is_palindrome(name):
low = 0
high = len(name) - 1
while low < high:
if name[low] != name[high]:
return False
low += 1
high -= 1
return True
f = open('names.txt','r')
for line in f:
name = line.strip()
m = ""
if is_palindrome(name):
if name < m:
m = name
print m
f.close()
有请print大法,首先对主程序重点观察,主程序读取文章,切分然后有回文判断,那就先看有没回文(空白有可能是没返回回文):
if is_palindrome(name):
print "name",name #注意:这里标明清楚要检查的变量、参数名,一定要能看出是那里在输出。
if name < m:
运行有返回name AA...,那就说明是后面的程序有问题,往下只有四句,赋值、打印、关闭文件这肯定不是出问题的地方,那么只有
if name < m:有问题,name < m绝对不是判读长度最长的回文人名的方法,那么字符串长度是啥,想来很多人已经知道;而且取最长应该是name这边够长才要,绝对不可能用<号。至此基本问题解决,剩下的自己思考。
案例二
#若已知1800年1月1日为星期3,则对于一个给定的年份和月份,
#输出这个月的最后一天是星期几。
def get_month_day(year,month):
if month in (1, 3, 5, 7, 8, 10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
return 29
else:
return 28
def process():
year = int(raw_input())
month = int(raw_input())
day = get_month_day(year, month)
# 计算当前日期距离1800年1月1日的天数
sum = 0
for y in range(1800, year):
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
sum += 366
else:
sum += 365
for m in range(1, month):
sum += get_month_day(year, m)
sum += day - 1
print (sum + 3) % 7
process()
这位同学主程序直接做成一个函数,那就去追这个函数先吧
def process():
year = int(raw_input())
month = int(raw_input())
day = get_month_day(year, month)
print u'本月天数day', day ##注意:这里标明清楚要检查的变量、参数名,一定要能看出是那里在输出。
测试,本月天数day正确输出,那关闭这行打印,继续往下
sum = 0
for y in range(1800, year):
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
sum += 366
print u'有闰年哦sum', sum ##注意:这里标明清楚要检查的变量、参数名,一定要能看出是那里在输出。
else:
sum += 365
这里有闰年判断,所以下一个观察。测试,没有闰年输出,那就是闰年判断出了问题,找出问题吧同学。。。
案例三
看不懂的地方,就只管下print
if n % 2:
print 'n是奇数'
else:
print 'n是偶数'
改成
n = 3
print 'n % 2', n % 2 #注意:这里标明清楚要检查的变量、参数名,一定要能看出是那里在输出。
print 'n', n #注意:这里标明清楚要检查的变量、参数名,一定要能看出是那里在输出。
if n % 2:
运行看输出
n % 2 1
n 3
n是奇数