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


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.