문제

나는 두 가지를 보았을 만드는 방법에는 무한 루프에서는 파이썬:

  1. while 1:
        do_something()
    
  2. while True:
        do_something()
    

은 거기에 사이에 어떤 차이를 이?하나 더 pythonic 다른 것보다?

도움이 되었습니까?

해결책

기본적으로 중요하지 않은,사소한에 영향을 주지 않는지 무언가가'pythonic'나지 않습니다.

에 관심이 있는 경우 그러나 퀴즈,약간의 차이가 있습니다.

  1. 내장 부울 형식이 존재하지 않을 때까 Python2.3 그래서 코드를 실행하도록 고대의 버전이 사용하는 while 1: 형태입니다.당신이 그것을 참조 표준 라이브러리,위해 인스턴스입니다.

  2. 진실하고 거짓 내부 명령은 지 않 예약어 사전 Python3 그래서 될 수 있는 담당자,변화하고 자신의 값입니다.이는 경우와 위기 때문에 할 수 있는 코드 True = 1 호환성을 위해지만,이 경우 이름 True 해야에 globals 사전에 모든 시간이 사용됩니다.

  3. 기 때문에 상기의 제한 바이트 코드의 두 가지 버전을 컴파일을 다른 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

더 나은 방법은 조건부가 루프에서 나오는 "사실"입니다.

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