繁体   English   中英

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

[英]removing "none" result from the function which prints the prime number

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

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 的结果是 None

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

if a==0:
    return

如果你打印一个什么都不返回的函数的值,它会打印None

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

在要求您打印出一些内容以获得“基本案例”的方法中,通常是一种很好的做法,因为您永远不应该得到一个无类型,因为您将始终将某些内容返回给打印/调用函数。

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')

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

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

但是您的isprime函数实际上并没有正常工作。 对于 2 或 3 以外的任何值,它将始终返回None

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

只需使用:

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

没有else块。

请注意,您可以通过在if块中使用return而不是设置标志变量来稍微简化它(如果您确实打算保留它,则应该为其提供一个比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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM