Python语法问题

And*_*ndy 0 python primes

我刚刚回到Project Euler并且丢失了我的帐户和解决方案,所以我回到了问题7.但是,我的代码不起作用.对我来说这似乎相当原始,有人可以帮助我调试我的(短)脚本吗?

应该找到10001 Prime.

#!/usr/bin/env python
#encoding: utf-8
"""
P7.py

Created by Andrew Levenson on 2010-06-29.
Copyright (c) 2010 __ME__. All rights reserved.
"""

import sys
import os
from math import sqrt

def isPrime(num):
    flag = True
    for x in range(2,int(sqrt(num))):
        if( num % x == 0 ):
            flag = False
    if flag == True:
         return True
    else:
         return False

def main():
    i, n = 1, 3
    p = False
    end = 6
    while end - i >= 0:
        p = isPrime(n)
        if p == True:
            i = i + 1
            print n
        n = n + 1

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

编辑*:对不起,问题在于它说每个数字都是素数.:/

Ale*_*lli 5

语法很好(在Python 2中).语义有一些可避免的复杂性,这个一个一个错误:

for x in range(2,int(sqrt(num))):
    if( num % x == 0 ):
        flag = False
Run Code Online (Sandbox Code Playgroud)

range(2, Y)从2包括到Y 排除 - 所以你经常不检查最后一个可能的除数,从而认为"素数"不是很多数.作为最简单的修复,尝试1 + int(...range.之后,建议删除那些可避免的并发症:例如,

if somebool: return True
else: return False
Run Code Online (Sandbox Code Playgroud)

从来没有保证,因为更简单的return somebool做同样的工作.

整个代码的简化版本(只有必不可少的优化,但在其他方面完全相同的算法)可能是,例如:

from math import sqrt

def isPrime(num):
    for x in range(3, int(1 + sqrt(num)), 2):
        if num % x == 0: return False
    return True

def main():
    i, n = 0, 3
    end = 6
    while i < end:
        if isPrime(n):
            i += 1
            print n
        n += 2

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

"一旦你知道答案就回来了"已经解释了,我已经添加了一个更为关键的优化(+ = 2,而不是1 n,因为我们"知道"甚至数字> 3不是素数,并且调整了在range出于同样的原因).

有可能变得可爱,例如:

def isPrime(num):
    return all(num % x for x n range(3, int(1 + sqrt(num)), 2))
Run Code Online (Sandbox Code Playgroud)

虽然如果你不熟悉all内置内容,这可能看起来不那么"简单" ,但实际上是这样,因为它可以节省你必须做的事情(代码的读者必须遵循)低级别逻辑,有利于适当的级别用于表达函数关键思想的抽象,即"当尝试除法时所有可能的奇数除数具有[[非0]]余数时,"num是素数"(即,以精确的,可执行的形式直接表达概念) .内部算法实际上仍然相同.

更进一步......:

import itertools as it

def odd():
    for n in it.count(1):
        yield n + n + 1

def main():
    end = 5        
    for i, n in enumerate(it.ifilter(isPrime, odd())):
        print n
        if i >= end: break
Run Code Online (Sandbox Code Playgroud)

同样,这只是与以前相同的算法,只是在更合适的抽象层次上表达:生成奇数的序列(从3包括向上)放入自己的odd生成器,并使用enumerate内置的和itertools功能,以避免不适当(和不需要)的低级表达/推理.

我再说一遍:还没有应用基本优化 - 只是合适的抽象.Python中无限连续质数生成的优化(例如通过开放式Eratosthenes Sieve方法)已在其他地方进行了深入讨论,例如此处(请务必查看注释!).在这里,我重点说明如何(内置插件,例如enumerate,allany,关键itertools,加上生成器和生成器表达式)许多"循环"问题可以在现代Python中以更合适的抽象级别表达,而不是"C级",对于大多数编程人员来说,这些问题对于C编程等都是最自然的.(对于习惯于Stepanov首先确定的C++的"抽象惩罚"的学者来说,可能令人惊讶的是,Python通常倾向于具有"抽象溢价",特别是如果itertools以其超快的速度而众所周知的,它被广泛适当地使用......但是,这是真的是一个不同的主题;-).