[英]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.