寻找以前编写的代码的修订版

时间:2013-03-01 21:11:52

标签: python

我注意到最近我的作业成绩越来越低,因为班级已经在Python中取得了进步,我想知道是否有人可以帮助我看看我在这些代码片段中做错了什么以及为什么他们被认为是错误的。这可能是一个很长的帖子,但是任何帮助阻止我在将来犯这些错误的帮助都会受到赞赏。

def geometric(l):
    'list(int) ==> bool, returns True if the integers form a geometric sequence'
    res = False
    if (l[1] / l[0]) == (l[2] / l[1]):
        res = True
    return res

这是一个被认为是错误的代码。正如代码所说,它需要一个int列表并返回它们是否是几何序列。我的书说如果a1 / a0等于a2 / a1,则序列是几何的,这对于2,4,8,16等工作得很好。我只是意识到这个问题是它只检查前两个索引和忽略其余的数字。我能写些什么来解决这个问题?

def letter2number(grade):
    '''string ==> int, returns the numeric equivalent to the letter grade, adding 0.3 if the grade contains a +
    and subtracts 0.3 if the grade contains a -'''
    res = 0
    if 'F' in grade:
        res = 0
    elif 'D' in grade:
        res = 1
    elif 'C' in grade:
        res = 2
    elif 'B' in grade:
        res = 3
    elif 'A' in grade:
        res = 4
    if '+' in grade:
        res += 0.3
    elif '-' in grade:
        res -= 0.3
    return res

确切地说这并不是错误的,但它比他想象的要长得多。他在文件中写的评论是“#res res to grade of grade of grade”,但由于它是一个独立的实验室,我无法寻求帮助。我试图在列表中给出每个等级的值,但我无法正确索引。

def leap(n):
    'int ==> bool, returns True if the year is a leap year, False otherwise'
    res = False
    if n % 4 == 0 and n % 400 == 0 or not n % 100 == 0:
        res = True
    return res

找出if语句,如果它可以被4除尽,但不能被100整除,除非它可以被400整除,否则转化为“一年是闰年”对我来说很困惑。显然我写的东西适用于所有奇数,但我无法弄明白为什么。

2 个答案:

答案 0 :(得分:1)

似乎至少有一半的问题不是编程问题,而是理解作业的问题。例如:

  

这是一个被认为是错误的代码。正如代码所说,它需要一个int列表并返回它们是否是几何序列。我的书说如果a1 / a0等于a2 / a1,则序列是几何的,这对于2,4,8,16等工作得很好。我只是意识到这个问题是它只检查前两个索引和忽略其余的数字。

您的代码正确实现了您认为的任务。通过检查所有索引对,它只是没有实现赋值实际上是什么。一旦你知道你需要做什么,大概你可以弄清楚如何编写一个比较成对索引的循环:

def geometric(l):
    'list(int) ==> bool, returns True if the integers form a geometric sequence'
    res = True
    for i in range(len(l) - 2):
        if (l[i+1] / l[i]) != (l[i+2] / l[i+1]):
            res = False
    return res

然后您可能会注意到,您可以在第一次失败时短路,或者将所有比率与第一次比较,而不是将它们作为对进行比较(意味着您必须计算大部分两次),或者写一个简单的帮助函数只检查一对并使用all在所有这些上运行它等等,但这些只是改进。

然后:

  

找出if语句,如果它可以被4除尽,但不能被100整除,除非它可以被400整除,否则转化为“一年是闰年”对我来说很困惑。显然我写的东西适用于所有奇数,但我无法弄明白为什么。

首先,您需要将其翻译成英语为andor以及not步骤的序列。你做了什么,“被4整除,可以被400整除或者不能被100整除”,甚至不能接近同一个东西。然后你正确编码了错误的算法,但这没有用。

您需要做的就是将“但不是”转换为“而不是”,并将“除非”转换为“或”:“4可见,并且不能被100整除或可被400整除”。将其转换为代码的唯一棘手的部分是使用括号而不是命令和“或者”:

if n % 4 == 0 and (not n % 100 == 0 or n % 400 == 0):

答案 1 :(得分:0)

对于你的letter2number,我会使用字典来处理映射,如下所示:

def letter2number(grade):
    G = {'F': 0, 'D': 1, 'C': 2, 'B': 3, 'A': 4}
    D = {'+': 0.3, '-': -0.3}

    if len(grade) == 2:
        return G[grade[0]] + D[grade[1]]
    else:
        return G[grade[0]]