穷举枚举python

时间:2013-09-09 18:02:49

标签: python python-2.7

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

有人可以就此问题向我提出任何一般性建议吗?现在我总是收到不正确的“其他”声明。

1 个答案:

答案 0 :(得分:2)

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

如果任何值匹配,则要打印“是”答案;如果所有值失败,则打印“否”。为此,您需要将if置于循环内,并在找到第一个成功后立即break(除非您要打印所有匹配,而不仅仅是第一个),然后只有当你没有找到任何一个时,else才能成为你所做的事。

您可以将else:while:一起使用,只有在break任何地方都没有return时才能运行break。但是很多人发现这一点令人困惑,因此成功时仅num而不是inputNumber可能更简单,只要在完成循环时始终打印失败消息。


与此同时,我认为您希望做的是处理从0pwr的所有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的{​​{1}}循环要容易得多。每一次都通过。

将所有这些放在一起:

pwr

您可以进一步简化此操作。

您真正想要的是范围内任意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。你不关心嵌套是如何工作的,你只需要所有的组合。在数学术语中,您想要遍历两个范围的笛卡尔积。函数itertools.product正是这样做的。所以:

%

作为旁注,有两件事情使得这段代码难以理解。

首先,如果要打印出表达式,使用print(或(num) > 0 and (0 < pwr < 7))比手动将事物转换为字符串并将它们连接在一起要容易得多。格式化可以让你看到输出的样子,而不必弄明白,它会自动处理字符串化和相关的东西。

其次,在不需要它们的地方添加括号会使代码更难阅读。你的num > 0 and 0 < pwr < 7表达式周围的括号使你的代码看起来像Python 3,但它实际上是Python 2.并且表达式中每个字符串周围的括号更糟 - 乍一看,它们看起来应该在里面报价。甚至测试表达式print "{} to the power of {} equals {}!".format(num, pwr, inputInteger) print(str(num) + (" to the power of ") + str(pwr) + (" equals ") + str(inputInteger) + ("!")) 中的括号也会强制读者暂停 - 通常,这样的括号用于覆盖运算符组合在一起的正常方式,因此您必须考虑正常情况下的错误{ {1}}以及括号如何使它与众不同,只是为了最终弄清楚它实际上是完全一样的。

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

{{1}}