programing

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

bestprogram 2023. 7. 6. 22:25

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

Python은 세미콜론 투 엔드 문의 사용을 보장하지 않습니다.

그렇다면 왜 (아래) 이것이 허용됩니까?

import pdb; pdb.set_trace()

Python은 문을 종료하는 데 세미콜론이 필요하지 않습니다.여러 개의 문을 같은 줄에 배치하려는 경우 세미콜론을 사용하여 문을 구분할 수 있습니다.

자, 이것이 허용되나요?이것은 간단한 디자인 결정입니다.파이썬은 이 세미콜론 같은 것이 필요하지 않다고 생각하지만, 누군가가 있으면 좋겠다고 생각해서 언어에 추가했습니다.

8. 복합 문에서:

복합 문은 하나 이상의 '절'로 구성됩니다.절은 헤더와 '스위트'로 구성됩니다.특정 복합 문의 절 헤더는 모두 동일한 들여쓰기 수준에 있습니다.각 절 머리글은 고유 식별 키워드로 시작하고 콜론으로 끝납니다.집합은 절에 의해 제어되는 문 그룹입니다.스위트는 헤더의 콜론 뒤에 있는 헤더와 동일한 행에 있는 하나 이상의 세미콜론으로 구분된 단순 문이거나 후속 행에 있는 하나 이상의 들여쓰기된 문일있습니다.모음의 후자 형식만 중첩된 복합 문을 포함할 수 있습니다. 다음은 주로 다음 절이 어떤 절에 속하는지 명확하지 않기 때문에 불법입니다.

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)* [";"]

은 Python 다을사다니를 합니다.;종결자가 아닌 분리자로 사용됩니다.줄의 끝에 사용할 수도 있습니다. 이것은 줄의 끝에 있는 문장을 종료자처럼 만들 수도 있습니다. 그러나 이것은 Python에서 빈 문장이 합법적이기 때문에 합법적입니다. 끝에 세미콜론이 포함된 행은 두 개의 문장이고 두 번째는 공백입니다.

인터프리터의 세미콜론

답을 읽어보니 세미콜론을 사용하는 것의 중요한 한 가지 측면이 아직도 그립습니다. 아마도 그것이 진정으로 변화를 가져오는 유일한 측면일 것입니다.

인터프리터 REP(Python 대화형 셸, IDLEIPython)에서 작업하는 경우 마지막 식의 값이 화면에 인쇄되며 일반적으로 이 값이 의도된 동작입니다.

부작용에 대한 표현식 사용

그러나 일부 경우에는 부작용에 대해서만 표현식을 평가하려고 합니다. 예를 들어, 다음과 같이 표시된 시뮬레이션 결과를 확인하기 위해matplotlib.

