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

How can I add the outcome of a function to a list in python?

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")

那么如何为每个新素数将结果附加到 "list"?

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

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

几点:

  • 一旦 return 被执行,它所应用的值将 returned 给调用该函数的任何人,并且 return 之后的代码永远不会执行。

  • shadowing the built-in function list() 通过调用局部变量 list.

  • 是一个新列表 return
  • 通过调用 [num] 不断 重建 列表,这是一个 shorthand 用于创建 new 列表仅包含 num。你想要做的是 update 它使用 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 的行为,从而提供更好的控制,而 []生成的代码直接调用 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 建议在评论中使用 [],因为有些人可能认为它更清洁。

你快到了。您的代码的奇怪之处在于您放置 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

请注意,您的原始 return 语句会提前 结束您的函数 ,事实上甚至在您的列表有机会追加 之前任何素数。这里的另一个重点是你永远不应该隐藏一个内置类型(在这种情况下为 list),或其他内置函数(如 mapsorted 等) .

只需初始化 primesList 一次并将 num 整数附加到 for loop.

中也足够了

您的代码看起来是 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

哦,很多小语法错误。让我list他们下来..

  1. Python 评论不是以 // 开头,而是以 # 开头。参考代码行号:2
  2. list 是 python 中的关键字,您不应在变量声明中使用它。行参考:8.
  3. 在你做了return之后,那一行之后的代码将不会被执行。行参考:7.
  4. 您不应该在 for 循环中初始化列表。它在每次迭代中都被初始化。
  5. 而不是 if prim(num) == True:,您可以简单地写 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

希望对您有所帮助.. :)

其他答案很好,解决了您在重新绑定列表变量和未能return函数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. "Up to" 应该是包容性的,例如get_primes(0, 11) 应该在结果中包含 11。因此调用range().
  3. 时需要在上限值上加一
  4. 传递 lowhigh 允许您生成任意范围的素数。
  5. 您可以用 set() 包装列表推导式,将结果 return 编辑为一个集合。