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
答案 0 :(得分:1)
几点:
执行return
后,它所应用的值将返回给调用该函数的人,并且返回之后的代码永远不会执行。
通过调用[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
他们失望..
//
开头,而是以#
开头。参考。代码行号:2 for
循环内初始化列表。它在每次迭代中都被初始化。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
希望它有所帮助.. :)
答案 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
)或其他内置函数(如map
,sorted
等)。
只需初始化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]
注意:
range()
时,您需要将一个值添加到上限值。low
和high
可以生成任意范围的素数。set()
包含列表推导,以便将结果作为一组返回。