[python] 이 파이썬 스 니펫에서 세미콜론이 허용되는 이유는 무엇입니까?

파이썬은 문장을 끝내기 위해 세미콜론을 사용할 것을 보증하지 않습니다. 그렇다면 왜 이것이 (아래) 허용됩니까?

import pdb; pdb.set_trace()



답변

파이썬은 문장을 끝내기 위해 세미콜론을 요구 하지 않습니다 . 같은 줄에 여러 명령문을 넣으려면 세미콜론 사용하여 명령문을 구분할 있습니다.

자, 이것이 허용됩니까? 단순한 디자인 결정입니다. 파이썬 에이 세미 콜론이 필요하다고 생각하지 않지만 누군가가 그것을 가지고 언어에 추가하는 것이 좋을 것이라고 생각했습니다.


답변

http://docs.python.org/reference/compound_stmts.html

복합 문장은 하나 이상의 ‘절’로 구성됩니다. 조항은 헤더와 ‘스위트’로 구성됩니다. 특정 복합 명령문의 절 헤더는 모두 동일한 들여 쓰기 레벨에 있습니다. 각 절 헤더는 고유 식별 키워드로 시작하고 콜론으로 끝납니다. 제품군은 조항에 의해 제어되는 명령문 그룹입니다. 스위트는 헤더 콜론 다음에 헤더와 동일한 행에있는 하나 이상의 세미콜론으로 구분 된 간단한 명령문이거나 후속 라인에서 하나 이상의 들여 쓰기 된 명령문 일 수 있습니다 . 스위트의 후자 만 중첩 된 복합 명령문을 포함 할 수 있습니다. 다음은 불법입니다. 대부분 다음 if 절이 어떤 if 절에 속하는지 명확하지 않기 때문입니다.

if test1: if test2: print x

또한이 컨텍스트에서 세미콜론은 콜론보다 더 밀접하게 바인딩되므로 다음 예에서는 인쇄 명령문이 모두 또는 전혀 실행되지 않습니다.

if x < y < z: print x; print y; print z 

요약 :

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | funcdef
                   | classdef
                   | decorated
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]


답변

파이썬은 ;종결자가 아닌 구분자로 사용합니다 . 또한 줄의 끝에서 그것들을 사용 하여 문장 종결 자로 보이게 있지만, 이것은 파이썬에서 빈 문장이 합법적이기 때문에 합법적입니다. 끝에 세미콜론을 포함하는 줄은 두 문장입니다. 하나의 공백.


답변

인터프리터의 세미콜론

답을 읽은 후에도 세미콜론을 사용하는 데있어 중요한 점이 하나도 없습니다.

인터프리터 REPL (Python 대화식 쉘, IDLE, ipython)에서 작업 할 때 마지막 표현식의 값이 화면에 인쇄되며 일반적으로 의도 된 동작입니다.

부작용에 대한 표현식 사용

그러나 경우에 따라 부작용에 대한 표현식 만 평가하려고합니다 (예 :로 표시 한 시뮬레이션 결과 참조) matplotlib.

이 경우에 (아마도) 당신의 한 화면보고 싶지 않아 repr의 S matplotlib때로는 호출에 의해 반환되는 객체 matplotlib적어도 IPython에, 기능을, 당신이 가지고있는 가능성 중 하나가에 세미콜론을 추가하는 것입니다 지나치게 verbose 문, 이제 IPython은 입력 행을 두 개의 표현식, matplotlib호출 및 널 명령문 으로 구성한 것으로 간주 하여 복합 표현식의 값이 None인터프리터에 의해 화면에 인쇄되지 않도록합니다 (다른 가능성은 할당 과 같이 할당 됨). _ = plot(...)그러나 나는 조금 더 방해가되는 것을 발견했다).

개인적인 말

