如何在Python中从一系列数字中获取素数列表?

问题描述 投票:0回答:3

情况是这样的:我正在尝试获取某个范围(例如 2 到 100)中的数字列表,但我要查看最大的数字并查看该范围内有多少个素数。我不知道如何让 100 成为可变响应。

这是我的代码:

def is_prime(number):
    if isinstance(number,int) == 'False': #stops if the number is not an integer
        return
    if number <= 1: #we do not need anything less than 1 or 1
        return
    if number == 2: #we know 2 is prime, so if they want a list of primes for 2, well...
        return 2  
    for factor in range(3, int(number ** 0.5)+1,2):        
        if number % factor == 0: #if this is true, we do not want it as its not prime
            return
    else:
        if number % 2 == 0: #I was having issues with 4,6,8 showing up, so I had to do this to get rid of those
            return
        else:
            return number  #this will be a number, should be prime....

AllNumsInRange = list(range(2,100))  #The 1000 needs to be a variable. One that someone enters in and then the whole thing works. but I do not know how to do that... SQl I do, SPROCs are easy lol. This no idea.

PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))  #this cleans up the list, gets rid of the Nones and maps the function to the range.

print(PrimeNumber)

我得到:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

对于硬编码数字来说这是正确的

只要我有硬编码范围,我就能做到这一点。当您必须使用以下提示时,这不起作用。

print(allPrimesUpTo(100))

我尝试了各种方法让

AllNumsInRange
进入函数:

def allPrimesUpTo(number):
    if number <= 1:
        return
    if number == 2:
        return 2  
    for factor in range(3, int(number ** 0.5)+1,2):        
        if number % factor == 0:
            return
    else:
        if number % 2 == 0:
            return
        else:
            AllNumsInRange = list(range(2,number))
            PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))
    print(PrimeNumber)

print(allPrimesUpTo(100))

但是我得到了

None
作为解决方案。它不是,应该是:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

很明显我做错了什么,我想解决这个问题。这是为了我个人的成长,我很困惑。另外,如果你能告诉我如何用谷歌搜索这个,它也会很有帮助,使用正确的词汇是关键,我在一个函数中尝试了多个列表,以及各种组合,但没有运气。

python primes
3个回答
0
投票

好吧,你将 100 传递给函数,然后进入这部分:

for factor in range(3, int(number ** 0.5)+1,2):        
        if number % factor == 0:
            return

由于 100 能被 4 整除,所以返回。您可以删除已经放入的所有代码

is_prime
并且它会起作用:

def allPrimesUpTo(number):
    AllNumsInRange = list(range(2, number))
    PrimeNumber = list(
        filter(partial(is_not, None), list(map(is_prime, AllNumsInRange)))
    )
    return PrimeNumber

现在,有几件事:

  1. 如果

    is_prime
    返回True或False会更有意义,那么你就不需要过滤掉那些None。

  2. 您将

    isinstance(number, int)
    与字符串
    "False"
    进行比较,而不是布尔值
    False
    ,因此它将始终为 False。

这可能看起来像这样:

def is_prime(number):
    if not isinstance(number, int) or number <= 1:
        return False

    if number != 2 and number % 2 == 0:
        return False

    for factor in range(3, int(number**0.5) + 1, 2):
        if number % factor == 0:
            return False

    return True
  1. 您不需要将范围转换为列表。

所以这就足够了:

def all_primes_up_to(number):
    return list(filter(is_prime, range(2, number)))

这工作得很好,但更 Pythonic 的方法是使用列表理解:

def all_primes_up_to(number):
    return [i for i in range(2, number) if is_prime(i)]

0
投票

我相信你已经快到了,但需要调整你的 while 循环,如下所示:

while True:
    inval = input('What number are you looking for? ')
    try:
        number = int(inval)
        break                  # Break out of the loop when input is integer
    except ValueError:
        print('This is not an integer')
        
AllNumsInRange = list(range(2,int(number)))
PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))
print(PrimeNumber)

为了给您一些上下文,while 循环将要求用户输入一个数字,这是一个存储为 inval 的 str 值。 try 部分尝试将 inval 转换为存储为 number 的整数值。如果转换成功,代码将跳出 while 循环并继续执行行

AllNumsInRange
。如果转换导致“ValueError”,代码将打印出警告并返回询问数字。

AllNumsInRange
开头的行与
While
语句的缩进级别相同


0
投票

好吧,我已经有了答案,虽然不太优雅。我仍然想尝试做建议的事情。我想做的就是有一个输入。然后检查该输入以确定它是否是整数。如果没有,我们会收到错误或它停止工作。如果它是一个整数,则让函数检查它。最后,打印出输入的数字所具有的质数列表。

这是我上完4个小时的课后得出的结论。请记住,我在为期 4 周的课程中学习了 4 个小时。那么,第一周。我相信我会变得更加优雅。但这正是我所需要的。感谢 itprorh66 的建议。太酷了。

def is_prime(number):
    if number <= 1:
        return
    if number == 2:
        return 2  
    for factor in range(3, int(number ** 0.5)+1,2):        
        if number % factor == 0:
            return
    else:
        if number % 2 == 0:
            return
        else:
            return number
while True:
    inval = input('What is the max range number you would like to use to get all prime numbers?  ')
    try:
        number = int(inval)
        break
    except ValueError:
        print(f'{inval} is not an integer.')
        
AllNumsInRange = list(range(2,int(number)))
PrimeNumber = list(filter(partial(is_not,None), list(map(is_prime,AllNumsInRange))))
print(PrimeNumber)
  
© www.soinside.com 2019 - 2024. All rights reserved.