繁体   English   中英

穷举枚举python

[英]Exhaustive Enumeration python

我需要创建一个程序,找到指数小于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")

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

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

如果有任何值匹配,则要打印“是”答案;如果所有值都失败,则打印“否”。 为此,你需要把if放在循环中,并在你找到第一个成功时立即break (除非你想要打印所有匹配,而不是只打印第一个匹配),然后else成为你只做的事情。你没找到任何一个。

你可以使用else: with while: ,只有当你没有在任何地方break才会运行。 但是很多人发现这会让人感到困惑,所以return成功可能更简单而不是break ,并且如果你完成循环就会一直打印失败消息。


同时,我认为你希望做的是将inputNumber所有num值处理为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 (或% )比手动将事物转换为字符串并将它们连接在一起要容易得多。 格式化可以让你看到输出的样子,而不必弄清楚它,它会自动处理字符串化和相关的东西。

其次,在不需要的地方添加括号会使代码更难阅读。 你的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) + ("!"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM