如何制作列表的长度" len(list)"一个用于进一步计算的变量? Python3

时间:2016-01-01 08:10:52

标签: python list

是否可以将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

3 个答案:

答案 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 += 11添加到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