Python 구문 및 의미론
Python syntax and semantics이 글은 설명서나 안내서처럼 쓰여 있다. (2021년 1월)(이과 시기 |
Python 프로그래밍 언어의 구문은 Python 프로그램이 어떻게 작성되고 해석되는지를 정의하는 규칙 집합이다(런타임 시스템과 인간 독자에 의해). Python 언어는 Perl, C, Java와 많은 유사점을 가지고 있다. 하지만, 언어들 사이에는 몇 가지 분명한 차이점이 있다.
디자인 철학
Python은 읽기 쉬운 언어가 되도록 고안되었다.[1] 비교적 깔끔하지 않은 시각적 레이아웃으로 다른 언어가 구두점을 사용하는 영어 키워드를 자주 사용한다. 파이톤은 그 구문 설계에서 간단하고 일관적인 것을 목표로 하고 있으며, 만트라에 캡슐화된 "Python의 Zen of Python의 "한 가지(가능한 한 가지)가 있어야 하며, 한 가지(가능한 한 가지)만 해야 한다"고 되어 있다.[2]
이 만트라는 일부러 펄과 루비 만트라에 반대한다. "하는 방법은 하나 이상 있다."
키워드
Python은 35개의 키워드나 예약된 단어를 가지고 있다; 그것들은 식별자로 사용될 수 없다.[3][4]
- 메모들
들여쓰기
Python은 백스페이스를 사용하여 제어 흐름 블록을 구분한다(오프사이드 규칙에 따름). 파이톤은 이전의 ABC로부터 이 특징을 빌렸다: 구두점이나 키워드 대신 들여쓰기를 사용하여 블록의 실행을 표시한다.
ALGOL에서 파생된 블록 구조를 사용하는 소위 "자유형식" 언어에서 코드 블록은 교정기로 설정된다({ }) 또는 키워드. 이러한 언어에 대한 대부분의 코딩 규칙에서 프로그래머들은 블록 안에 코드를 관례적으로 들여쓰기 때문에 주변 코드와 시각적으로 구분된다.
이름이 붙여진 재귀 기능 foo단일 매개 변수를 전달하고 x, 그리고 만약 파라미터가 0이라면, 다른 함수를 호출할 것이다. bar 그리고 그렇지 않으면 전화할 것이다. baz, 패스 x, 또한 자신을 재귀적으로, 지나가는 것으로도 부른다. x-1 Python에서 다음과 같이 구현될 수 있는 매개 변수:
반항하다 foo(x): 만일 x == 0: 술집을 내다() 다른: 야유하다(x) foo(x - 1) 그리고 K&R 인덴트 스타일로 C로 이렇게 쓸 수 있었다.
공허하게 하다 foo(인트로 x) { 만일 (x == 0) { 술집을 내다(); } 다른 { 야유하다(x); foo(x - 1); } } 잘못 들여쓰기된 코드는 컴파일러나 통역자가 해석하는 것과 다르게 인간 판독기에 의해 잘못 읽힐 수 있다. 예를 들어, 함수가 호출하는 경우 foo(x - 1) 위 예제의 마지막 줄에 있는 것은 잘못 들여져서 밖에 있었다. if/else 블록:
반항하다 foo(x): 만일 x == 0: 술집을 내다() 다른: 야유하다(x) foo(x - 1) 마지막 라인이 항상 실행되도록 할 것이다, 심지어 x 0으로 끝없는 재귀가 발생한다.
공백과 탭 문자는 모두 들여쓰기 형태로 받아들여지고 임의의 다중 공간을 사용할 수 있지만, 공간을 권장하고[6] (위의 예와 같이) 4개의 공간을 권장하며, 지금까지 가장 일반적으로 사용된다.[7][8][unreliable source?] 동일한 소스 코드 파일에서 연속된 줄에 공백과 탭을 혼합하는 것은 Python 3부터[9] 허용되지 않는데, 이는 많은 도구들이 공간과 탭을 시각적으로 구분하지 않기 때문에 보기 어려운 버그를 만들 수 있기 때문이다.
데이터 구조
Python은 동적으로 입력된 언어이기 때문에 변수가 아닌 Python 값은 유형 정보를 전달한다. Python의 모든 변수는 객체에 대한 참조를 가지고 있으며, 이러한 참조는 함수에 전달된다. 일부 사람들(Guido van Rossum 본인 포함)은 이 매개변수 전달 방식을 "객체 참조에 의한 호출"이라고 불렀다. 객체 참조란 이름을 의미하며, 전달된 참조는 "alias" 즉, C/C++에서와 같이 동일한 객체에 대한 참조의 사본이다. 개체의 값은 다음과 같이 "alias"와 함께 호출된 함수에서 변경될 수 있다.
>>> 앨리스트 = ['a', 'b', 'c'] >>> 반항하다 my_funk(al): ... al.덧셈을('x') ... 인쇄하다(al) ... >>> my_funk(앨리스트) ['a', 'b', 'c', 'x'] >>> 앨리스트 ['a', 'b', 'c', 'x'] 함수 my_func 의 가치를 바꾸다 alist 형식적인 주장으로 al, 의 가명이다. alist그러나 별칭 자체에 대해 작동(새 개체 참조를 할당)하려는 어떠한 시도도 원래 개체에는 영향을 미치지 않는다.[clarification needed]
>>> 앨리스트 = ['a', 'b', 'c'] >>> 반항하다 my_funk(al): ... # al.appendappendx') ... al = al + ['x'] # 새로운 리스트가 생성되고 al에 할당됨은 al이 alist의 가명이 아니라는 것을 의미한다. ... 인쇄하다(al) ... >>> my_funk(앨리스트) ['a', 'b', 'c', 'x'] >>> 앨리스트 ['a', 'b', 'c'] 훌륭하지만 더 긴 설명은 다음을 참조하십시오. Python 이름과 가치에 대한 사실과 신화
Python에서, 비내부 로컬 및 선언되지 않은 글로벌 액세스 가능한 이름은 모두 별칭이다.
동적으로 입력된 언어 중에서 파이썬은 적당히 타이프 체크가 되어 있다. 암묵적 변환은 숫자 유형(예: 술자리)에 대해 정의되므로 명시적 캐스팅 없이 복잡한 숫자에 정수(예를 들어)를 유효하게 곱할 수 있다. 그러나, 예를 들어 숫자와 문자열 사이에는 암묵적인 변환이 없다; 문자열은 숫자를 기대하는 수학 함수에 대한 잘못된 인수다.
기본 유형
Python은 다양한 기본 데이터 유형을 가지고 있다. 기존 정수, 부동 소수점 산술과 함께 임의정밀 산술, 복합수, 소수점 산술 등을 투명하게 지원한다.
Python은 다양한 문자열 연산을 지원한다. Python의 문자열은 불변하기 때문에 다른 프로그래밍 언어에서 문자열을 변경할 수 있는 문자 대체와 같은 문자열 연산은 Python에서 새 문자열을 반환한다. 성능 고려사항은 때때로 문자열을 문자열에 필요한 경우에만 문자열로 연결하는 것과 같이 문자열을 집중적으로 수정하는 프로그램에서 특별한 기법의 사용을 추진한다.
수집 유형
Python의 매우 유용한 측면 중 하나는 수집형(또는 컨테이너형)의 개념이다. 일반적으로 컬렉션은 쉽게 참조되거나 인덱싱되는 방식으로 다른 개체를 포함하는 개체다. 컬렉션은 두 가지 기본 형태, 즉 시퀀스와 매핑으로 나온다.
순서형 순차형은 리스트(동적 배열), 튜플, 문자열 등이다. 모든 시퀀스는 위치별로 색인화되며(0 ~ 길이 - 1) 문자열을 제외한 모든 문자열은 동일한 시퀀스의 여러 유형을 포함하여 모든 유형의 개체를 포함할 수 있다. 문자열과 튜플은 모두 불변하기 때문에 사전 키의 완벽한 후보(아래 참조)가 된다. 반면에 리스트는 변형이 가능하다; 요소들은 삽입, 삭제, 수정, 추가 또는 내부로 정렬될 수 있다.
반면에 매핑은 불변의 키 집합을 해당 요소(수학적 함수처럼 많음)에 "매핑"하는 사전의 형태로 구현된 유형이다. 예를 들어, 사람들은 문자열이 있는 사전을 정의할 수 있다. "toast" 정수로 매핑된 42 또는 그 반대의 경우도 마찬가지야. 사전의 키는 후드 아래에서 해시함수를 통해 구현되기 때문에 정수나 문자열과 같이 불변의 파이썬 타입이어야 한다. 이렇게 하면 조회 시간이 훨씬 빨라지지만 키를 변경하지 않아도 된다.
사전은 모든 개체와 클래스의 핵심인 변수 이름(스트링)과 이름 참조가 사전으로 저장되는 값(개체 시스템 참조)에 위치하기 때문에 Python의 내부에는 핵심이다. 이러한 사전은 (물체의) 직접 액세스할 수 있기 때문에 __dict__ 속성), 메타프로그래밍은 파이톤에서 간단하고 자연스러운 과정이다.
집합 취합형은 중복을 포함하지 않는 색인화되지 않고 순서가 정되지 않은 수집이며, 조합, 교차로, 차이, 대칭 차이, 부분 집합 시험과 같은 집합 이론적 연산을 실시한다. 세트에는 두 가지 유형이 있다. set 그리고 frozenset, 유일한 차이점은 set 변이될 수 있고 frozenset 불변이다 집합의 요소는 해시가 가능해야 한다. 따라서, 예를 들어, a frozenset 단골의 한 요소가 될 수 있다. set 반면에 그 반대는 사실이 아니다.
Python은 또한 내장된 격납 검사 및 일반 반복 프로토콜과 같은 광범위한 수집 조작 능력을 제공한다.
객체 시스템
Python에서는 모든 것이 물체, 심지어 계급이다. 클래스는 개체로서 그들의 메타클라스라고 알려진 클래스를 가지고 있다. 파이톤은 또한 다중 상속과 믹스인을 지원한다.
그 언어는 유형과 계층에 대한 광범위한 반성을 지원한다. 유형을 읽고 비교할 수 있다. 유형은 type. 객체의 속성은 사전으로 추출할 수 있다.
예를 들어, Python에서 특수 멤버 함수를 정의하여 연산자를 과부하할 수 있음(예: 명명된 메서드를 정의함) __add__ 교실에서 사용허가를 하다. + 그 등급의 물건을 조작하다.
리터럴스
줄들
파이톤은 다양한 종류의 문자열 리터럴을 가지고 있다.
일반 문자열 리터럴
단일 또는 큰따옴표를 사용하여 문자열을 따질 수 있다. 유닉스 셸 언어, Perl 또는 Perl 인플루언서 Ruby 또는 Groovy와 달리 작은 인용문 및 큰따옴표는 동일한 기능, 즉 $foo 표현식의 문자열 보간법이 없다. 그러나 보간술은 다양한 방법으로 할 수 있다: "f-string"(파이톤[10] 3.6 이후)로, "f-string을 사용한다. format 메서드 또는 이전 % 문자열 형식 연산자.
예를 들어, 이러한 Python 문장은 모두 다음과 같다.
인쇄하다(f"이제 막 인쇄했어. {숫자} 인쇄 페이지 {프린터}") 인쇄하다("이제 막 인쇄했어. {} 인쇄 페이지 {}".형식을 갖추다(숫자, 프린터)) 인쇄하다("이제 막 인쇄했어. {0} 인쇄 페이지 {1}".형식을 갖추다(숫자, 프린터)) 인쇄하다("이제 막 인쇄했어. {Num} 인쇄 페이지 {message}".형식을 갖추다(숫자=숫자, 프린터=프린터)) 인쇄하다("이제 막 인쇄했어. %s 인쇄 페이지 %s" % (숫자, 프린터)) 인쇄하다("이제 막 인쇄했어. %(숫자) 인쇄 페이지 %(평균)s" % {"숫자": 숫자, "printer": 프린터}) Perl 문과 동일함:
인쇄하다 "이제 막 $printer\n 프린터에 $numpage를 인쇄했다. 변수를 사용하여 문자열을 만든다. num 그리고 printer.
멀티라인 문자열 리터럴
또한 멀티라인 문자열도 있는데, 이 문자열은 3개의 싱글이나 더블 따옴표로 시작하고 끝나며, 펄과 루비에 있는 이 문서와 같이 기능한다.
가변 보간법을 사용한 간단한 예제(사용: format 방법)은 다음과 같다.
인쇄하다("""친애하는 {message}, 나는 네가 써니데일을 떠나 다시는 돌아오지 않기를 바란다. Not Quick Love, {message} """.형식을 갖추다(발송인=뱀파이어 슬레이어 버피, 받는사람="스파이크")) 원시현
마지막으로 앞에서 언급한 모든 문자열 유형은 "원시" 품종(초기 인용문 앞에 리터럴 r을 놓아 표시)으로 제공되며, 이는 백슬래시 인터폴레이션이 없으므로 정규 표현식에 매우 유용하다. C#의 "@-쿼팅"을 비교한다. 원시 문자열은 원래 정규식을 위해 특별히 포함되었다. 토큰라이저의 한계로 인해 원시 문자열에는 후행 백슬래시가 없을 수 있다.[11] 백슬래시로 끝나는 Windows 경로를 포함하는 원시 문자열을 만들려면 몇 가지 해결 방법이 필요하다(일반적으로 Windows에서 모두 허용하므로 백슬래시 대신 슬래시를 사용).
예를 들면 다음과 같다.
>>>>> # 윈도 경로, 원시 문자열도 백슬래시 >>> r"C:\Foo\Bar\Baz\" 파일 "<stdin"", 라인 1 r"C:\Foo\Bar\Baz\" ^ 구문Error: 문자열 리터럴 >>> dos_path = r"C:\Foo\Bars\Baz\ # " >>> dos_path.rstrip() #를 추가하고 후행 공간 'C:\\\'을 제거하여 오류를 방지한다.Foo\\Bars\\\baz\\'>>>< 인용_dos_path = r"{}"{}"형식(dos_path) >>< 인용_dos_path '"C:\\\\"Foo\\Bar\\\Baz\\"># 인용된 문자열과 인용된 백슬래시 인용 가능한 백슬래시 인용 >>>>re.match(r')("[^"\]\\*", 인용된_dos_path).group(1).rstrip() 'C:\\\\\"과 일치하는 정규식Foo\\Bar\\Baz\\' >>> code = 'foo(2, bar)' >>> # Reverse the arguments in a two-arg function call >>> re.sub(r'\(([^,]*?),([^ ,]*?)\)', r'(\2, \1)', code) 'foo(2, bar)' >>> # Note that this won't work if either argument has parens or commas in it. 인접 문자열 리터럴 연결
연속적으로 나타나는 문자열 리터럴(가능한 다른 인용 규칙을 사용)과 공백(새 줄 포함)으로만 구분되는 문자열 리터럴이 허용되며, 하나의 긴 문자열로 집계된다.[12] 그러므로
제목 = "원 굿 턴: " \ '드라이버와 스크루의 자연사' 와 같다
칭호를 붙이다 = "원 굿 턴: 스크루드라이버와 나사의 자연사" 유니코드
Python 3.0 이후, 기본 문자 집합은 소스 코드와 통역기의 UTF-8이다. UTF-8에서 유니코드 문자열은 전통적인 바이트 문자열처럼 처리된다. 이 예는 다음과 같다.
s = "Γειά" # 그리스어로 안녕 인쇄하다(s) 숫자
Python의 숫자 리터럴은 보통이다. 예를 들어, 0, -1, 3.4, 3.5e-8.
Python은 임의 길이의 정수를 가지고 있으며 필요에 따라 자동으로 스토리지 크기를 증가시킨다. 파이톤 3 이전에는 전통적인 고정 크기 정수와 임의 크기의 "긴" 정수라는 두 종류의 정수들이 있었다. "긴" 정수로의 변환은 필요할 때 자동으로 수행되었고, 따라서 프로그래머는 보통 두 가지 필수 유형을 인식할 필요가 없었다. 새로운 언어 버전에서는 구별이 완전히 사라지고 모든 정수는 임의 길이의 정수처럼 행동한다.
Python은 정상적인 부동소수점 번호를 지원하는데, 이는 점들이 리터럴(예:)에서 사용될 때 생성된다. 1.1(), 식에 정수 및 부동 소수점 번호가 사용되거나 또는 일부 수학 연산의 결과로 사용되는 경우("참 분할"을 통한) / 연산자 또는 음수 지수를 사용한 지수).
파이톤은 또한 복잡한 숫자도 기본적으로 지원한다. 복잡한 숫자는 다음과 같이 표시된다. J 또는 j 접미사(예: 3 + 4j.
목록, 튜플, 세트, 사전
Python은 컨테이너 타입의 생성을 위한 통사적 지원을 가지고 있다.
목록(클래스) list)는 임의 유형의 항목의 변이 가능한 시퀀스로, 특수 구문을 사용하여 만들 수 있다.
a_list = [1, 2, 3, "개"] 또는 일반 객체 생성 사용
a_second_list = 리스트를 작성하다() a_second_list.덧셈을(4) a_second_list.덧셈을(5) 튜플(클래스) tuple)는 임의 유형의 항목의 불변 순서다. 튜플을 만드는 특별한 구문도 있다.
a_tuple = 1, 2, 3, "4" a_tuple = (1, 2, 3, "4") 튜플은 콤마로 항목을 분리해 만들지만 전체 구문은 대개 괄호로 감싸 가독성을 높인다. 빈 튜플은 다음과 같이 표시된다. ().
세트(클래스) set)는 임의 유형의 해시 가능한 항목으로[13] 중복되지 않는 변이 가능한 컨테이너다. 품목은 주문되지 않고 품목에 대한 지원 반복을 설정한다. 세트의 생성 구문은 곱슬 괄호를 사용한다.
어떤_s_set = {0, (), 거짓의} 파이톤 세트는 수학적 세트와 매우 유사하며, 세트 교차로와 유니언과 같은 작업을 지원한다. Python은 또한 a를 특징으로 한다. frozenset 고정되지 않는 집합에 대한 클래스는 수집 유형을 참조하십시오.
사전(클래스) dict)는 키와 해당 값을 묶는 변형 가능한 매핑이다. Python은 사전을 만드는 특별한 구문을 가지고 있다.{key: value})
a_message = {"키 1": "값 1", 2: 3, 4: []} 사전 구문은 집합 구문과 유사하며, 차이점은 콜론의 존재다. 빈 리터럴 {} 빈 사전이 아닌 빈 사전이 되고, 대신 비필수 생성자를 사용하여 작성된다. set().
연산자
산술
Python은 다음을 포함한다. +, -, *, / ("진정한 분할"), // (바닥 분할), % (계량) 및 ** (수정) 연산자(일반적인 수학적 우선 순위 포함)
파이톤 3에서는 x / y 둘 다 하더라도 항상 플로트를 반환한다는 의미인 "진정한 분할"을 수행한다. x 그리고 y 균등하게 나누는 정수다.
>>> 4 / 2 2.0 그리고 // 정수 분할 또는 바닥 분할을 수행하여 몫의 바닥을 정수로 되돌린다.
Python 2(및 대부분의 다른 프로그래밍 언어)에서는 명시적으로 요청하지 않는 한, x / y 두 입력 중 하나가 플로트인 경우에만 플로트를 반환하는 정수 분할을 수행했다. 그러나 파이썬은 동적으로 타이핑된 언어이기 때문에 어떤 연산이 수행되고 있는지 항상 알 수 있는 것은 아니어서 미묘한 버그로 이어지는 경우가 많아 도입에 박차를 가했다. // 연산자와 의 의미론적 변화 / Python 3의 연산자.
비교 연산자
비교 연산자, 즉. ==, !=, <, >, <=, >=, is, is not, in 그리고 not in[14] 모든 종류의 가치관에 사용된다. 숫자, 문자열, 시퀀스, 매핑을 모두 비교할 수 있다. Python 3에서는 서로 다른 유형(예: str 그리고 int)은 일관성 있는 상대적 순서를 가지고 있지 않다. 파이톤 2에서는 일부 문자열이 일부 정수보다 크거나 작은지 비교가 가능했지만, 이는 역사적인 디자인 퀴크로 여겨졌고 파이톤 3에서는 결국 제거되었다.
다음과 같은 체인으로 연결된 비교 표현 a < b < c C와 유사한 언어에서 발견되는 특이한 의미보다는 수학에서 그들이 가지고 있는 의미를 대략 가지고 있다. 용어들은 순서대로 평가되고 비교된다. 이 수술에는 단락 의미론적 의미가 있어 평결이 확실해지는 즉시 평가가 중단될 것을 보장한다. a < b 거짓이야, c 그 표현이 더 이상 진실일 수 없기 때문에 결코 평가되지 않는다.
부작용이 없는 표현은 a < b < c 와 같다 a < b and b < c그러나, 그 표현들이 부작용이 있을 때는 상당한 차이가 있다. a < f(x) < b 평가할 것이다 f(x) 정확히 한 번, 반대로 a < f(x) and f(x) < b 의 가치가 있다면 그것을 두 번 평가할 것이다. a 보다 작다 f(x) 그리고 또 한 번.
논리 연산자
Python의 모든 버전에서 부울 연산자는 0 값이나 다음과 같은 빈 값을 처리한다. "", 0, None, 0.0, []그리고 {} 일반적으로 0이 아닌 값을 참으로 취급하는 동안, 거짓으로 처리한다. 부울 값 True 그리고 False Python 2.2.1에서 상수로 언어에 추가됨(하위 분류: 1 그리고 0) 및 Python 3에서 풀 블로우된 키워드로 변경되었다. 다음과 같은 이항 비교 연산자 == 그리고 > 어느 한쪽을 돌려주다. True 또는 False.
부울 연산자 and 그리고 or 최소한의 평가만 하다 예를 들어, y == 0 or x/y > 100 절대 0으로 나누지 않을 것이다. 이러한 연산자는 평가된 마지막 피연산자의 값을 반환하지 않는다. True 또는 False. 따라서 표현은 (4 and 5) 로 평가하다. 5그리고 (4 or 5) 로 평가하다. 4.
기능 프로그래밍
위에서 언급한 것처럼 파이썬의 또 다른 강점은 기능성 프로그래밍 스타일의 가용성이다. 예상할 수 있듯이, 이것은 목록과 다른 수집품들을 훨씬 더 쉽게 만들 수 있다.
포괄
그러한 구성 중 하나는 목록 이해로, 다음과 같은 형식으로 표현할 수 있다.
L = [mapping_mapping 을 위해 요소 에 source_list 만일 filter_message] 목록 이해를 사용하여 2의 처음 5가지 검정력 계산:
powers_of_2 = [2**n 을 위해 n 에 범위(1, 6)] Quicksort 알고리즘은 목록 포괄성을 사용하여 우아하게(비효율적으로) 표현할 수 있다.
반항하다 qsort(L): 만일 L == []: 돌아오다 [] 회전시키다 = L[0] 돌아오다 (qsort([x 을 위해 x 에 L[1:] 만일 x < 회전시키다]) + [회전시키다] + qsort([x 을 위해 x 에 L[1:] 만일 x >= 회전시키다])) Python 2.7+[15]는 또한 세트포괄과[16] 사전포괄을 지원한다.[17]
제1종 기능
파이톤에서 함수는 동적으로 생성되고 전달할 수 있는 일급 객체다.
Python의 익명 기능에 대한 제한적인 지원은 lambda 건설하다 예를 들어, 5:의 인수로 불리는 입력의 제곱을 이루는 익명 함수가 있다.
f = 람다 x: x**2 f(5) 람다들은 비록 제어 흐름이 여전히 단락을 사용함으로써 람다 내에서 덜 우아하게 구현될 수 있고,[18] 더 관용적으로 조건부 표현으로 구현될 수 있지만, 문장이 아닌 표현을 포함하는 것으로 제한된다.[19]
폐쇄
파이썬은 2.2 버전부터 어휘 폐쇄에 대한 지원을 받아왔다. 주어진 함수의 파생형에 근접한 함수를 반환하는 예제 함수는 다음과 같다.
반항하다 파생적(f, dx): """f의 파생상품에 근접한 함수를 반환한다. dx 간격 사용(적절하게 작아야 함). """ 반항하다 기능을 하다(x): 돌아오다 (f(x + dx) - f(x)) / dx 돌아오다 기능을 하다 그러나 파이썬의 구문은 때때로 다른 언어의 프로그래머들로 하여금 폐쇄가 지원되지 않는다고 생각하게 한다. Python의 변수 범위는 범위를 명시적으로 선언하지 않는 한 변수에 값을 할당하는 범위에 의해 암시적으로 결정된다. global 또는 nonlocal.[20]
폐쇄가 이름을 특정 값에 바인딩하는 것은 함수 내에서 변경할 수 없다는 점에 유의하십시오. 주어진:
>>> 반항하다 foo(a, b): ... 인쇄하다(f'a: {a}') ... 인쇄하다(f'b: {b}') ... 반항하다 술집을 내다(c): ... b = c ... 인쇄하다(f'b*: {b}') ... 술집을 내다(a) ... 인쇄하다(f'b: {b}') ... >>> foo(1, 2) a: 1 b: 2 b*: 1 b: 2 그리고 당신은 그것을 볼 수 있다. b, 폐쇄의 범위에서 볼 수 있듯이, 그것의 가치를 유지한다; 변경된 바인딩 b 내부 기능은 밖으로 전파되지 않았다. 이 둘레의 방법은 a를 사용하는 것이다. nonlocal b 에 있어서의 진술. bar. Python 2에서 (부족한) nonlocal)) 일반적인 해결책은 바인딩이 아닌 돌연변이 값을 사용하고 해당 값을 변경하는 것이다. 예: 하나의 요소가 있는 목록.
제너레이터
파이썬 2.2에서 선택적 기능으로 도입되어 버전 2.3에서 최종 확정된 발전기는 공간 제한적이거나 계산적으로 집약적인 목록을 반환할 수 있는 기능의 게으른 평가를 위한 파이썬의 메커니즘이다.
이것은 소수점 이하를 게으르게 생성하기 위한 예다.
로부터 이터툴스 수입하다 수를 세다 반항하다 생성_primes(stop_at=없음): 프라임즈 = [] 을 위해 n 에 수를 세다(출발하다=2): 만일 stop_at 이다 아닌 없음 그리고 n > stop_at: 돌아오다 # StopItation 예외 상승 복합의 = 거짓의 을 위해 p 에 프라임즈: 만일 아닌 n % p: 복합의 = 진실의 부숴뜨리다 엘리프 p ** 2 > n: 부숴뜨리다 만일 아닌 복합의: 프라임즈.덧셈을(n) 양보하다 n 이 함수를 호출할 때 반환된 값은 목록과 마찬가지로 반복될 수 있다.
을 위해 i 에 생성_primes(100): # 0에서 100 사이의 소수점 이상 반복 인쇄하다(i) 을 위해 i 에 생성_primes(): # 모든 시간에 걸쳐 무한 반복 인쇄하다(i) 키워드를 제외한 생성기의 정의는 함수의 정의와 동일하게 나타난다. yield 대신 사용되다 return그러나 발전기는 동일한 범위를 반복적으로 출입할 수 있는 영구적인 상태를 가진 물체다. 그런 다음 목록 또는 요소가 반복될 다른 구조물 대신 발전기 호출을 사용할 수 있다. 언제나 for 예에서 루프에는 다음 항목이 필요하고, 제너레이터가 호출되며, 다음 항목을 산출한다.
발전기는 위의 소수 예처럼 무한할 필요가 없다. 발전기가 종료되면 내부 예외가 발생하여 더 이상 값이 없음을 호출 컨텍스트에 알린다. a for 루프 또는 기타 반복이 종료된다.
제너레이터 식
파이썬 2.4에서 소개된 제너레이터 표현은 목록 포괄성과 동등한 게으른 평가다. 위 절에 제공된 소수 생성기를 사용하여 게으르지만 무한 수집은 아니라고 정의할 수 있다.
로부터 이터툴스 수입하다 이슬라이스 primes_million_million_million. = (i 을 위해 i 에 생성_primes() 만일 i < 1000000) 프라임 2_000분의 1 = 이슬라이스(primes_million_million_million., 1999, 2000).다음에() 이렇게 많은 프리임을 생성하는 데 필요한 대부분의 메모리와 시간은 필요한 요소에 실제로 접근하기 전까지는 사용되지 않을 것이다. 유감스럽게도, 발전기의 단순한 인덱싱과 슬라이싱을 수행할 수는 없지만, 반드시 이터툴스 모듈을 사용하거나 "자신의 루프"를 사용해야 한다. 이와는 대조적으로 목록 이해는 기능적으로는 동일하지만 모든 작업을 수행하는 데는 탐욕스럽다.
primes_million_million_million. = [i 을 위해 i 에 생성_primes(2000000) 만일 i < 1000000] 프라임 2_000분의 1 = primes_million_million_million.[1999] 목록 이해는 대부분의 요소가 접근되지 않더라도 즉시 큰 목록(예: 78498개의 항목을 포함하지만 일시적으로 200만 미만의 프리타임 목록을 생성함)을 생성한다. 발전기 이해는 좀 더 가식적이다.
사전 및 포괄 설정
목록과 생성기는 포괄/expression을 가지고 있지만, 2.7 이전 버전의 파이썬에서는 다른 파이썬 내장 수집 유형(딕트와 세트)이 목록이나 생성기를 사용하여 압축되어야 했다.
>>> 받아쓰게 하다((n, n*n) 을 위해 n 에 범위(5)) {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} Python 2.7 및 3.0은 사전 및 세트 포괄성을 도입하여 목록 포괄성과 유사하게 모든 수집 유형을 통합했다.
>>> [n*n 을 위해 n 에 범위(5)] # 규칙적인 목록 이해 [0, 1, 4, 9, 16] >>> >>> {n*n 을 위해 n 에 범위(5)} # 이해력 설정 {0, 1, 4, 9, 16} >>> >>> {n: n*n 을 위해 n 에 범위(5)} # 이해를 구함 {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 물건들
Python은 대부분의 OOP(객체 지향 프로그래밍) 기법을 지원한다. 그것은 계층 구조 내에서뿐만 아니라 오리 타자로도 다형성을 허용한다. 어떤 물체든 어떤 유형에도 사용할 수 있으며, 적절한 방법과 속성을 가지고 있는 한 효과가 있을 것이다. 그리고 파이썬의 모든 것은 클래스, 함수, 숫자, 모듈을 포함한 물체다. 파이톤은 또한 수업의 기능성을 향상시키기 위한 고급 도구인 메타클라시에 대한 지원을 가지고 있다. 당연히 복수 상속을 포함한 상속이 뒷받침된다. 파이썬은 정보 은닉이 일부에 의해 비현실적이거나 계획되지 않은 내막을 포함하고 있다는 점에서 일부에 의해 비피토닉적인 것으로 보여지기 때문에 실제로 거의 사용되지 않는 이름 망링을 이용한 사적 변수에 대한 지원이 매우 제한적이다. "여기서는 우리 모두가 책임 있는 사용자다"라는 슬로건이 이런 태도를 묘사할 때 사용된다.[21]
모듈의 경우처럼 파이썬의 클래스는 정의와 사용자 사이에 절대적인 장벽을 두지 않고 오히려 사용자의 공손함에 의존해 '정의에 끼어들지 않는다'는 것이다.
— 9. Classes, The Python 2.6 Tutorial (2013)
OOP 데이터 구성원을 읽기 위해 접근자 방법을 사용하는 것과 같은 교리는 Python에서 시행되지 않는다. Python이 기능 프로그래밍 구조를 제공하지만 참조 투명성을 요구하지 않는 것처럼, 그것은 객체 시스템을 제공하지만 행동을 요구하지는 않는다. 더욱이, 통화 코드에서 특정 변수를 설정하거나 검색할 때 실제로 함수 호출을 호출하도록 속성(속성 참조)을 이용하여 클래스를 재정의하는 것이 항상 가능하다. spam.eggs = toast 정말로 유발할 수 있다. spam.set_eggs(toast). 이렇게 하면 접근자 기능의 실질적인 이점이 무효화되며, 그 속성은 그대로 남아 있다. eggs 개체 인터페이스의 합법적인 부분이 된다. 구현 세부사항을 반영할 필요는 없다.
파이썬 버전 2.2에서는 '신형' 클래스가 도입됐다. 새로운 스타일의 클래스로 객체와 유형이 통일되어 타입의 하위 클래스가 가능해졌다. 완전히 새로운 유형도 정의될 수 있고, infix 운영자에 대한 사용자 정의 동작으로 완성될 수 있다. 이것은 Python 내에서 많은 급진적인 것들이 구문론적으로 행해지도록 한다. 다중 상속에 대한 새로운 방법 해결 순서도 파이썬 2.3과 함께 채택되었다. Python 버전 사이에 그 기법의 세부적인 내용이 진화하였지만, 속성에 접근하거나 속성을 설정하는 동안 사용자 지정 코드를 실행할 수도 있다.
명세서 포함
그 with 명령문은 리소스를 처리하고 사용자가 Context Manager 프로토콜로 작업할 수 있도록 허용한다.[22] 하나의 함수(__enter__())는 스코프 및 다른 ()를 입력할 때 호출된다.__exit__()) 떠날 때. 이렇게 하면 리소스를 해제하는 것을 잊어버리지 않고 리소스를 사용하는 동안 예외 발생 시 리소스를 해제하는 등의 복잡한 상황도 처리된다. 컨텍스트 관리자는 파일, 데이터베이스 연결, 테스트 사례 등과 함께 자주 사용된다.
특성.
속성은 속성 액세스에 사용되는 것과 동일한 구문을 사용하여 개체 인스턴스에서 특수하게 정의된 메서드를 호출할 수 있다. 일부 속성을 정의하는 클래스의 예는 다음과 같다.
계급 마이클래스: 반항하다 __init___(자아의): 자아의._a = 없음 @property 반항하다 a(자아의): 돌아오다 자아의._a @a.세터 # 재산을 쓰기 가능으로 설정 반항하다 a(자아의, 가치를 매기다): 자아의._a = 가치를 매기다 설명자
세 가지 특수 방법 중 하나 이상을 정의하는 클래스 __get__(self, instance, owner), __set__(self, instance, value), __delete__(self, instance) 설명자로 사용될 수 있다. 설명자의 인스턴스를 두 번째 클래스의 클래스 멤버로 생성하면 해당 인스턴스가 두 번째 클래스의 속성이 된다.[23]
클래스 및 정적 메서
Python은 의 사용을 통해 클래스 메소드와 정적 메소드를 만들 수 있다. @classmethod 그리고 @staticmethod 실내 장식가 클래스 메서드에 대한 첫 번째 인수는 인스턴스에 대한 자체 참조 대신 클래스 개체다. 정적 방법에는 특별한 첫 번째 인수가 없다. 인스턴스도 클래스 개체도 정적 메서드에 전달되지 않는다.
예외
Python은 프로그램의 오류 조건 및 기타 "예외" 이벤트에 대한 테스트 수단으로 예외 처리를 지원(그리고 광범위하게 사용)한다. 실제로 구문 오류로 인한 예외를 가둘 수도 있다.
Python 스타일은 오류 조건이 발생할 수 있을 때마다 예외를 사용할 것을 요구한다. 실제로 사용하기 전에 파일이나 리소스에 대한 액세스를 테스트하기보다는 액세스가 거부될 경우 예외를 포착하고 그냥 사용해 보는 것이 파이썬의 관례다.
오류가 발생하지 않더라도 예외를 비 로컬 제어 전송의 보다 일반적인 수단으로 사용할 수 있다. 예를 들어, Python으로 작성된 메일맨 메일링 목록 소프트웨어는 메시지를 거부하거나 진행자 승인을 위해 메시지를 보유하는 결정이 내려졌을 때, 예외를 사용하여 중첩된 메시지 처리 논리에서 뛰쳐나온다.
예외는 종종 의 대안으로 사용된다. if-블록(block), 특히 나사산이 있는 상황에서. 흔히 호출되는 모토는 EAFP 즉 "허락보다 용서를 구하는 것이 더 쉽다"[24]는 것으로 그레이스 호퍼의 덕택이다.[25][26] LBYL 또는 "Look Before You Rapp"으로 알려진 대안은 분명히 사전 조건을 테스트한다.[27]
이 첫 번째 코드 샘플에서는 LBYL 접근법에 따라 접근하기 전에 속성에 대한 명시적 검사가 있다.
만일 하삿트레(스팸 발송, 'eggs'): 햄 = 스팸 발송.달걀 다른: handle_suffer_attr() 이 두 번째 샘플은 EAFP 패러다임을 따른다.
해보다: 햄 = 스팸 발송.달걀 빼고는 속성오류: handle_suffer_attr() 이 두 코드 샘플은 성능 차이는 있겠지만 동일한 효과를 가진다. 언제 spam 속성이 있다 eggsEAFP 샘플은 더 빨리 실행될 것이다. 언제 spam 속성이 없음 eggs ("예외" 케이스), EAFP 샘플이 더 느리게 실행될 것이다. Python 프로파일러는 특정한 경우에 성능 특성을 결정하는 데 사용될 수 있다. 예외적인 경우가 드물면, EAFP 버전은 대안보다 우수한 평균 성능을 가질 것이다. 또한 전체 등급의 TOCTTOU(Time-to-to-time-to-use) 취약성, 기타 레이스 조건을 피하고 오리 타이핑과 호환된다.[26][28] EAFP의 단점은 문장으로만 사용할 수 있다는 것이다. 예외는 제너레이터 표현식, 목록 이해 또는 람다 함수에 있을 수 없다.
설명 및 문서 문자열
Python은 Python 코드에 주석을 다는 두 가지 방법을 가지고 있다. 하나는 코드의 어떤 부분이 무엇을 하는지를 나타내기 위해 코멘트를 사용하는 것이다. 단일 줄 코멘트는 해시 문자로 시작한다(#) 그리고 줄의 끝까지 계속한다. 둘 이상의 행에 걸친 코멘트는 멀티 라인 문자열을 삽입하여 얻을 수 있다. """ 또는 ''' 할당 또는 다른 평가에서 사용되지 않지만 다른 문장 사이에 있는 각 끝의 구분 기호로서.
코드에 주석 달기:
수입하다 sys 반항하다 지레짐작하다(): 돌아오다 sys.스틴.글을 읽다() # 한 줄 받아 돌려줘 여러 줄로 코드 조각 주석 달기:
반항하다 지레짐작하다(): 돌아오다 sys.스틴.글을 읽다() """이 함수 한 줄을 따다 그리고 그것을 돌려준다." 문서 문자열(문서 문자열), 즉 모듈, 클래스, 메서드 또는 함수 내의 첫 번째 들여쓰기 행으로 할당 없이 단독으로 위치한 문자열은 자동으로 자신의 내용을 명명된 속성으로 설정한다. __doc__, 대상의 목적, 행동 및 용도에 대한 사람이 판독할 수 있는 설명을 저장하기 위한 것이다. 빌트인 help 함수는 다음을 기준으로 출력 생성 __doc__ 특성 이러한 문자열은 다음과 같이 구분할 수 있다. " 또는 ' 단일 줄 문자열 또는 다음 중 하나로 구분된 경우 여러 줄에 걸쳐 있을 수 있음 """ 또는 ''' 다중 행 문자열을 지정하기 위한 파이썬의 표기법이지 단, 언어의 스타일 가이드는 세 개의 큰따옴표를 명시한다.""")는 단일 및 다중 회선 문서 스트링 모두에 대해 선호된다.[29]
단일 줄 문서 문자열:
반항하다 지레짐작하다(): """"stdin에서 한 줄을 구해 돌려준다.""" 돌아오다 sys.스틴.글을 읽다() 다중 줄 문서 문자열:
반항하다 지레짐작하다(): """"한 줄 가져오기 성찬부터 그리고 돌려준다. """ 돌아오다 sys.스틴.글을 읽다() 문서 작성은 프로그래머가 원하는 만큼 클 수 있으며 줄 바꿈을 포함할 수 있다. 설명과 대조적으로, 문서 문자열은 그 자체로 Python 객체로서 Python이 실행하는 해석 코드의 일부분이다. 즉, 실행 중인 프로그램이 자체 문서를 검색하여 해당 정보를 조작할 수 있지만, 일반적인 용도는 문서 문자열에 문서화된 개체를 호출하는 방법에 대한 정보를 다른 프로그래머에게 제공하는 것이다.
Python 코드에서 문서를 추출하고 문서를 생성할 수 있는 도구가 있다. 문서 문자열 설명서는 또한 다음을 통해 통역자에게서 접근할 수 있다. help() fydoc 명령을 사용하여 셸에서 기능하거나 pydoc.
Docoptest 표준 모듈은 Python 셸 세션에서 문서 문자열로 복사한 상호작용을 사용하여 테스트를 생성하는 반면, docopt 모듈은 이를 사용하여 명령줄 옵션을 정의한다.
함수 주석
기능 주석(유형 힌트)은 PEP 3107에 정의되어 있다.[30] 그들은 인수에 데이터를 첨부하고 함수의 반환을 허용한다. 주석 동작은 언어에 의해 정의되지 않으며, 제3자 프레임워크에 맡겨진다. 예를 들어, 정적 타이핑을 처리하기 위해 라이브러리를 작성할 수 있다.[30]
반항하다 운반하다(항목: 운반 가능, *바그스: 팩애니멀) -> 거리 장식가
장식자는 함수, 메서드 또는 클래스 정의를 수정하는 데 사용되는 모든 호출 가능한 Python 객체다. 장식가는 정의되는 원래 객체를 통과하고 수정된 객체를 반환하며, 이 객체는 정의의 이름에 바인딩된다. 파이톤 장식가들은 부분적으로 자바 주석에서 영감을 받았고 유사한 구문을 가지고 있다; 장식자 구문은 순수한 구문설탕이다. @ 키워드:
@viking_chorus 반항하다 menu_menu(): 인쇄하다("스팸") 와 같다
반항하다 menu_menu(): 인쇄하다("스팸") menu_menu = viking_viking(menu_menu) 장식가는 메타프로그래밍의 한 형태다; 그것들은 그들이 꾸미는 기능이나 방법의 작용을 강화시킨다. 예를 들어, 아래 샘플에서는 viking_chorus 원인이 될 수도 있다 menu_item 호출될 때마다 8회 실행(스팸 스케치 참조):
반항하다 viking_viking(마이펑크): 반항하다 inner_funk(*아그, **크워그): 을 위해 i 에 범위(8): 마이펑크(*아그, **크워그) 돌아오다 inner_funk 기능 장식가의 표준적인 용도는 클래스 메서드나 정적 메서드를 만들고, 기능 속성 추가, 추적, 사전 및 포스 조건 설정, 동기화를 위한 것이지만,[31] 꼬리 재귀 [32]제거, 메모화, 심지어 다른 장식가의 쓰기 개선 등 훨씬 더 많은 용도로 사용될 수 있다.[33]
장식자는 인접한 선에 여러 개를 배치하여 체인으로 묶을 수 있다.
@invincible @favourite_colour("파란색") 반항하다 black_messages(): 통과하다 와 같다
반항하다 black_messages(): 통과하다 black_messages = 무적의(favorite_properties("파란색")(black_messages)) 또는 중간 변수를 사용하여
반항하다 black_messages(): 통과하다 blue_boardator = favorite_properties("파란색") 장식_by_by_blue = blue_boardator(black_messages) black_messages = 무적의(장식_by_by_blue) 위의 예에서, favourite_colour 실내 장식 공장은 논쟁을 벌인다. 장식 공장들은 반드시 장식가를 돌려주어야 하며, 그 다음에 그 주장으로 장식할 대상과 함께 불려진다.
반항하다 favorite_properties(색칠을 하다): 반항하다 실내 장식가(펑크): 반항하다 포장지(): 인쇄하다(색칠을 하다) 펑크() 돌아오다 포장지 돌아오다 실내 장식가 이것은 그 다음에 장식할 것이다. black_knight 색상이 변하도록 기능한다. "Blue"에 앞서 인쇄됨 black_knight 작동시키다 마감은 색상 인수가 반환되어 범위를 벗어나도 가장 안쪽 포장 기능에 접근할 수 있도록 보장하며, 이것이 장식가들이 작업을 할 수 있게 해준다.
그 이름에도 불구하고 파이톤 장식가들은 장식가 패턴의 구현이 아니다. 데코레이터 패턴은 런타임에 객체에 기능성을 추가할 수 있도록 정적으로 타이핑된 객체 지향 프로그래밍 언어에 사용되는 디자인 패턴이다. 파이톤 데코레이터는 정의 시 기능과 방법에 기능을 추가하기 때문에 데코레이터 패턴 클래스보다 높은 수준의 구성이다. 장식자 패턴 자체는 Python에서 사소한 것으로 구현이 가능하다. 왜냐하면 언어는 오리타입이기 때문에 보통 그렇게 여겨지지 않기 때문이다.[clarification needed]
부활절 달걀
C나 자바와 같은 곱슬곱슬한 괄호 언어를 사용하는 사용자들은 때때로 파이썬이 블록-지연자 규약을 따르기를 기대하거나 희망하기도 한다. 브레이스 기수 블록 구문은 반복적으로 요청되어 핵심 개발자들에 의해 지속적으로 거부되어 왔다. 파이톤 통역사는 이 문제에 대한 개발자들의 감정을 요약한 부활절 달걀을 포함하고 있다. 코드 from __future__ import braces 예외를 제기하다 SyntaxError: not a chance. The __future__ 모듈은 보통 미래의 파이썬 버전에서 기능을 제공하기 위해 사용된다.
또 다른 숨겨진 메시지, Python의 Zen(Python 디자인 철학의 요약)은 다음과 같은 시도를 할 때 표시된다. import this.
메세지 Hello world! 수입명세서가 인쇄될 때 import __hello__ 사용된다. Python 2.7에서는, 대신에 Hello world! 그것이 인쇄하다 Hello world....
가져오기: antigravity 모듈은 웹 브라우저를 xkcd 코믹 353에 열어 그러한 모듈을 위한 유머러스한 허구적 사용을 묘사한다. 이는 파이썬 모듈이 추가적인 기능을 가능하게 하는 용이성을 증명하기 위한 것이다.[34] 파이톤 3에서 이 모듈에는 xkcd 만화 426에 대한 참조인 "지오하시" 알고리즘의 구현도 포함되어 있다.[35]
참조
- ^ "읽기성이 중요하다." - PEP 20 - 웨이백 머신에 보관된 2014-12-05 파이썬
- ^ "PEP 20 - The Zen of Python". Python Software Foundation. 2004-08-23. Archived from the original on 2008-12-03. Retrieved 2008-11-24.
- ^ "2. Lexical analysis". Python 3 documentation. Python Software Foundation. Retrieved 2021-03-11.
- ^ "2. Lexical analysis". Python v2.7.18 documentation. Python Software Foundation. Retrieved 2021-03-11.
- ^ "New Keywords". Python v3.5 documentation. Docs.python.org. Archived from the original on 2016-06-18. Retrieved 2016-06-01.
- ^ "PEP 8 -- Style Guide for Python Code". Python.org. Retrieved 2021-03-17.
- ^ Hoffa, Felipe (2017-07-26). "400,000 GitHub repositories, 1 billion files, 14 terabytes of code: Spaces or Tabs?". Medium. Retrieved 2021-03-11.
- ^ "Tabs or Spaces". ukupat.github.io. Retrieved 2021-03-11.
- ^ "PEP 8 -- Style Guide for Python Code". Python.org. Retrieved 2021-03-11.
- ^ "PEP 498 - Literal String Interpolation". What’s New In Python 3.6. 2016-12-23. Archived from the original on 2017-03-30. Retrieved 2017-03-29.
- ^ "2. Lexical analysis". Python v2.7.5 documentation. Docs.python.org. Archived from the original on 2012-10-23. Retrieved 2013-08-16.
- ^ "2. Lexical analysis". Python v2.7.5 documentation. Docs.python.org. Archived from the original on 2012-10-23. Retrieved 2013-08-16.
- ^ 해시 가능한 항목은 일반적으로 불변하지만, 정의상 반드시 그렇지는 않다. python.org/3/glossary.htm을 참조하십시오.
- ^ "6. Expressions — Python 3.9.2 documentation". docs.python.org. Retrieved 2021-03-17.
- ^ "Archived copy". Archived from the original on 2016-01-27. Retrieved 2016-01-19.CS1 maint: 제목으로 보관된 복사본(링크)
- ^ "Archived copy". Archived from the original on 2016-01-26. Retrieved 2016-01-19.CS1 maint: 제목으로 보관된 복사본(링크)
- ^ "Archived copy". Archived from the original on 2016-01-26. Retrieved 2016-01-19.CS1 maint: 제목으로 보관된 복사본(링크)
- ^ David Mertz. "Functional Programming in Python". IBM developerWorks. Archived from the original on 2007-02-20. Retrieved 2007-08-27.
- ^ "PEP 308 -- Conditional Expressions". Archived from the original on 2016-03-13. Retrieved 2016-04-14.
- ^ 그
nonlocal키워드는 PEP 3104Wayback Machine에서 Archive 2014-12-02에 의해 채택됨 - ^ "Python Style Guide". docs.python-guide.org. Archived from the original on 2015-03-09. Retrieved 2015-03-08.
- ^ "PEP 343 -- The "with" Statement". Archived from the original on 2014-12-14. Retrieved 2014-08-15.
- ^ "Glossary — Python 3.9.2 documentation". docs.python.org. Retrieved 2021-03-23.
- ^ EAFP 2012-10-26, 웨이백 머신(Wayback Machine), 파이톤 글로서리에 보관
- ^ Hamblen, Diane. "Only the Limits of Our Imagination: An exclusive interview with RADM Grace M. Hopper". Department of the Navy Information Technology Magazine. Archived from the original on January 14, 2009. Retrieved 2007-01-31.
- ^ a b 파이톤, 알렉스 마텔리 134쪽
- ^ LBYL 2018-01-21 Wayback Machine, Python 글로서리에 보관
- ^ Alex Martelli (19 May 2003). "EAFP v. LBYL". python-list mailing list. Archived from the original on 14 July 2012. Retrieved 18 July 2011.
- ^ "PEP 8 -- Style Guide for Python Code". Python.org. Retrieved 2021-03-23.
- ^ a b "PEP 3107 -- Function Annotations". Archived from the original on 2015-01-06. Retrieved 2014-08-15.
- ^ "Python 2.4 Decorators: Reducing code duplication and consolidating knowledge". Dr. Dobb's. 2005-05-01. Archived from the original on 2007-02-06. Retrieved 2007-02-08.
- ^ "New Tail Recursion Decorator". ASPN: Python Cookbook. 2006-11-14. Archived from the original on 2007-02-09. Retrieved 2007-02-08.
- ^ "The decorator module". Archived from the original on 2007-02-10. Retrieved 2007-02-08.
- ^ cpython: The Python programming language, Python, 2017-10-15, archived from the original on 2017-09-15, retrieved 2017-10-15
- ^ "Another hidden treasure. · python/cpython@b1614a7". GitHub. Retrieved 2017-10-15.
외부 링크
- 파이썬의 저자인 귀도 반 로섬이 쓴 파이썬 자습서.