의 차이는 무엇인하는 동안"1"그리고는 동안"True"?
-
20-09-2019 - |
문제
나는 두 가지를 보았을 만드는 방법에는 무한 루프에서는 파이썬:
while 1: do_something()
while True: do_something()
은 거기에 사이에 어떤 차이를 이?하나 더 pythonic 다른 것보다?
해결책
기본적으로 중요하지 않은,사소한에 영향을 주지 않는지 무언가가'pythonic'나지 않습니다.
에 관심이 있는 경우 그러나 퀴즈,약간의 차이가 있습니다.
이 내장 부울 형식이 존재하지 않을 때까 Python2.3 그래서 코드를 실행하도록 고대의 버전이 사용하는
while 1:
형태입니다.당신이 그것을 참조 표준 라이브러리,위해 인스턴스입니다.진실하고 거짓 내부 명령은 지 않 예약어 사전 Python3 그래서 될 수 있는 담당자,변화하고 자신의 값입니다.이는 경우와 위기 때문에 할 수 있는 코드
True = 1
호환성을 위해지만,이 경우 이름True
해야에 globals 사전에 모든 시간이 사용됩니다.기 때문에 상기의 제한 바이트 코드의 두 가지 버전을 컴파일을 다른 Python2 이에 최적화를 위해 일정한 정수할 수 있는지에 대 한 사용
True
.파이썬 때문에 말할 수 있는 컴파일할 때1
는 항상 non-zero,제거 점프와 조건부 로드하지 않는다고 지속적인 모:>>> import dis >>> def while_1(): ... while 1: ... pass ... >>> def while_true(): ... while True: ... pass ... >>> dis.dis(while_1) 2 0 SETUP_LOOP 5 (to 8) 3 >> 3 JUMP_ABSOLUTE 3 6 POP_TOP 7 POP_BLOCK >> 8 LOAD_CONST 0 (None) 11 RETURN_VALUE >>> dis.dis(while_true) 2 0 SETUP_LOOP 12 (to 15) >> 3 LOAD_GLOBAL 0 (True) 6 JUMP_IF_FALSE 4 (to 13) 9 POP_TOP 3 10 JUMP_ABSOLUTE 3 >> 13 POP_TOP 14 POP_BLOCK >> 15 LOAD_CONST 0 (None) 18 RETURN_VALUE
그래서, while True:
은 좀 더 쉽게 읽기,고 while 1:
조금 더 친절하 old versions of Python.당신이 필요하지 않에서 실행하는 파이썬 2.2 이 일에 대해 걱정할 필요가 바이트 코드의 수 루프 전 소폭 하락하는 것이 바람직하다.
다른 팁
가장 피스닉적인 방법은 항상 가장 읽기 쉬운 방법입니다. 사용 while True:
정말 중요하지 않습니다. 개인적으로는 읽거나 이해하기가 어렵지 않습니다. while True
, 조금 더 명백합니다.
보다 일반적으로, 사람들이 파이썬으로 쓰는 중단 루프는 다른 것이 될 수 있습니다. 때때로 나는 사람들이 글을 쓰는 것을 본다 i = 0; while True: i += 1 ...
, 대체 할 수 있습니다 for i in itertools.count()
그리고 사람들은 글을 쓰고 있습니다 while True: foo = fun() if foo is None: break
이것이 쓸 수있을 때 for foo in iter(fun, None)
, 학습이 필요하지만 보일러 플레이트와 어리석은 실수에 대한 기회가 적습니다.
어느 것도 아니다.
둘 다 내가 찾는 코드를 스캔해야한다는 것을 의미합니다. break
, 그 위치가 속한 위치를 바로 볼 수있는 대신.
나는 가능한 한 이런 종류의 것을 피하려고 노력하고 가능하지 않으면 코드가 다음과 같이 말하게하십시오.
while not found_answer:
check_number += 1
if check_number == 42:
found_answer = True
편집하다: 위의 "피하기"라는 단어는 충분히 명확하지 않은 것 같습니다. 기본적으로 무한 루프를 사용하여 루프 내 어딘가에서 둡니다 (사용 break
) 일반적으로 완전히 피해야합니다. 때로는 불가능합니다. 이 경우 위의 코드와 같은 것을 사용하고 싶습니다. 그러나 여전히 같은 개념을 나타냅니다 – 위의 코드는 타협에 지나지 않습니다 -하지만 적어도 루프의 목적을 보여줄 수 있습니다. 처음에 - 내가 함수를 부르지 않는 것처럼 do_something_with_args(*args)
.
나는 이것이 대부분 스타일의 문제라고 생각합니다. 둘 다 무한 루프로 쉽게 이해할 수 있어야합니다.
그러나 개인적으로 나는 두 번째 옵션을 선호합니다. 특히 C 배경이없는 프로그래머에게는 이해하는 데 정신적 미세 단계가 덜 걸리기 때문입니다.
첫 번째는 초기 버전에서도 작동합니다. True
아직 정의되지 않았습니다.
유한 한 시간 안에 종료되는 알고리즘이 있다면, 나는 이것을 추천합니다. while True
:
maxiter = 1000
for i in xrange(maxiter):
# your code
# on success:
break
else:
# that algorithm has not finished in maxiter steps! do something accordingly
IMO 두 번째 옵션은 더 많습니다 분명한.
당신이 제거 할 수 있다면 while
더 많은 소형 코드를 작성하십시오.
예를 들어:
# Get the even numbers in the range 1..10
# Version 1
l = []
n = 1
while 1:
if n % 2 == 0: l.append(n)
n += 1
if n > 10: break
print l
# Version 2
print [i for i in range(1, 11) if i % 2 == 0]
# Version 3
print range(2, 11, 2)
나는 두 번째 표현이 더 명백하다고 생각합니다. 피티닉.
이것은 스타일의 문제 일 뿐이며 모든 프로그래밍 초보자는 옵션 중 하나를 이해합니다.
그러나 두 번째 옵션은 경우에만 작동합니다 True
할당되지 않았습니다 False
, 파이썬 3까지 가능했습니다.
>>> True = False
>>> True
False
더 나은 방법은 조건부가 루프에서 나오는 "사실"입니다.