首先,您总是点击的原因else
是您在if
循环结束后进行检查。因此,您只需检查最后一个值,而不是检查每个值。
如果任何值匹配,您想打印“是”答案,只有当所有值都失败时才打印“否”。为此,您需要将循环放在if
循环内部,break
一旦您找到第一个成功(除非您想打印所有匹配项,而不仅仅是第一个匹配项),然后else
只有在您没有的情况下才会执行此操作找不到他们中的任何一个。
您可以使用 aelse:
和 a while:
,只有在您没有break
在任何地方运行时才会运行。但是很多人觉得这很令人困惑,所以它可能更简单,return
而不是break
成功,如果你完成循环,总是打印失败消息。
同时,我认为您希望做的是处理num
从inputNumber
to的所有值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) + ("!"))