如何将函数的结果添加到python中的列表?

时间:2015-03-01 07:09:19

标签: python list primes

def b():
    a = int(input("Look up to: ")) // set the range to scan for primes
    for num in range(0, a):
        if prime(num) == True:
            print(num)
            print("adding to list")
            return num
            list = [num]
            list.append(num)

        else:
            print(num, "is not a prime")

那么如何将结果附加到每个新素数的“列表”中呢?

忘记提及检查num是否为素数的函数:

def prime(num):
         for j in range (2, num):
               if (num % j) == 0 :
                    return False
         return True

5 个答案:

答案 0 :(得分:1)

几点:

  • 执行return后,它所应用的值将返回给调用该函数的人,并且返回之后的代码永远不会执行。

  • shadowing内置函数list()通过调用局部变量list返回新列表。

  • 通过调用[num],该列表不断重建,这是创建仅包含num列表的简写。您想要做的是使用append 更新

修复代码,它可能类似于:

def get_primes():
    a = int(input("Look up to: "))

    # 'primes' is a more suitable name for a list of primes
    # we're only creating the list *once*, and we're not shadowing 'list'
    primes = list()

    for candidate in range(0, a):
        if prime(candidate) == True:
            print(candidate)
            print("adding to list")
            primes.append(candidate)

        else:
            print(num, "is not a prime")

    # use return to return a result
    return primes

您可以致电get_primes()

进行测试

提示:您可以使用filter执行相同的操作get_primes

a = int(input("Look up to: "))
print(filter(prime, range(0, a)))

关于list[]之间区别的一个小注意事项是,您可以更改list的行为,从而更好地控制[]& #39;生成的代码直接调用BUILD_LIST(更难改变):

>>> dis.dis(lambda: [])
  1           0 BUILD_LIST               0
              3 RETURN_VALUE        

>>> dis.dis(lambda: list())
  1           0 LOAD_GLOBAL              0 (list)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE  

在这种情况下确实无关紧要,但@Thrustmaster建议在评论中使用[],因为有些人可能会认为它更清晰。

答案 1 :(得分:1)

哦,很多次要的语法错误。让我list他们失望..

  1. Python评论不是以//开头,而是以#开头。参考。代码行号:2
  2. list是python中的关键字,不应在变量声明中使用它。行参考:8。
  3. 返回后,该行之后的代码将不会被执行。 Line Ref:7。
  4. 您不应该在for循环内初始化列表。它在每次迭代中都被初始化。
  5. 您只需撰写if prim(num) == True:
  6. ,而不是if prim(num):

    那就是说,正确的代码应如下所示:

    def b():
        a = int(input("Look up to: ")) # set the range to scan for primes
        primes = [] #Your list
        for num in range(0, a):
            if prime(num):
                print(num)
                print("adding to list")
                primes.append(num)
    
            else:
                print(num, "is not a prime")
    
        return primes
    

    希望它有所帮助.. :)

答案 2 :(得分:0)

你几乎就在那里。您的代码的奇怪之处在于您放置了return语句。试试这个:

def b():
    primesList = []
    a = int(input("Look up to: "))
    for num in range(0, a):
        if prime(num) == True:
            print(num)
            print("adding to list")
            primesList.append(num)

        else:
            print(num, "is not a prime")

     return primesList

请注意,您的原始退货声明会早早结束您的早期,事实上甚至在您的列表有机会在所有附加任何素数之前。另一个重要的一点是,您永远不应该隐藏内置类型(在这种情况下为list)或其他内置函数(如mapsorted等)。

只需初始化primesList一次并将num整数附加到for loop内即可。

答案 3 :(得分:0)

您的代码看起来是C和Python的混合(不要使用//作为注释)。 我假设你的程序正在寻找高达n的素数。以下是如何实现这一点:

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

def find_primes(a, b):
    primes = []
    for i in range(a, b):
        if is_prime(i):
            primes.append(i)
    return primes

答案 4 :(得分:0)

其他答案都很好,解决了重新绑定列表变量并且无法从函数b()返回素数列表时遇到的主要问题。

我认为值得一提的是,列表理解可以用来简洁地编写主要列表生成代码:

def prime(num):
         for j in range (2, num):
               if (num % j) == 0 :
                    return False
         return True

def get_primes(low, high):
    return [n for n in range(low, high+1) if prime(n)]

>>> a = input("Look up to: ")
11
>>> get_primes(0, a)
[0, 1, 2, 3, 5, 7, 11]
>>> get_primes(5, a)
[5, 7, 11]

注意:

  1. 将“up to”值传递给函数比使用它更灵活 在功能中提示它。
  2. “最多”应包含在内,例如get_primes(0,11)应该在结果中包含11。因此,在调用range()时,您需要将一个值添加到上限值。
  3. 传递lowhigh可以生成任意范围的素数。
  4. 您可以使用set()包含列表推导,以便将结果作为一组返回。