에는 ( 이 가득 차 있는 싶지 않을 입니다.reprmatplotlib때때로 호출에 의해 반환되는 객체matplotlib함수와, 적어도 IPython에서, 당신이 가진 가능성 중 하나는 지나치게 장황한 문장에 세미콜론을 추가하는 것입니다, 이제 IPython은 입력 라인이 두 개의 식으로 구성되어 있다고 봅니다,matplotlib이 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "None그리고 통역사에 의해 화면에 인쇄되는 것은 없습니다. (다른 가능성은 할당일 수 있습니다.)_ = plot(...)하지만 저는 그것이 조금 더 거슬린다고 생각합니다).

개인적인 발언

인터프리터에서 원하지 않는 출력을 억제하기 위해 세미콜론을 사용하는 것은 IPython 노트북의 도입 이후 더욱 중요해졌습니다. 이 노트북은 인터프리터 세션의 입력과 출력(그래픽 출력 포함)을 문서화 및 최종 재사용을 위해 저장할 수 있게 합니다.

다른 모든 사용자가 언급했듯이 세미콜론을 사용하여 문을 구분할 수 있습니다.그럴 필요도 없고, 평소 스타일도 아닙니다.

이것이 유용한 이유에 대해, 어떤 사람들은 두 개 이상의 정말 사소한 짧은 문장을 한 줄에 놓는 것을 좋아합니다. (개인적으로 저는 이것이 쉽게 스킴된 여러 개의 사소한 선을 하나의 복잡한 선으로 바꾸고 그것이 사소한 것이라고 보는 것을 어렵게 만든다고 생각합니다.)

그러나 이것은 셸에서 파이썬 원 라이너를 호출할 때 거의 필요합니다.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 프로그래머로서 편견을 가지고 있다는 것을 알지만, 다양한 Python 규약 때문에 따라 하기 어려울 때가 있습니다.나는 때때로 들여쓰기 규약이 약간 성가신 것을 느낍니다.

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

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

continue doing things;

공백을 사용하여 많은 명확성을 확보할 수 있으며 루프가 끝나는 위치를 쉽게 확인할 수 있습니다.

Python을 사용하면 세미콜론(선택 사항)으로 종료할 수 있습니다.위에서 언급한 바와 같이 실행할 문이 있고 그 뒤에 '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, 그리고 '일을 하는 데 단 하나의 파이썬적인 방법'이라는 믿음으로 만들어진 것이 많다고 생각합니다.만약 당신이 후자를 믿는다면, 숫자를 포맷하는 방법을 살펴보세요: 현재, Python은 그것을 하는 네 가지 다른 방법을 지원합니다.

나는 내가 몇몇 다이하드에 의해 비난받을 것이라고 확신하지만, 컴파일러/인터프리터는 인수가 긴 이름이든 짧은 이름이든 상관하지 않으며, 파이썬의 들여쓰기 규칙에 대해서는 공백에 대해서는 신경 쓰지 않습니다.코드의 가장 큰 문제는 다른 사람(그리고 심지어 몇 달 동안 일한 후의 자신)에게 무슨 일이 일어나고 있는지, 무엇이 시작되고 어디서 끝나는지 등을 이해할 수 있도록 명확성을 부여하는 것입니다.

"피톤스가 공격할 때"의 인용구

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

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

줄에 둘 이상의 문을 포함하는 경우 Python에서는 세미콜론을 사용하여 문의 끝을 나타낼 수 있습니다.

한 줄에 여러 개의 문이 있으면 세미콜론을 구분 기호로 사용할 수 있습니다.: 8. 복합 문.이 경우 디버거에 쉽게 포인트를 삽입할 수 있습니다.

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

세미콜론(점, 쉼표, 괄호와 같은)은 종교적인 전쟁을 일으키는 경향이 있습니다.여전히, 그들(또는 몇몇 유사한 기호)은 다양한 이유로 모든 프로그래밍 언어에서 유용합니다.

  • 실용적: 개념적으로 함께 속하는 여러 개의 짧은 명령을 동일한 줄에 배치할 수 있습니다.좁은 뱀처럼 보이는 프로그램 텍스트는 구조를 강조하는 새 줄과 들여쓰기의 반대 효과를 가져옵니다.

  • 개념: 옛날에는 "예쁜 인쇄"라고 불렸던 프레젠테이션(예: 새 줄)에서 순수 구문(이 경우 명령 시퀀스) 간의 관심사를 분리합니다.

관찰: 구조를 강조하기 위해 들여쓰기는 명백한 방법으로 수직선으로 보강/교체할 수 있으며 들여쓰기가 시작되고 끝나는 위치를 확인하는 "시각적인 통치자" 역할을 할 수 있습니다.다른 색상(예: 저항기의 색상 코드를 따르는 것)은 혼잡을 보완할 수 있습니다.

작가들이 허락하기로 결정했기 때문에 허용되는 것: 6. 간단한 진술

저자들이 왜 그렇게 결정했는지에 대한 질문으로 넘어가면 세미콜론은 적어도 다음 언어에서 간단한 문장 종결로 허용되기 때문이라고 생각합니다.C++, C, C#, R, MATLABPerl.

따라서 다른 언어에 배경이 있는 사람들을 위해 파이썬을 사용하는 것이 더 빠릅니다.그리고 그러한 결정에는 일반성의 손실이 없습니다.

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

세미콜론( ; )은 두 문 모두 새 코드 블록을 시작하지 않을 경우 단일 행에 여러 문을 허용합니다.

Python - 기본 구문

세미콜론(";")은 다음 C 코드가 있는 경우와 같이 동일한 블록 내에서 문을 분리하는 경우에만 필요합니다.

if(a>b)
{
    largest = a;  // Here 'largest' and 'count' are integer variables
    count += 1;
}

Python으로 작성할 수 있는 형식은 다음과 같습니다.

if a > b:   
    largest = a
    count = count + 1

또는

if a > b:    largest = a; count = count + 1

위의 예제에서, 당신은 하나의 안에 임의의 수의 문장을 가질 수 있습니다.if대신 ";"로 구분할 수 있습니다.

위의 설명처럼 간단한 것은 없기를 바랍니다.

Matplotlib 라이브러리 관련:

import numpy as np
import matplotlib as plt

%matplotlib notebook
linear_data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
quadratic_data = linear_data**2
plt.figure()
xvals = range(len(linear_data))
plt.barh(xvals, linear_data, height = 0.3, color='b')
plt.barh(xvals, quadratic_data, height = 0.3, left=linear_data, color='r')

막대 끝(수평 막대)에 세미콜론을 제공하지 않으면 출력은 플롯 + 함수 주소입니다.그러나 두 막대선의 끝에 세미콜론을 사용하면 그림만 표시되고 함수 주소에 대한 출력이 표시되지 않습니다.

이와 같은 것: 비교

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