Python 튜토리얼에서 break 명령을 사용할 때 발생하는 문제
문제
나는 해당 사이트에서 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
. 그래서 나는 그러한 정체에 대한 설명이 없습니다. 나는 방금 파이썬을 배우기 시작했지만.