讨论区 MOOC专区 主题详情
我是管理员大人
精华 Print大法:初学者检查程序的方法

原帖地址:程序设计入门——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是奇数

所有回复(0)

回复

最近活动:
创建时间:
浏览次数:2054
关注人数:0