2012-04-22 9 views
1

아래의 프로그램은 주어진 범위에서 소수를 찾습니다. noprimes 목록 이해 부분에 대해 왜 우리는 3 개의 매개 변수를 범위 내에 가지고 있습니까?파이썬 for 루프의 이해 범위

noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] 
primes = [x for x in range(2, 50) if x not in noprimes] 
print prime 

나는 무엇을하고 있습니까?

+5

1 단계 : 설명서를 읽었습니까? 문서가 좋습니다. 이것은 대부분의 질문에 대한 답을 이와 같이 설명합니다. –

답변

15

the docs 참조 :

range([start], stop[, step]) 

, 예를 들어 for(..; ..; ..) 루프에 비교하면 C의 세 가지 인수는 다음과 같이 사용됩니다 : 워드 프로세서의 좋은 예도있다

for(int i = start; i != stop; i += step) 

: range()를 들어

>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> range(1, 11) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> range(0, 30, 5) 
[0, 5, 10, 15, 20, 25] 
>>> range(0, 10, 3) 
[0, 3, 6, 9] 
>>> range(0, -10, -1) 
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9] 
>>> range(0) 
[] 
>>> range(1, 0) 
[] 
+2

+1 * 문서 *를 읽으십시오. –

4

는, 기본적인 아이디어는 당신을 위해 항목의 시퀀스를 생성하는 것입니다. 여기에 한편

format: range([start], stop[, step]) 

몇 가지 기본적인 설명입니다, 가장 쉬운 예 : 참조 http://docs.python.org/library/functions.html#range으로 이것을 참조

range(5) 

0 (기본 시작 값)의 범위 시작에 번호를 생성하고 최대 이동 하지만 하지 당신은 추가 매개 변수를 지정할 수 있도록, 1 (기본값)의 단위로,

In [1]: range(5) 
Out[1]: [0, 1, 2, 3, 4] 

5 등 s를 시작 값, 끝 값 및 단계 값과 같은 범위로 설정합니다. 그래서 range(startval, endval, stepval). endval이 아니며 생성 된 시퀀스에 포함 된이 아닙니다.

range(0, 5, 1) 

는 예를 들어 이전에 파이썬 3 range에이 목록과 xrange를 생성하는

range(0, 21, 2) 

참고 할 수있는 0에서 20 사이의 모든 짝수를 생성하려면

range(5) 

에 해당 요구시 번호 순서를 생성합니다.

특정 코드에는 목록의 내포와 범위가 사용됩니다. 더 명확한 아이디어를 얻으려면 목록 이해력을 일시적으로 제거하여 범위가있는 for 루프의 알고리즘과 역할을 이해하는 것이 더 쉽습니다. 목록 이해력은 강력하고 효율적인 구문이며 원래 코드를 유지하려는 경우 반드시 사용해야합니다.

#noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] 
noprimes = [] 
for i in range (2, 8): 
    for j in range (i*2, 50, i): 
     noprimes.append(j) 

# primes = [x for x in range(2, 50) if x not in noprimes] 
primes = [] 
for x in range(2, 50): 
    if x not in noprimes: 
     primes.append(x) 
+0

두 downvotes에 대한 설명을 얻을 수 있을까요? – Levon

0

범위의 세 매개 변수는 ThiefMaster가 설명했습니다. 코드에 대해서는 코드가 괜찮아 보입니다. 유일한 문제는 print prime 라인 인 것 같습니다.어쩌면 당신은 기본적으로 당신이 i의 배수 (분명히 어떤 여러 비 프라임)를 생성하는 이 아닌 소수i에 의해 스테핑하고

for prime in primes : 
    print prime 
1

을 추가해야합니다. irange(2,8), 즉 [2, 3, 4, 5, 6, 7]에 있습니다. 소수점 이하 자릿수는 sqrt(50) (약) 일 때까지 배수를 제거해야하기 때문입니다.

중첩 목록 이해가 혼동을 일으키는 경우 쉽게 이해할 수 있도록 단계별로 해보십시오.

>>> [j for i in [2] for j in range(i*2, 50, i)] 
[4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48] 
>>> [j for i in [3] for j in range(i*2, 50, i)] 
[6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48] 

더 나은 소수 알고리즘에 대해 온라인으로 살펴보십시오. 이것은 알고리즘 적으로 매우 열악합니다.

+0

감사합니다. Praveen, 목록 이해력과 범위를 이해하고 싶었으니 지금은 더 명확하게 작성해야합니다. – Varun