문제

나는 해당 사이트에서 Python 튜토리얼을 따르고 있으며 현재 중단 계속 섹션에 있습니다.방금 이 샘플 코드를 사용해 보았습니다.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x
...             break
...     else:
...         # loop fell through without finding a factor
...         print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

그리고 위에서 말한 내용을 뱉어내는 대신에 나는

3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

내 생각에는 for 루프 내부를 계속 실행하는 것 같지만 튜토리얼에서는 왜 이것을 고려하지 않습니까?최신 통역사 빌드에서는 구식입니까(저는 xubuntu jaunty를 실행하고 있습니다)?

줄을 추가해서 고칠 수 있었어요

     else:
...                     if n != y:
...                             print n, 'is a prime number'
...                             y = n

하지만 이것이 나쁜 코딩 습관일지도 모른다는 걱정이 듭니다.도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

표시되는 출력에는 다음이 포함됩니다. 문자열 "을 곱합니다.엑스 소수이다."그러나 이 문자열은 else 내부 루프의 절은 그대로 실행됩니다. 많으면 내부 루프를 실행할 때마다 한 번씩.

외부 루프는 8번의 반복을 수행하므로 "엑스 소수입니다."는 다음보다 많이 인쇄할 수 없습니다. 여덟 타임스.따라서 표시되는 출력은 할 수 없다 표시된 코드에 의해 발생합니다.

결론:뭔가 수상해요.코드를 실행했을 때 코드를 보여줄 수 있나요?


편집하다:해결되었습니다!

else 절을 ​​잘못 들여쓰기하여 Python이 해당 절을 다음 절에 속하는 것으로 해석했습니다. if 성명.Python은 탭을 다음과 같이 처리합니다. 8 공백.아마도 편집기에 탭이 다음과 같이 표시될 수 있습니다. 4 공백.그렇게 하면 이 버그를 놓칠 수도 있습니다.에 따라 PEP 8, 탭과 공백을 혼합하지 마십시오. 코드를 들여쓰기하려면 공백 4개를 사용하는 것이 좋습니다.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x 
...             break
...         else:
...             # loop fell through without finding a factor
...             print n, 'is a prime number'
... 
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

다른 팁

내 가장 좋은 추측은 당신의 'else :'진술이 제대로 들여 쓰기되지 않았다는 것입니다. 그러면 결과가 논리적이어서 다른 사람들의 들여 쓰기가 'x'와 레벨에 있는지 확인하십시오.

즉, 당신은 사용합니다 :

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
        else:
            print(n, 'is a prime')

대신에:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
    else:
        print(n, 'is a prime')

Python 통역사를 업데이트해야 할 수도 있습니다.

이 코드는 저를 위해 올바르게 실행됩니다 (Python 버전 번호 참조) :

Python 2.6.1 (r261:67515, Dec  6 2008, 16:42:21) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for n in range(2, 10):
...      for x in range(2, n):
...          if n % x == 0:
...              print n, 'equals', x, '*', n/x
...              break
...      else:
...          # loop fell through without finding a factor
...          print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

나는 당신이 들여 쓰기를 잘못했다고 생각합니다. 내가 당신의 코드를 가져 와서 다른 코드를 들여다 보면 IF 문에 따라 다니면, 나는 당신이 얻는 출력을 정확히 얻습니다.

아래 코드는 출력을 재현하고

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
        else:
            # loop fell through without finding a factor
            print n, 'is a prime number'

동안

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
    else:
        # loop fell through without finding a factor
        print n, 'is a prime number'

당신이 원하는 일을합니다.

다른 사람들의 들여 쓰기에서 다른 것을 주목하십시오.

나는 그렇게 생각했다 else 항상 정렬해야합니다 if. 그것이 내가 읽은 것입니다. 그러나이 소수 생성기 코드에서 한 번 프라임을 작성하는 유일한 방법은 정렬됩니다. else ~와 함께 for x. 그래서 나는 그러한 정체에 대한 설명이 없습니다. 나는 방금 파이썬을 배우기 시작했지만.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top