所以,我已经制作了这段代码:
y = 10
prime_num = [x for x in range(1,y) if y%x != 0]
它回复了我:
[3,4,6,7,8,9]
这段代码的目的是生成1到10之间的素数,它给我一个奇数,我不安静得到。我期待这个工作,因为我的列表理解是一个尝试的复制品:
def is_prime(x):
if x < 2:
return False
else:
for n in range(2, x-1):
if x % n == 0:
return False
return True
我从codecademy创建的,我只是简单地改变了&#34; x%n == 0&#34;到&#34; x%n!= 0&#34;。
答案 0 :(得分:1)
我不认为你的代码遵循codeacacdemy的给定代码。这有点接近codeacademy的代码
y = 10
factor_array = [x for x in range(2,y) if y%x == 0 ]
if not factor_array :
print("prime")
else :
print ("composite")
答案 1 :(得分:0)
根据您的问题,目前尚不清楚问题是什么,以及您期望使用哪种工具。
如果你想仅使用列表理解来获得第一个n
的列表,我担心这不是非常有效,因为没有直接的方法来了解将要有多少个对象事先生成。
如果您希望获得给定范围内的素数,例如低于某个数字num
,则可以通过以下方式实现(或多或少):
num = 10
primes = [
x for x in range(2, num)
if all([x % f != 0 for f in range(2, x - 1)])]
但是,如果你定义一个素数测试函数(比如is_prime()
),那么对于大数字你可以获得更好的表现。
在这种情况下,代码将显示为:
num = 10
primes = [x for x in range(2, num) if is_prime(x)]
请注意,您提供的is_prime()
实施效率不高。
此外,通过直接解决某些极端情况,可能有更有效的方法来实现这一点,例如:
num = 10
primes = ([] if num < 2 else [2]) + [x for x in range(3, num, 2) if is_prime(x)]
答案 2 :(得分:0)
您的代码只关注可能的素数x
是否均分10
。这不是对素性的考验。
cap = 10
prime_nums = [2] + [x for x in range(3, cap+1, 2) if
all(x%z!=0 for z in range(2, int(x**(0.5))+1))]
您的主要测试是:
all(x % z != 0 for z in range(2, int(x**(0.5))+1))
# ^ not divisible by anything in the range of...
# ^ [2..sqrt(x)]
答案 3 :(得分:0)
[x for x in range(1,y) if y%x != 0]
您遍历范围 [1,y)并检查 y 是否可被 x 整除。您的代码目前生成 [1,y)\ Divisors(y),这显然不是您想要的。相反,您希望对 x 执行素性测试,以及如何执行此操作如下所述。
您应该稍微改变列表理解,因为您实际上从不使用 is_prime
:
prime_nums = [x for x in range(2, y + 1) if is_prime(x)]
顺便说一下,访问this thread可以显着提高素性测试的效率。
如果您想避免使用is_prime()
功能,可以使用以下代码:
prime_nums = [x for x in range(2, y + 1) if all(x%k for k in range(2, x-1))]