IMHO는 인터프리터에서 원하지 않는 출력을 억제하기 위해 세미콜론을 사용하는 것이 IPyton 노트북을 도입 한 후 더욱 관련성이 높아져서 문서 및 최종 재사용을 위해 인터프리터 세션의 그래픽 출력을 포함한 입력 및 출력을 저장할 수 있습니다. .


답변

다른 사람들이 언급했듯이 세미콜론을 사용하여 문장을 분리 할 있습니다. 당신은하지 않습니다 로, 그것은 보통의 스타일이 아니다.

이것이 왜 유용한 지에 대해, 어떤 사람들은 두 줄 이상의 사소한 짧은 문장을 한 줄에 넣기를 좋아합니다. .

그러나을 사용하여 쉘에서 Python 하나의 라이너를 호출 할 때 거의 요구 사항 python -c '<some python code>'입니다. 여기 에서는 들여 쓰기를 사용하여 문을 구분할 수 없으므로 한 줄짜리 줄이 실제로 두 줄짜리 줄인 경우 세미콜론을 사용해야합니다. 그리고 하나의 라이너에 다른 인수를 사용하려면에 가져 오기 sys위해 sys.argv별도의 import명령문 이 필요합니다 . 예 :

python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4
1 2 3 4 5


답변

나는 오래된 C 프로그래머로 편견이 있지만 다양한 파이썬 규칙으로 인해 따르기가 어려울 때가 있습니다. 나는 들여 쓰기 규칙이 때때로 약간의 성가심을 발견합니다.

때로는 문장이나 블록이 끝나는 시점의 명확성이 매우 유용합니다. 표준 C 코드는 종종 다음과 같이 읽습니다.

for(i=0; i<100; i++) {
    do something here;
    do another thing here;
}

continue doing things;

명확성을 위해 공백을 사용하는 위치-루프가 끝나는 위치를 쉽게 확인할 수 있습니다.

파이썬은 (선택적) 세미콜론으로 끝나도록합니다. 위에서 언급했듯이, 이는 ‘null’문 다음에 실행할 명령문이 있음을 의미하지 않습니다. 예를 들어

print(x);
print(y);

와 같다

print(x)
print(y)

첫 번째 줄의 끝에 각 줄 끝에 null 문이 있다고 생각되면 제안대로-이 작업을 수행하십시오.

print(x);;

구문 오류가 발생합니다.

개인적으로, 나는 많은 인수 및 / 또는 이름이 긴 인수가있는 많은 중첩 및 함수가있을 때 코드를 더 읽기 쉽도록 세미콜론을 찾습니다. 내 눈에는 다른 선택보다 훨씬 명확합니다.

if some_boolean_is_true:
    call_function(
        long_named_arg_1,
        long_named_arg_2,
        long_named_arg_3,
        long_named_arg_4
    );

나에게 그것은 마지막 ‘)’가 많은 줄에 걸쳐있는 ‘블록’을 끝내는 것을 알려줍니다.

필자는 개인적으로 PEP 스타일 가이드 라인, 가이드 라인을 적용하는 IDE, 그리고 ‘한 가지 일을하는 단 하나의 파이썬 방식’이라는 믿음이 많이 있다고 생각합니다. 후자를 믿는다면 숫자의 형식을 지정하는 방법을 살펴보십시오. 현재 파이썬은 4 가지 다른 방법으로 지원 합니다.

필자는 일부 diehards에 화를 낼 것이라고 확신하지만 컴파일러 / 인터프리터는 인수의 이름이 길거나 짧은 이름을 신경 쓰지 않지만 파이썬의 들여 쓰기 규칙은 공백을 신경 쓰지 않습니다. 코드의 가장 큰 문제는 다른 사람 (그리고 심지어 수개월 동안 일한 후에도)에게 무슨 일이 일어나고 있는지, 일이 시작되고 끝나는 곳 등을 명확하게하는 것입니다.


답변

세미콜론은 유효한 구문의 일부입니다. 8. 복합 문장 (파이썬 언어 참조)