programing tip

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

itbloger 2020. 6. 16. 20:37
반응형

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


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

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기능과 당신이 가지고있는 가능성 중 하나가에 세미콜론을 추가하는 것입니다 자세한 지나치게 즉시이라고, 문 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

" Pythons Attack " 의 인용문

세미콜론으로 모든 문장을 끝내지 마십시오. 기술적으로는 파이썬에서이 작업을 수행하는 것이 합법적이지만 한 줄에 둘 이상의 문을 배치하지 않는 한 (예 : x = 1; y = 2; z = 3) 완전히 쓸모가 없습니다.


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


한 줄에 여러 문장은 세미콜론을 구분 기호로 포함 할 수 있습니다. 예를 들면 다음과 같습니다. http://docs.python.org/reference/compound_stmts.html 귀하의 경우 디버거에 침입 할 지점을 쉽게 삽입 할 수 있습니다.

또한 Learning Python Book 에서 Mark Lutz가 언급했듯이 세미콜론으로 모든 진술 을 종료하는 것은 기술적으로 합법적입니다 (불필요하고 성가시다) .


파이썬은 세미콜론을 사용하여 한 줄에 둘 이상의 명령문을 포함하는 경우 명령문의 끝을 표시 할 수 있습니다.


세미콜론은 한 줄에 두 개 이상의 명령을 사용할 수 있습니다. 그것들을 사용할 필요는 없지만 제한되지 않습니다.

The semicolon ( ; ) allows multiple statements on the single line given that neither statement starts a new code block.

http://www.tutorialspoint.com/python/python_basic_syntax.htm


Semicolons (like dots, commas and parentheses) tend to cause religious wars. Still, they (or some similar symbol) are useful in any programming language for various reasons.

  • Practical: the ability to put several short commands that belong conceptually together on the same line. A program text that looks like a narrow snake has the opposite effect of what is intended by newlines and indentation, which is highlighting structure.

  • Conceptual: separation of concerns between pure syntax (in this case, for a sequence of commands) from presentation (e.g. newline), in the old days called "pretty-printing".

Observation: for highlighting structure, indentation could be augmented/replaced by vertical lines in the obvious way, serving as a "visual ruler" to see where an indentation begins and ends. Different colors (e.g. following the color code for resistors) may compensate for crowding.


I realize I am biased as an old C programmer, but there are times when the various Python conventions make things hard to follow. I find the indent convention a bit of an annoyance at times.

Sometimes, clarity of when a statement or block ends is very useful. Standard C code will often read something like this:

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

continue doing things;

where you use the whitespace for a lot of clarity - and it is easy to see where the loop ends.

Python does let you terminate with an (optional) semicolon. As noted above, that does NOT mean that there is a statement to execute followed by a 'null' statement. SO, for example,

print(x);
print(y);

Is the same as

print(x)
print(y)

If you believe that the first one has a null statement at the end of each line, try - as suggested - doing this:

print(x);;

It will throw a syntax error.

Personally, I find the semicolon to make code more readable when you have lots of nesting and functions with many arguments and/or long-named args. So, to my eye, this is a lot clearer than other choices:

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

since, to me, it lets you know that last ')' ends some 'block' that ran over many lines.

I personally think there is much to much made of PEP style guidelines, IDEs that enforce them, and the belief there is 'only one Pythonic way to do things'. If you believe the latter, go look at how to format numbers: as of now, Python supports four different ways to do it.

I am sure I will be flamed by some diehards, but the compiler/interpreter doesn't care if the arguments have long or short names, and - but for the indentation convention in Python - doesn't care about whitespace. The biggest problem with code is giving clarity to another human (and even yourself after months of work) to understand what is going on, where things start and end, etc.


It's allowed because authors decided to allow it: https://docs.python.org/2/reference/simple_stmts.html

If move to question why authors decided todo so, I guess it's so because semi-column is allowed as simple statement termination at least in the following langages: C++, C, C#, R, Matlab,Perl,...

So it's faster to move into usage of Python for people with background in other language. And there are no lose of generality in such deicison.

참고URL : https://stackoverflow.com/questions/8236380/why-is-semicolon-allowed-in-this-python-snippet

반응형