is_prime python 中的一个衬垫

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

我尝试编写一个函数,如果给定参数是素数,则返回“True”,否则返回“False”。从某种意义上说,我实现了我的目标,但我只是想知道一种更好、更Pythonic的方法来实现它,这就是我想到的:

def prime_one_liner(n):
    return True if len([i for i in range(2,n) if n % i == 0]) == 0 else False
python primes
4个回答
5
投票

“实现你的‘目标’”

如果这是你的目标,你可以使用

any
来缩短它:

def prime(n): return not any(n % i == 0 for i in range(2,n))

尽管如此,“pythonic”并不是我所描述的。它更像是“难以阅读”。然而,它可能比你的版本更Pythonic。

更好的方法:

更易读的版本是:

def prime(n): 
    for i in range(2, n): #for every value between 1 and n
        if n%i == 0: #check if i divides n
            return False #if this is true, n is not prime
    return True

正确功能:

但是您需要考虑小于 2 的值,因此您还需要像这样编辑代码:

def prime(n): return not any(n % i == 0 for i in range(2,n)) if n > 1 else False

和/或:

def prime(n): 
    for i in range(2, n): #for every value between 1 and n
        if n%i == 0: #check if i divides n
            return False #if this is true, n is not prime
    return True if n > 1 else False #values less than 2 are not prime.

一般信息:

您的代码不适用于

n
的所有整数值,请考虑
n=1
(请参阅上面修复此问题的修改示例),但无论如何,如果这是您的目标,则可以使其更短(如图所示上面),但仅仅因为它很短并不意味着它是“pythonic”。目前你的代码很难阅读。所以也许扩展代码会更好(类似于上面的代码扩展)。


0
投票

我认为这是最“Pythonic”的方法:

def prime_one_liner(n): return all((n%i)>0 for i in range(2, int(n**.5)+1)) if n>1 else False

0
投票

没有人注意到,如果你使用“range(2,n)”,你就包含了对数字,如果一个数字是对,它就不能是素数(除非 n = 2),所以你可以只除以 2 或“range( 3,n,2)" 这意味着你只需要 2 和“n”下的所有奇数,而且如果你考虑一个潜在的奇数,排除 2 作为除数,你也可以排除所有 n 值 >= n/3,我们不会尝试将 687 除以 685,如果您在一个可能很有趣的大领域上进行此操作,它将节省您 83% 的时间。


-2
投票

我对你的想法的版本看起来像这样:

x = lambda n: False if False in map(lambda i: False if n % i == 0 else True, range(2, n)) else True

因为这是由一行而不是两行组成的一行行

但是可能有很多好的/更好的方法可以做到这一点,但它在某种程度上是Pythonic的

© www.soinside.com 2019 - 2024. All rights reserved.