0

鉴于指数小于 7 且大于 1,我需要创建一个程序来查找单个数字的基数和指数。我使用的是 python 2.7。

我的代码如下:

def determineRootAndPower(inputInteger):
    pwr = 1
    num = inputInteger
    while (num) > 0 and (0 < pwr < 7):
        inputInteger = inputInteger - 1
        pwr = pwr + 1
        num = num - 1
    if int(num)**int(pwr) == inputInteger:
            print(str(num) + (" to the power of ") + str(pwr) + (" equals ") + str(inputInteger) + ("!"))
    else: 
        print("No base and root combination fit the parameters of this test")

任何人都可以就这个问题给我任何一般性建议吗?现在我总是收到不正确的“其他”声明。

4

1 回答 1

2

首先,您总是点击的原因else是您在if循环结束后进行检查。因此,您只需检查最后一个值,而不是检查每个值。

如果任何值匹配,您想打印“是”答案,只有当所有值都失败时才打印“否”。为此,您需要将循环放在if循环内部,break一旦您找到第一个成功(除非您想打印所有匹配项,而不仅仅是第一个匹配项),然后else只有在您没有的情况下才会执行此操作找不到他们中的任何一个。

您可以使用 aelse:和 a while:,只有在您没有break在任何地方运行时才会运行。但是很多人觉得这很令人困惑,所以它可能更简单,return而不是break成功,如果你完成循环,总是打印失败消息。


同时,我认为您希望做的是处理numinputNumberto的所有值0,并且对于每个pwr值,从 1 到 7 的所有值。为此,您需要一个嵌套循环。

当我们这样做时,使用for循环比使用循环围绕您初始化和/或每次遍历while的变量要容易得多。+1-1

把所有这些放在一起:

def determineRootAndPower(inputInteger):
    for num in range(inputInteger, 0, -1):
        for pwr in range(1, 7):
            if int(num)**int(pwr) == inputInteger:
                print(str(num) + (" to the power of ") + str(pwr) + (" equals ") + str(inputInteger) + ("!"))
                return
    print("No base and root combination fit the parameters of this test")

您可以进一步简化这一点。

您真正想要的是任何num范围内的任何组合和范围内的任何组合pwr。你不关心嵌套是如何工作的,你只需要所有的组合。用数学术语来说,您想要遍历两个范围的笛卡尔积。该功能itertools.product正是这样做的。所以:

def determineRootAndPower(inputInteger):
    for num, pwr in itertools.product(range(inputInteger, 0, -1), range(1, 7)):
        if int(num)**int(pwr) == inputInteger:
            print(str(num) + (" to the power of ") + str(pwr) + (" equals ") + str(inputInteger) + ("!"))
            return
    print("No base and root combination fit the parameters of this test")

作为旁注,有两件事无缘无故地使这段代码更难阅读。

首先,如果您想打印出一个表达式,使用format(or %) 比手动将内容转换为字符串并将它们连接在一起要容易得多。格式化让您可以看到输出的样子,而不必弄清楚它,它会自动处理字符串化和相关的东西。

其次,在不需要的地方添加括号会使代码更难阅读。表达式周围的括号print使您的代码看起来像 Python 3,但实际上是 Python 2。表达式中每个字符串周围的括号甚至更糟——乍一看,它们看起来应该在引号内。即使是测试表达式中的(num) > 0 and (0 < pwr < 7)括号,也会迫使读者停下来——通常,像这样的括号用于覆盖运算符组合在一起的正常方式,因此你必须考虑正常的错误num > 0 and 0 < pwr < 7以及括号是如何造成的不同,只是最终发现它实际上是完全一样的。

无论如何,比较这两者,看看哪一个更容易理解:

print "{} to the power of {} equals {}!".format(num, pwr, inputInteger)
print(str(num) + (" to the power of ") + str(pwr) + (" equals ") + str(inputInteger) + ("!"))
于 2013-09-09T18:12:17.387 回答