파이썬은 문장을 끝내기 위해 세미콜론을 사용할 것을 보증하지 않습니다. 그렇다면 왜 이것이 (아래) 허용됩니까?
import pdb; pdb.set_trace()
파이썬은 문장을 끝내기 위해 세미콜론을 사용할 것을 보증하지 않습니다. 그렇다면 왜 이것이 (아래) 허용됩니까?
import pdb; pdb.set_trace()
답변:
파이썬은 문장을 끝내기 위해 세미콜론을 요구 하지 않습니다 . 같은 줄에 여러 명령문을 넣으려면 세미콜론 을 사용하여 명령문을 구분할 수 있습니다.
자, 왜 이것이 허용됩니까? 단순한 디자인 결정입니다. 파이썬 에이 세미 콜론이 필요하다고 생각하지 않지만 누군가가 그것을 가지고 언어에 추가하는 것이 좋을 것이라고 생각했습니다.
timeit a = 5; a*a
timeit
의미합니까? 여전히 2 a = 2; a*a
이므로 쓸모가 없습니다 a
. 그럴 필요 것a = 2; a *= a
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)* [";"]
if cond: stmt1; stmt2; stmt3
"예, 중 전부 또는 문장 중 어느 것도 실행되지 않습니다.
파이썬은 ;
종결자가 아닌 구분자로 사용합니다 . 또한 줄의 끝에서 그것들을 사용 하여 문장 종결 자로 보이게 할 수 있지만, 이것은 파이썬에서 빈 문장이 합법적이기 때문에 합법적입니다. 끝에 세미콜론을 포함하는 줄은 두 문장입니다. 하나의 공백.
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
답을 읽은 후에도 세미콜론을 사용하는 데있어 중요한 점이 하나도 없습니다.
인터프리터 REPL (Python 대화식 쉘, IDLE, ipython)에서 작업 할 때 마지막 표현식의 값이 화면에 인쇄되며 일반적으로 의도 된 동작입니다.
그러나 경우에 따라 부작용에 대한 표현식 만 평가하려고합니다 (예 :로 표시 한 시뮬레이션 결과 참조) matplotlib
.
이 경우에 (아마도) 당신의 한 화면보고 싶지 않아 repr
의 S matplotlib
때로는 호출에 의해 반환되는 객체 matplotlib
적어도 IPython에, 기능을, 당신이 가지고있는 가능성 중 하나가에 세미콜론을 추가하는 것입니다 지나치게 verbose 문, 이제 IPython은 입력 행을 두 개의 표현식, matplotlib
호출 및 널 명령문 으로 구성한 것으로 간주 하여 복합 표현식의 값이 None
인터프리터에 의해 화면에 인쇄되지 않도록합니다 (다른 가능성은 할당 과 같이 할당 됨). _ = plot(...)
그러나 나는 조금 더 방해가되는 것을 발견했다).
IMHO는 인터프리터에서 원하지 않는 출력을 억제하기 위해 세미콜론을 사용하는 것이 IPyton 노트북을 도입 한 후 더욱 관련성이 높아져서 문서 및 최종 재사용을 위해 인터프리터 세션의 그래픽 출력을 포함한 입력 및 출력을 저장할 수 있습니다. .
ipython
... 당신의 말을 반영하기 위해 내 대답을 편집했습니다.
다른 사람들이 언급했듯이 세미콜론을 사용하여 문장을 분리 할 수 있습니다. 당신은하지 않습니다 이 로, 그것은 보통의 스타일이 아니다.
이것이 왜 유용한 지에 대해, 어떤 사람들은 두 줄 이상의 사소한 짧은 문장을 한 줄에 넣기를 좋아합니다. .
그러나을 사용하여 쉘에서 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
python
. 인용 된 코드를 여러 줄로 확장하거나 heredoc을 사용하십시오. 그래도 "한 줄짜리"가 되려면 실패합니다. ;)
-c
나는 오래된 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에 화를 낼 것이라고 확신하지만 컴파일러 / 인터프리터는 인수의 이름이 길거나 짧은 이름을 신경 쓰지 않지만 파이썬의 들여 쓰기 규칙은 공백을 신경 쓰지 않습니다. 코드의 가장 큰 문제는 다른 사람 (그리고 심지어 수개월 동안 일한 후에도)에게 무슨 일이 일어나고 있는지, 일이 시작되고 끝나는 곳 등을 명확하게하는 것입니다.
" Pythons Attack " 의 인용문
세미콜론으로 모든 문장을 끝내지 마십시오. 기술적으로는 파이썬에서이 작업을 수행하는 것이 합법적이지만 한 줄에 둘 이상의 문을 배치하지 않는 한 (예 : x = 1; y = 2; z = 3) 완전히 쓸모가 없습니다.
x,y,z = 1,2,3
?
x, y, z = 1, 2, 3
에는 튜플을 만드는 불필요한 왕복이 발생하여 즉시 닮지 않기 때문에 느리다고 생각합니다. (그런데, @communistpancake가 x=1; y=2; z=3
패턴을 제안하고 있다고 생각하지는 않습니다 . 세미콜론이 종결자가 아닌 분리
한 줄에 여러 문장은 세미콜론을 구분 기호로 포함 할 수 있습니다. 예를 들면 다음과 같습니다. http://docs.python.org/reference/compound_stmts.html 귀하의 경우 디버거에 침입 할 지점을 쉽게 삽입 할 수 있습니다.
또한 Learning Python Book 에서 Mark Lutz가 언급했듯이 세미콜론으로 모든 진술 을 종료하는 것은 기술적으로 합법적입니다 (불필요하고 성가시다) .
세미콜론은 한 줄에 두 개 이상의 명령을 사용할 수 있습니다. 그것들을 사용할 필요는 없지만 제한되지 않습니다.
세미콜론 (;)은 명령문이 새 코드 블록을 시작하지 않는 경우 한 줄에 여러 명령문을 허용합니다.
http://www.tutorialspoint.com/python/python_basic_syntax.htm
세미콜론 (점, 쉼표 및 괄호 등)은 종교 전쟁을 일으키는 경향이 있습니다. 그럼에도 불구하고 그것들 (또는 비슷한 상징)은 여러 가지 이유로 모든 프로그래밍 언어에서 유용합니다.
실용적 : 개념적으로 하나의 짧은 명령을 같은 줄에 넣는 기능. 좁은 뱀처럼 보이는 프로그램 텍스트는 줄 바꿈과 들여 쓰기가 의도 한 것과 반대의 영향을 미치므로 구조가 강조됩니다.
개념 : 예전에는 "pretty-printing"이라고하는 표현 (예 : 줄 바꿈)에서 순수 구문 (이 경우 일련의 명령에 대한) 사이의 관심사 분리.
관찰 : 구조를 강조하기 위해, 들여 쓰기는 수직선으로 명백한 방식으로 보강 / 대체 될 수 있으며 들여 쓰기가 시작되고 끝나는 곳을 볼 수있는 "시각적 통치자"역할을합니다. 다른 색상 (예 : 저항의 색상 코드에 따름)은 밀집을 보상 할 수 있습니다.
저자가 허용하기로 결정했기 때문에 허용됩니다 : https://docs.python.org/2/reference/simple_stmts.html
저자가 그렇게하기로 결정한 이유에 의문을 제기한다면, 적어도 다음과 같은 언어로 세미 컬럼이 간단한 명령문 종료로 허용되기 때문입니다.
따라서 다른 언어를 사용하는 사람이 파이썬을 사용하는 것이 더 빠릅니다. 그리고 그러한 결정에서 일반성을 잃지 않습니다.
세미콜론 ( ";")은 다음과 같은 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')
barh (horizontal bar) 끝에 세미콜론을 제공하지 않으면 출력은 플롯 + 함수 주소입니다. 그러나 두 barh 행의 끝에 세미콜론을 사용하면 플롯 만 표시되고 함수 주소의 출력은 표시되지 않습니다.
이와 같은 것 : 비교