是否可以将len(factors)
的结果指定为变量?到目前为止我所拥有的是h = int(len(factors))
,但我不确定这是否真的有效。我下面的代码试图取一个整数' r'并代表' r'形式为(2 ^ k)* t + 1。下面这部分代码是处理找到2的幂和其他奇数(2 ^ k)* t的乘积。
可能是我以错误的方式解决这个问题,但是从我的研究和反复试验中,到目前为止我终于有了这个工作。但是现在在提取某些值时会出现更多问题。
from math import *
def executeproth():
r = input("Number to test:")
n = int(r)-1
d = 2
factors = []
while n % 2 == 0:
factors.append(d)
n = int(n/d)
h = int(len(factors))
print(n, factors, h)
# k = eval(2**h)
return factors
executeproth()
例如,输入29会产生以下结果:
Number to test:29
14 [2] 1
7 [2, 2] 2
所以在这个例子中,t = 7,k = 2,所以我们将得到29 =(2 ^ 2)* 7 + 1。 我想要做的是现在采用第三行值,即' 2',并将其用于进一步的计算。但注释掉的行#k = eval(2 ** h)会抛出错误如下:
TypeError: eval() arg 1 must be a string, bytes or code object
所以从我能理解的东西来看,我试图评估的东西并不是正确的形式。我还想知道问题是否由于while循环的性质而产生,该循环继续将值重新输入并创建多个列表,如图所示,因此h len(factors)
的多个值。
如何仅打印“最终结果”的结果? while循环中的迭代?即7 [2,2] 2
答案 0 :(得分:1)
这里应该满足您的要求,我认为您不需要评估k
。
这也解决了问题的第二部分,打印循环的最终结果。
正如格雷戈里指出的那样,只有在需要时才显式转换为int而eval用于字符串,你的表达式已经是整数。
def executeproth():
r = input("Number to test:")
n = int(r) - 1
d = 2
factors = []
while n % 2 == 0:
factors.append(d)
n = n // d
h = len(factors)
#print(n, factors, h)
else:
print"{} = ( 2 ^ {} ) * {} + 1".format(r,h,n)
return factors
executeproth()
答案 1 :(得分:0)
首先,您不需要将值显式转换为int
只是为了在表达式中使用它。处理输入时确实需要它,因为input()
返回一个字符串。
在python 3中使用整数除a // b
而不是int(a/b)
更为惯用。
最后,eval
用于评估字符串,而不是表达式。表达式总是被评估。
from math import *
def executeproth():
r = input("Number to test:")
n = int(r)-1
d = 2
factors = []
while n % 2 == 0:
factors.append(d)
n = n // d
h = len(factors)
print(n, factors, h)
k = 2**h
# does the same thing but is less efficient
# k = eval("2**h")
return factors
executeproth()
答案 2 :(得分:0)
正如其他人所说,你在这里不需要eval
。实际上,您通常应该避免使用eval
,因为它可能是dangerous。在做的大多数情况下,需要以字符串形式评估表达式,通常可以使用更安全的ast.literal_eval。但是,在您学习的这个阶段,您不太可能遇到许多需要使用该语言的高级功能的情况。
无论如何,以下是对您的代码的一些改进。
您不需要导入math
模块,因为您没有使用其中定义的任何函数或常量。但是当你做需要导入一个模块时,最好避免使用from module_name import *
形式,因为这会使用模块中定义的所有名称来污染你的命名空间。
您不需要将这些2存储在列表中 - 只需计算它们。
最好在程序的外层进行输入(和输入验证),而不是在执行计算的函数中深入了解。
Python提供了各种扩充赋值运算符,当您想对值执行简单操作并将结果存储回原始名称时,可以使用它们。例如count += 1
将1
添加到count
,将结果保存在count
。
Python允许您将多个对象作为元组返回,因此您可以返回n
的最终值以及您找到的2个因子数的计数。
def executeproth(r):
n = r - 1
count = 0
if r != 0:
while n % 2 == 0:
count += 1
n //= 2
return n, count
r = int(input("Number to test: "))
n, count = executeproth(r)
k = 2 ** count
print("{0} = {1} * 2 ** {2} + 1".format(r, n, count))
#v = n*k + 1
#if v != r:
# print("Error!")
如果if r != 0:
为零,则r
会阻止无限循环。
我最后还添加了一个(注释掉的)测试。做这样的简单测试是个好主意,以确保我们得到我们期望的结果。编写有用的测试是程序开发的重要部分。
典型输出:
Number to test: 0
0 = -1 * 2 ** 0 + 1
Number to test: 29
29 = 7 * 2 ** 2 + 1
Number to test: 57
57 = 7 * 2 ** 3 + 1