2

我注意到最近我的作业成绩随着 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

这是一个被认为是错误的代码。正如代码所说,它需要一个整数列表并返回它们是否处于几何序列中。我的书说,如果 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

确切地说,这并没有被认为是错误的,但它比我猜想的要长得多。他在文件上写的一条评论是“# set res to index of grade in grades”,但由于它是一个独立实验室,我无法寻求帮助。我试图在列表中为每个等级赋予其价值,但我无法正确索引它。

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

找出一个翻译成“一年是闰年,如果它可以被 4 整除但不能被 100 整除,除非它可以被 400 整除”的 if 语句让我感到困惑。显然我写的适用于所有奇数,但我无法弄清楚为什么。

4

2 回答 2

1

看起来你的问题至少有一半不是编程问题,而是理解任务的问题。例如:

这是一个被认为是错误的代码。正如代码所说,它需要一个整数列表并返回它们是否处于几何序列中。我的书说,如果 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在所有这些上运行它,等等,但这些都只是改进。

然后:

找出一个翻译成“一年是闰年,如果它可以被 4 整除但不能被 100 整除,除非它可以被 400 整除”的 if 语句让我感到困惑。显然我写的适用于所有奇数,但我无法弄清楚为什么。

您首先需要将其翻译成英语的一系列and和步骤。你所做的,“能被 4 整除,能被 400 整除或不能被 100 整除”,甚至都不是一回事。然后,您正确地编码了错误的算法,但这无济于事。ornot

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

if n % 4 == 0 and (not n % 100 == 0 or n % 400 == 0):
于 2013-03-01T21:19:26.450 回答
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]]
于 2013-03-01T21:41:56.973 回答