首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语句具有多个If-断开条件。

语句具有多个If-断开条件。
EN

Stack Overflow用户
提问于 2015-08-02 08:42:10
回答 2查看 76关注 0票数 2

我编写了一个简单的python模块,它使用bool标志is_prime返回给定N的素数,如下所示:

代码语言:javascript
复制
def generate_primes_up_to(M):
    n = 2
    primes = []    
    while n <= M:
        is_prime = True
        for p in primes:
            if p**2 > n: break
            if n % p == 0:
                is_prime = False
                break
        if is_prime: primes.append(n) 
        n += 1
    return primes

if __name__ == '__main__':
    generate_primes_up_to(100)

其中产出:

代码语言:javascript
复制
[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]

现在,这实际上是使用for-else构造的理想情况,因为只有在n循环中没有发生break时,数字break才是素数。因此,我将函数更改为:

代码语言:javascript
复制
def generate_primes_up_to(M, flag='nonumpy'):
    n = 2
    primes = []    
    while n <= M:
        for p in primes:
            if p**2 > n: break
            if n % p == 0: break
        else: primes.append(n) 
        n += 1
    return primes

但是现在代码输出:

代码语言:javascript
复制
[2, 5, 27]

我不明白为什么if p**2 > n: break表达式会干扰for-else子句的流。如果删除该行,代码将再次生成正确的输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-02 08:47:25

引起问题的条件是-

代码语言:javascript
复制
if p**2 > n: break

让我们举一个例子- 7,当我们检查7是否是素数时,我们已经发现- [2,3,5]是素数,当我们检查3为大于73**2 = 9时,上面的条件破坏了for循环。

去掉这个条件,它就可以正常工作了(尽管它很慢)。

在原始循环中(没有for-else构造),它可以工作,因为在刚刚脱离循环的情况下,您没有更改标志is_prime

对于for..else构造,所发生的情况是,只有当我们退出循环而不使用break语句时,才会执行else部分。

但在上述情况下,我们使用break语句,因此不执行else部件。

票数 4
EN

Stack Overflow用户

发布于 2015-08-02 10:56:24

您也可以使用next

代码语言:javascript
复制
def generate_primes_up_to(M):
    n = 2
    primes = []
    while n <= M:
        if next((False for p in primes if not n % p), True):
            primes.append(n)
        n += 1

    return primes
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31770084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档