从打印素数的函数中删除“无”结果

时间:2015-10-31 19:07:29

标签: python

我想编写一个函数,如果数字为素数,函数会将其作为结果,但对于非素数,我得到一个无,这是我的代码:

def isprime(n):

    a=0
    if n==1:
        a=1
    if n==2:
        a=1
    for i in range(2,n):

        if n%i==0:
            a=0
            break
        else:
            a=1
            break
    if a==1:
        return n
    if a==0:
        return


print(isprime(68))

68的结果是无

3 个答案:

答案 0 :(得分:0)

如果不是素数(a = 0),则不返回任何内容:

if a==0:
    return

如果您打印的函数值不返回任何内容,则会打印None

要解决此问题,请返回一个数字,或者在这种情况下,布尔值更符合逻辑。因此,您可以使用a=0a=1,而不是设置a=Falsea=True。然后你可以return a

答案 1 :(得分:0)

这种方法通常是一种很好的做法,要求你打印一些东西,以便有一个"基础案例"因为你永远不会得到一个非类型,因为你总会把某些东西还给打印/调用函数。

a=0
if n==1:
    a=1
if n==2:

    a=1
for i in range(2,n):
    if n%i==0:
        a=0
        break

    else:
        a=1
        break

if a==1:
    return n

# By having a base case return statement we will
#    never print out a none type, even upon error.
return (n + 'is not prime')

答案 2 :(得分:0)

如果您不希望在从功能返回时打印None,则需要更改打印代码,而不是功能代码。使用类似的东西:

p = isprime(x)
if p is not None:
    print(p)

但是你的isprime功能实际上并没有正常工作。对于除2或3之外的任何值,它将始终返回None

这是因为for循环只会运行一次迭代,因为您总是在它包含的breakif块中点击else语句。如果您测试的号码不是除数,您不想break。事实上,在这种情况下,你不需要做任何事情。

只需使用:

for i in range(2,n):
    if n%i==0:
        a=0
        break

没有else阻止。

请注意,您可以使用return块中的if来简化它,而不是设置一个标志变量(如果真的应该给出一个比a更有意义的名称,那么你打算保留它。)

这是同一算法的简化版本。我添加了一些改进,例如在int(sqrt(n))之后停止范围,并仅迭代奇数值(因为2在开始时由特殊情况处理)。我还明确地将None命名为返回值,以明确表示当n是复合时,有意返回该值(裸return使其看起来像就像None应该被忽略一样):

def isprime(n):    
    if n==1:
        return None
    if n==2:
        return 2
    for i in range(3,int(math.sqrt(n))+1,2):
        if n%i==0:
            return None
    return n