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


166

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

import pdb; pdb.set_trace()

1
이러한 코드는 디버깅 목적으로 만 사용되며 "완료"되기 전에 제거 될 수 있습니다. 나는 당신이 그것을 가지고 쉽게 이동할 수 있도록 그 발췌 문장을 사용합니다.
— Nick T

롤 저도 같은 웹 사이트에서이 질문에 온 : realpython.com/python-debugging-pdb
— mackycheese21

답변:


226

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

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


16
다음과 같은 것들에 유용합니다timeit a = 5; a*a
— endolith

13
exec ( 'a for [1,2,3] : print a; print a + 1')와 같은 exec 문에 유용합니다.
— Phil C

76
나는 C, Obj-C, Javascript, PHP의 배경으로 Python에 왔습니다. 나는 종종 쓸모없는 터미네이터를 넣었다. 줄 끝에서. 그러나 운 좋게도 파이썬은 나를 용서합니다
— Paolo

36
세미콜론은 장고 쉘 또는 디버거에서 매우 유용하므로 한 줄에 작은 프로그램을 작성하고 나중에 반복 할 수 있습니다.
— Bryce

5
@endolith 무엇을 timeit의미합니까? 여전히 2 a = 2; a*a이므로 쓸모가 없습니다 a. 그럴 필요 것a = 2; a *= a
— Nearoo

59

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

4
if 후 세미콜론의 우선 순위가 콜론보다 낮다는 것을 몰랐습니다. 감사!
— gaborous

3
@gaborous 나는 개인적으로 당신이 다른 방법을 의미한다고 생각할 정도로 모호한 의견을 느낍니다. 그래서, 차라리 다른 독자 제안, 명확하게 한다는 점에서 : 공식 문구 스틱 if cond: stmt1; stmt2; stmt3"예, 중 전부 또는 문장 중 어느 것도 실행되지 않습니다.
— RayLuo

그렇습니다. 우선 순위가 낮 으면 어휘 분석기는 모든 세미콜론 명령문이 실행될 때까지 상위 (콜론) 블록을 떠날 수 없습니다. 그것은 분명한 것이 아닙니다.
— gaborous

38

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


28
끝에 세미콜론을 넣으면 SyntaxError가 발생합니다. 따라서 빈 진술은 완전히 합법적이지 않은 것 같습니다.
— Cucu

10
아마 목록, 튜플, 후행 쉼표가있는 딕 트는 유효하고 잘린 대응 항목 (예 : [1,2,3] == [1,2,3,])과 동일하지만 이중 쉼표를 포함 할 수 없습니다 . 따라서 기본적으로 파이썬에는 "후행 공백 제거제"가 있습니다. stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
— 그건

@Cucu 당신이 맞아요. 세미콜론으로 줄을 시작하거나 쉼표로 표현식 목록을 시작할 수도 없습니다. 따라서 세미콜론과 쉼표는 구분 기호 및 선택적 종결 자라고 말하는 것이 더 정확합니다 .
— wjandrea

29

인터프리터의 세미콜론

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

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

부작용에 대한 표현식 사용

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

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

개인적인 말

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


알겠습니다, 공유해 주셔서 감사합니다! 세미콜론 노트북 ipython에서하기 matplotlib에 의해에 repr을 방지 할 수 있습니다이 바로 해결 정확히 내 문제,
— Napitupulu 존

이것은 IPython 전용 기능이며 null 구문이 아니며 특수한 구문 일뿐입니다.
— wjandrea

@wjandrea 당신은 맞습니다, 그것은 단지 ipython... 당신의 말을 반영하기 위해 내 대답을 편집했습니다.
— gboffi

이 답변은 Jupyter 노트북 + IPython 워크 플로가 확산 된 가장 일반적인 사용 사례가되었다고 생각하므로 더 높아야합니다.
— Josh Friedlander

12

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

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

그러나을 사용하여 쉘에서 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

2
쉘에서 명령을 전달할 때 들여 쓰기와 줄 바꿈을 사용할 수 있습니다python . 인용 된 코드를 여러 줄로 확장하거나 heredoc을 사용하십시오. 그래도 "한 줄짜리"가 되려면 실패합니다. ;)
— 00dani

레일 답변에 대한 특성 포함-c
— n611x007

6

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



5

" Pythons Attack " 의 인용문

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


4
왜 안돼 x,y,z = 1,2,3?
— Anirban Nag 'tintinmj'2

5
@ AnirbanNag'tintinmj '이 특별한 경우 x, y, z = 1, 2, 3에는 튜플을 만드는 불필요한 왕복이 발생하여 즉시 닮지 않기 때문에 느리다고 생각합니다. (그런데, @communistpancake가 x=1; y=2; z=3패턴을 제안하고 있다고 생각하지는 않습니다 . 세미콜론이 종결자가 아닌 분리
— 자인

1
@AnirbanNag-다중 문장 라인의 쓰레기 예일 것이기 때문입니다.
— cz

4

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

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


3

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



2

세미콜론 (점, 쉼표 및 괄호 등)은 종교 전쟁을 일으키는 경향이 있습니다. 그럼에도 불구하고 그것들 (또는 비슷한 상징)은 여러 가지 이유로 모든 프로그래밍 언어에서 유용합니다.

  • 실용적 : 개념적으로 하나의 짧은 명령을 같은 줄에 넣는 기능. 좁은 뱀처럼 보이는 프로그램 텍스트는 줄 바꿈과 들여 쓰기가 의도 한 것과 반대의 영향을 미치므로 구조가 강조됩니다.

  • 개념 : 예전에는 "pretty-printing"이라고하는 표현 (예 : 줄 바꿈)에서 순수 구문 (이 경우 일련의 명령에 대한) 사이의 관심사 분리.

관찰 : 구조를 강조하기 위해, 들여 쓰기는 수직선으로 명백한 방식으로 보강 / 대체 될 수 있으며 들여 쓰기가 시작되고 끝나는 곳을 볼 수있는 "시각적 통치자"역할을합니다. 다른 색상 (예 : 저항의 색상 코드에 따름)은 밀집을 보상 할 수 있습니다.


1

저자가 허용하기로 결정했기 때문에 허용됩니다 : https://docs.python.org/2/reference/simple_stmts.html

저자가 그렇게하기로 결정한 이유에 의문을 제기한다면, 적어도 다음과 같은 언어로 세미 컬럼이 간단한 명령문 종료로 허용되기 때문입니다.

따라서 다른 언어를 사용하는 사람이 파이썬을 사용하는 것이 더 빠릅니다. 그리고 그러한 결정에서 일반성을 잃지 않습니다.


1

세미콜론 ( ";")은 다음과 같은 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블록 내에 여러 개의 명령문을 사용할 수 있으며 ";"로 구분할 수 있습니다. 대신에.

위의 설명만큼 간단한 것이 없기를 바랍니다.


0

여기에 존재하는 방대한 지식에 덧붙여
이것은 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')

barh (horizontal bar) 끝에 세미콜론을 제공하지 않으면 출력은 플롯 + 함수 주소입니다. 그러나 두 barh 행의 끝에 세미콜론을 사용하면 플롯 만 표시되고 함수 주소의 출력은 표시되지 않습니다.

이와 같은 것 : 비교


3
이것은 IPython에만 해당되며 표준 Python REPL에는 적용되지 않습니다.
— wjandrea

나는 이것이 언어 작가들이 단순성, 힘, 균일 성을 도입한다고 생각한 방식이 이와 같은 문제를 미리 생각하지 못한 훌륭한 사례라고 생각합니다.
— eSurfsnake
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.