Python:素数和 in range()

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

我正在学习Python并正在研究这个问题: Python - 素数练习 这是我的问题: 当 n=2 时,范围将为 (2,n),换句话说,范围在 2 和 2-1=1 之间。

   for x in range(2, n):
      if n % x == 0:
        print("{} equals {} x {}".format(n, x, n // x))
        return False
   else:
      print(n, "is a prime number")
      return True

a.会是2%2吗?

b.如果数字是偶数,则会打印

A 等于 B x C

一旦条件为真,循环会中断还是会完成循环?

c. else 是在循环之外吗? if 语句是否对应呢? (我知道它是

if n % x == 0:
)但为什么它看起来像是在循环之外? 我尝试运行它并理解,但后来我感到困惑。

python python-3.x range iteration
4个回答
3
投票

为了..否则会造成混乱

您似乎对

else
感到困惑,它是
for
循环的一部分。

你不是唯一一个。

在Python中,

for
循环可能在最后的
else
部分,除非有
break
语句,否则在所有循环完成后执行。是的,这不是很直观。

因此,您应该将

else
部分阅读为
for
循环的最后一部分。

def looptest(loops=5):
    for i in range(loops):
        print "i", i
        if i == 3:
            print "in if"
            return
    else:    
        print "in else of the loop"

并尝试循环== 5:

>>> looptest(5)
i 0
i 1
i 2
i 3
in if

对于循环数 2,我们不期望返回,我们将运行循环的

else

>>> looptest(2)
i 0
i 1
in else of the loop

注意,

return
必须在函数内,尝试在控制台返回会导致错误。

范围(2, 2) == []

在Python控制台上尝试:

>>> range(2, 2)
[]

返回

return 结束当前函数或在整个模块中运行。因此,在

return
之后,代码同一部分中不再执行任何代码(除了
try
finally
、上下文管理器等例外,但这与您的代码无关)。


1
投票

看一下这个函数:

def isPrime(n):
    for i in range(2, int(n**0.5) + 1):
        if n % i ==0:
            return False
    return True

迭代每一个可能的选项并不一定是最好的选择;请记住,范围永远不会大于数字的平方根。

还值得注意的是,您的输出将仅打印第一组因子。


1
投票

a.不。

range(2,2)
在 Python 中是一个空集。

b.一旦条件为真,包含循环的函数就会返回,并且循环不会结束。 这是因为

return
调用比
if
语句低一级。

c.我很确定您希望

else
for
相对应。 Python 有这个 for...else 语法,如果
else
循环正常终止(即没有
for
),则执行
break
子句的内容。

换句话说,我想你想要这个:

for x in range(2, n):
        if n % x == 0:
            print("{} equals {} x {}".format(n, x, n // x))
            return False
else:
     print(n, "is a prime number")
     return True

编辑:

当然,我可以解释整个循环。 这个想法是这样的:对于 2 到 n 之间的每个数字,检查该数字是否是 x 的因子。 如果是,那么 n 不是素数,我们就终止循环。 然而,如果我们一直到循环结束,我们就知道 n 是素数,因为它没有 2 和 n 之间的因数。 然后 else 子句启动,并打印该数字是质数。


0
投票

fermets 公式是最简单的一种,但由于使用幂计算,可能会存在内存效率问题(除平方根法和 AKS 法外)

def prime(n):
    # you can replace the 2 with any coprime number
    if (n < 2): return False;
    if 2**(n-1)%(n) == 1: return True;
    return False

def range_primes(r):
    p = [2];
    for i in range(1, r):
        if prime(i) == True:
            p.append(i);
    return p;

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