구문은 (파이썬 2) 괜찮습니다. 의미는 어떤 피할 합병증을 가지고 있으며,이 오프별로 한 버그 : 2 Y
에 포함를 제외에서
for x in range(2,int(sqrt(num))):
if(num % x == 0):
flag = False
range(2, Y)
간다 - 너무 자주 간주하는함으로써 가능한 마지막 제수를 확인하고 아니에요 " 소수 "는 많지 않은 숫자입니다. 가장 간단한 해결책으로 range
에서 1 + int(...
을 사용해보세요. 그 후, 그 피할 수있는 합병증을 제거하는 것이 좋습니다 : 예를 들어, return somebool
간단한이 같은 일을 같은
if somebool: return True
else: return False
은 보증되지 않습니다. 이미 설명했다
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()
는 "당신이 답을 알고 즉시 반환"
(그렇지 않으면 정확히 동일한 알고리즘 단지 필수 불가결 최적화 만 포함) 전체 코드의 단순화 된 버전은 예를 들어, 수 있습니다 우리는 멍청하지 않은 짝수가 3이고, 같은 이유로 range
의 비틀기가 있다는 것을 "알기 때문에"n
에 대해 1 대신에 더 중요한 최적화 (+ = 2, 1 대신에)를 추가했습니다.
그것은 예를 들어, 귀엽 얻을 가능성이 있지만
def isPrime(num):
return all(num % x for x n range(3, int(1 + sqrt(num)), 2))
당신이 그것을 저장하기 때문에 all
내장, 정말, 당신은 할 필요 익숙하지 않은 경우 "간단하게"보일 수 있습니다 함수의 핵심 아이디어를 표현하기위한 적절한 수준의 추상화에 찬성하여 저수준 논리를 따르는 코드 판독기 (및 코드 판독기)가 있습니다. 즉, 가능한 모든 모든 제수가 [[0이 아닌]] (즉, 정확하고 실행 가능한 형태로 개념을 직접 표현하십시오). 알고리즘은 실제로 여전히 동일합니다.
는 ... 더 나아가 : 포함 (3)로부터의 홀수의 시퀀스의 발생 (: 다시
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
, 이것은 이전과 마찬가지로, 단지 추상화보다 적절한 레벨로 표현 된 동일한 알고리즘 위쪽으로) 자신의
odd
생성기에 배치하고, 부적절한 (및 불필요한) 저수준 표현/추론을 피하기 위해
enumerate
내장 및
itertools
기능을 사용합니다.
반복 : 기본적인 최적화는 적용되지 않았습니다. 적절한 추상화 만 적용됩니다. Python에서 무제한 연속 소수 생성 (예 : 개방 끝이있는 에라 토 스테 네스 시브 (Erasosthenes Sieve) 접근법을 통한 최적화)은 다른 곳에서 심도있게 논의되었습니다. here (댓글도 확인해야합니다.) 여기서는 enumerate
, all
및 any
과 같은 내장 함수와 함께 중요한 숫자 인 itertools
에 발전기 및 생성기 표현식을 사용하여 많은 "루핑"문제를 현대 Python에서보다 적절한 추상화 수준으로 표현할 수있는 방법에 중점을 두었습니다. 대부분의 프로그래머에게 가장 자연스럽게 보일지도 모르는 "C-inspired"코드는 C 프로그래밍 등을 통해 개발되었습니다. (아마도 놀랍게도 Stepanov에 의해 처음 발견 된 C++의 "추상화 패널티"에 익숙한 학자들에게는 대단히 빠른 속도로 잘 알려진 itertools
이 광범위하고 적절하게 사용되는 경우 특히 일반적으로 파이썬은 "추상화 프리미엄"을 갖는 경향이 있습니다. 그건 정말 다른 주제입니다 ;-).
오류는 무엇이라고 말합니까? – SilentGhost
-1. 구문 문제는 "n + */3"입니다. 언제 작동합니까? 언제 작동하지 않습니까? 의도 한 행동과 어떤 점에서 다른가? –
미안하지만, 나는 "2010-06-29에 Andrew Levenson에 의해 작성되었습니다. Copyright (c) 2010 __ME__. 판권 소유." :) 범죄의 의미는 원시적 인 스크립트의 이런 종류의 스크립트는 이미 수천 개의 다른 사람들이 작성한 것임을 의미합니다. – houbysoft