파이썬의 장점은 일관성이게에 새로운 기능에 대해서도 제대로된 예측을 할 수 있다.파이썬이 제공하는 API를 이용하면 고유의 객체를 정의하여 대부분의 파이썬 상용구르 적용할 수 있다.던더 메서드특별 메서드처럼 앞뒤에 이중 언더바를 갖고 있다.예시objkey 형태의 구분이
특별 메서드는 파이썬 인터프리터가 호출하는 것이지 사용자가 직접 호출하는 것은 아닙니다.내장 함수를 활용하면 해당 특별 메서드를 빠르게 호출한다.사용자 정의 속성을 만들 때는 앞 뒤로 이중 언더바를 가진 foo와 같은 형태의 속성명은 피하라나중에 특별한 의미를 갖도록
특별 메서드 개요는 아래의 링크를 참고하는 것이 좋습니다.http://docs.python.org/3/reference/datamodel.html피연산자의 순서가 바뀔 경우 (a b 대신 b a 사용) 역순 연산자가 사용되는 반면, 복합 할당은 중위 연산자
ABC 언어는 초보자를 위한 프로그래밍 환경을 개발하기 위한 것으로 시퀀스에 대한 범용 연산, 내장된 튜플과 매핑 자료형, 들여쓰기를 이용한 구문 구조, 변수를 선언하지 않고 강력하게 자료형 검사하기 등 우리가 '파이썬스러운' 것이라고 생각하는 것이다. 파이썬을 만들기
지능형 리스트나 제너레이터 표현식을 사용하면 가독성이 좋고 때론 실행 속도가 빠른 코드를 짤 수 있고 시퀀스를 간단히 생성할 수 있다."""속도 측면에서 보면, map()/ filter()를 조합한 방법이 지능형 리스트보다 빠르다고 생각한다."""symbols = 'q
튜플은 불변 리스트로 사용할 수도 있고 필드명이 없는 레코드로 사용할 수도 있기에 레코드로 사용하는 경우를 간과하는 경우가 종종 있다.튜플은 레코드를 담고 있고 각 항목은 레코드의 필드 하나를 의미하기에 항목의 위치가 곧 의미를 결정한다.튜플이 필드의 집합으로 사용하는
파이썬에서 제공하는 list, tuple, str은 시퀀스형이 슬라이싱 연산을 지원하고, 이번 블로그에선 고급 사용법을 알려고 한다.많은 사람들이 마지막 항목이 연산되지 않는 다는 것은 알지만 왜인지는 모를 것이다.연산이 되지 않는 이유는 관례상 인덱스 번호가 0부터
덧셈의 경우 피연산자 두 개가 같은 자료형이어야 하며, 둘 다 변경되지 않지만 동일한 자료형의 시퀀스가 새로 만들어진다, 덧셈 및 곱셈 연산자는 언제나 객체를 새롭게 만들고, 피연산자를 변경하지 않는다.리스트의 리스트를 초기화해야 하는 경우가 종종 있다.
sort(): 선택적으로 두 개의 키워드를 인수로 받는다.list.sort() 메서드는 사본을 만들지 않고 리스트 내부를 변경해서 정렬하고, sort() 메서드는 타깃 객체를 변경하고 새로운 리스트를 생성하지 않았음을 알려주기 위해 None을 반환한다 이것은 파이썬 A
bisect 모듈은 bisect()와 insort()함수를 제공하고, bisect()는 이진 검색 알고리즘을 활용해서 시퀀스를 검색하고, insort()는 정렬된 시퀀스 안에 항목을 삽입한다.bisect(haystack, needle)은 정려려된 시퀀스인 haystac
리스트의 사용성은 좋지만 세부 요구사항에 따라서 더 나은 자료형도 있습니다. 예를 들어, 실수를 수 천만 개 저장할 때 배열이 효율적입니다.리스트 안에 숫자만 들어 있다면 배열이 리스트보다 훨씬 더 효율적이고, 배열은 pop(), insert(), extend() 등을
dict 형은 애플리케이션에서 널리 사용되고 파이썬에서 핵심 부분이다. 왜냐하면, 모듈 네임스페이스, 클래스 및 인스턴스 속성, 함수의 키워드 인수 등 핵심 부분에 딕셔너리가 사용되고 있고, 내장 함수들은 builtins.dict에 들어 있다. 파이썬 dict 클래스는
모든 반복형 객체에서 키-값 쌍을 생성함으로써 딕셔너리 객체를 만들 수 있고, 이를 활용해서 동일한 튜플 리스트에서 딕셔너리 두 개를 생성할 수 있다.listcomp에 익숙해지면 자연스럽게 dictcomp에도 익숙해지므로 listcomp를 확장한 구문이 많이 나온다.
매핑이 제공하는 기본 API는 정말 많고, dict와 dict의 변형 중 가장 널리 사용되는 것은 defaultdict와 OrderedDict 클래스가 구현하는 메서드를 보여준다.update() 메서드가 첫 번째 인수 m을 다루는 방식은 덕 타이핑의 대표적인 사례로 m
검색할 때 키가 존재하지 않을 때 특별한 값을 반환하는 매핑이 있으면 편리한 경우들이 있고 이를 만드는 것은 두 가지가 있다. 첫 번째, 평벙한 dict대신 defaultdict를 사용하는 방법이고 다른 하나는 dict등의 매핑형을 상속해서 missing()메서드를 추
defaultdict 이외에 표준 라이브러리의 collections 모듈에서 제공하는 여러 매핑형을 간단히 알아본다.키를 삽입한 순서대로 유지함으로써 항목을 반복하는 순서를 에측할 수 있고, OrderDict의 popitem()메서드는 기본적으로 최근에 삽입한 항목을
dict보다 UserDict를 상속해서 매핑형을 만드는 것이 쉬운 이유는 매핑에 추가한 키를 문자열로 저장하기 위해선 StrKeyDict0을 확장했던 것처럼 UserDict의 값을 평가할 수 있다.내장형에서는 아무런 문제없이 상속할 수 있는 메서들을 오버라이드해야 하
표준 라이브러리에서 제공하는 매핑형은 모두 가변형이지만, 사용자의 실수로 매핑을 변경하지 못하도록 할 때, missing()메서드에서 Pingo.io 프로젝트를 설명할 때 물리적인 범용입출력(GPIO) 핀을 나타내는 board.pins라는 불변형 매핑을 사용하는 구체적
집합은 고유한 객체의 모음으로, 중복 항목을 제거하고 반드시 해시할 수 있어야 합니다. set은 해시 가능하지 않지만 frozenset는 해시 가능하므로, forzenset이 set에 들어갈 수 있다. 고유함을 보장하는 것 외에 집합형은 중위 연산자를 이용해서 기본적인
이진 시퀀스를 위해서 사용되는 내장 자료형은 bytes와 bytearray가 있고, bytes 형은 파이썬 3에서 소개된 불변형이고, bytearra는 파이썬 2.6에 추가된 가변형이다. bytes와 bytearray에 들어 있는 각 항목은 0에서 255 사이의 정수
텍스트를 바이트로 혹은 바이트를 텍스트로 변환하기 위해 파이썬 배포본에는 100여 개의 코덱(인코더/디코더)이 포함되어 있다. 코텍은 open(), str.encode(), bytes.encode() 등의 함수를 호출할 때 encoding인수에 전달해서 사용할 수 있
텍스트와 바이트 인코딩/디코딩 문제
유니코드에는 결합 문자가 있어서 문자열 비교가 간단하지 않고 앞 문자에 연결되는 발음 구별 기호는 인쇄 시 앞 문자와 하나로 결합되어 출력된다.위에서 보는 것처럼 파이썬은 서로 다른 두 개의 코드 포인트 시퀀스를 보고, 이 둘은 서로 동일하지 않다고 판단한다.해결방법은
파이썬은 각 시퀀스 안에 들어 있는 항목들을 하나하나 비교하여 어떤 자료형의 시퀀스도 설명할 수 있고, 문자열의 경우에는 각 단어의 코드 포인트를 비교한다. 바이스키 문자를 사용하는 경우 부적절한 결과가 발생할 수 있다.정렬 규칙은 현지 언어에 따라 달라지고, 포르투칼
유니코드 표준은 수 많은 구조화된 텍스트 파일의 형태로 하나의 완전한 데이터베이스를 제공한다.이 데이터베이스엔 코드 포인트를 문자명으로 매핑하는 테이블뿐만 아니라 각 문자에 대한 메타데이터 및 각 문자의 연관 방법을 담고 있다.str의 isidentifier(), is
표준 라이브러리에는 str이나 bytes 인수를 모두 받을 시, 인수의 자료형에 따라 다르게 작용하는 함수들이 있고, re 와 os 모듈이 대표적이다.bytes로 정규 표현식을 만들 경우 \\d와 \\w같은 패턴은 아스키 문자만 매칭되고, str로 이 패턴을 만들 시
파이썬의 함수는 일급 객체로 다양한 기능이 구현됩니다.런타임에 생성할 수 있다.데이터 구조체의 변수나 요소에 할당할 수 있다.함수 인수로 전달할 수 있다.함수 결과로 반환할 수 있다.
객체로서의 함수 일급함수 고위함수 함수를 인수로 받거나, 함수를 결과로 반환하는 함수를 고위 함수라고 하고, 대표적인 예시론, map() 함수가 있다. list.sort()와 sorted() 내장 함수에서 설명한 sorted() 내장 함수도 일급 함수의 예이고, s
객체로서의 함수 익명 함수 lambda는 파이썬의 단순한 구문이 람다 함수의 본
객체로서의 함수 익명 함수 lambda는 파이썬의 단순한 구문이 람다 함수의 본
호출 연산자인 ()는 사용자 정의 함수 이외의 다른 객체에도 적용할 수 있고, 호출할 수 있는 객체인지 알아보려면 callable() 내장 함수를 사용한다.사용자 정의 함수def 문이나 람다 표현식으로 생성한다.내장 함수len()이나 time.strftime()처럼 C
파이썬 함수가 실제 객체일 뿐만 아니라, 모든 파이썬 객체가 함수처럼 동작할 수 있게 call()인스턴스 메서드 구현BingoCase의 경우 객체를 함수처럼 호출할 때마다 항목을 하나 꺼내서 변경 후 상태를 유지하는 call() 메서드를 구현하면 객체를 생성하기 쉽고,
객체로서의 함수 일급함수 함수 인트로스펙션 함수 객체는 doc이외에도 많은 속성을 갖고 있고 dir()함수가 factorial() 함수에 대해서 공개 대부분 파이썬 객체에 존재하는 속성으로 함수를 객체로 다루는 것과 관련된 속성을 살펴보면 되므로 dict 속성을 살
키워드 전용 인수를 이용해서 향상된 파이썬3는 융통성 있는 매개변수 처리 메커니즘으로 파이썬 함수에서 볼 수 있는 가장 훌륭한 기능 중 하나로 함수를 호출할 때 반복 가능 객체나 매핑형을 별도의 인수로 폭발시키는 \*와 \*\*기호도 이 메커니즘과 밀접하게 연관이 되어
파이썬3는 함수의 매개변수와 반환값에 메타데이터를 추가할 수 있는 구문을 제공합니다.함수 선언에서 각 매개변수에는 콜론 뒤에 애너테이션 표현식을 추가하고, 기본값이 있을 때 애너테이션은 인수명과 등호 사이에 들어갑니다. 그리고, 반환값에 애너테이션을 추가하려면 매개변수
귀도 반 로섬은 파이썬이 함수형 프로그래밍 언어를 지향하지 않다고 하지만 operator와 functools와 같은 패키지들의 지원 덕분에 파이썬에서도 함수형 코딩 스타일을 사용할 수 있다.함수형 프로그래밍을 할 때 산술 연산자를 함수로 사용하는 것이 편리하고, 팩토리
디자인 패턴이 언어에 독립적이긴 하지만, 모든 언어에 적용될 수 있는 것은 아니고, '동적 언어에서의 디자인 패턴 발표'에서 피터 노빅은 에릭 감마와 공저한 디자인 패턴에서 정의한 23개의 패턴 중 16개는 동적 언어에서 '보이지 않거나 더 단순하다'고 설명한다.전략
전략 객체는 상태(객체 속성)를 가지고 있지 않고, 일반 함수로 보인다고 생각하면 제대로 본 것이므로 구체적인 전략을 간단히 함수로 변경했고, Promotion 추상 클래스를 제거했다.저자는 전략 객체는 종종 훌륭한 flyweight가 된다는 재미있는 이야기를 했는데
테스트와 동일한 고객,쇼핑 카트가 주어졌을 때와 같이 테스트 3개를 추가해보자promos는 함수들의 리스트로, 가독성이 좋고 제대로 동작은 하지만 일부 코드가 중복이 되어 있으므로 버그가 생길 여지가 있고, 새로운 할인 전략을 추가하려면 함수를 코딩하고 이 함수를 pr
함수를 인수로 전달하는 기법을 사용하면 명령 디자인 패턴도 구현을 단순하게 만들 수 있다.명령 패턴의 목적은 연산을 실행하는 객체(호출자)의 연산을 구현하는 객체(수신자)를 분리하는 것으로 그래픽 애플리케이션의 메뉴 항목이 호출자며, 편집되고 있는 문서나 애플리케이션
함수 데커레이터는 소스 코드에 있는 함수를 '표시'해서 함수의 작동을 개선할 수 있게 해주고, 강력한 기능이지만, 데커레이터를 자유자재로 사용하려면 먼저 클로저를 알아야 한다.파이썬 3.0에 추가된 nonlocal은 최근에 추가된 예약 키워드 중 하나로, 클래스 중심의
데커레이터의 핵심 특징은 데커레이터된 함수가 정의된 직후에 실행된다는 것으로 일반적으로 파이썬이 모듈을 로딩하는 시점,즉 임포트 타임에 실행된다.register()는 모듈 내의 다른 어떠한 함수보다 먼저 실행 (두 번)되고, register()가 호출될 때 데커레이터된
코드를 반복하는 행위를 줄여야 하는데, 그 방법은 등록 데커레이터를 사용하는 것이다.프로모션 전략 함수명이 특별한 형태로 되어 있을 필요 없고, @promotion 데커레이터는 데커레이터된 함수의 목적을 명확히 알려주며, 임시로 어떤 프로모션을 배저할 수 있지만 주석처
파이썬이 함수 본체를 컴파일할 때 b가 함수 안에서 할당되므로 b를 지역 변수로 판단하고, 생성된 바이트코드를 보면 이 판단에 의해 지역 환경에서 변수 b를 가져오려 한다는 것을 알 수 있고, f2(3)을 호출할 때 f2의 본체는 지역 변수a의 값을 출력하지만, 지역
클로저는 익명 함수와의 개념 혼동이 일어나지만, 클로저는 함수 본체에서 정의하지 않고 참조하는 비전역 변수를 포함한 확장 범위를 가진 함수로, 함수가 익명 함수인지 여부는 중요하지 않고, 함수 본체 외부에 정의된 비전역 변수에 접근할 수 있다는 것이 중요하다.클래스로
이전 블로그에서 구현한 make_averager()는 그리 효율적이지 않고, 우리는 모든 값을 series에 저장하고 average()가 호출될 때마다 sum을 계산했다. 합계와 항목 수를 저장한 후 이 두 개의 숫자를 이용해서 평균을 구하면 훨씬 더 효율적으로 구현할
파이썬에서 데커레이터하기 위한 것은 property(), classmethod(), statoc,etjpd)를 제공한다.이 중 자주 보는 것은 functools.warps()로, 제대로 작동하는 데커레이터를 만들기 위한 헬퍼이다.functools.lru_cache()는
@clock이 적용된 fabonacci()에 다시 @lru_cache가 적영되었고, 모듈의 마지막 함수에 @htmlize.register 데커레이터가 두 번 적영되었다.
객체로서의 함수 데커레이터와 클로저 매개변수화된 데커레이터 데커레이터를 파싱할 때 파이썬은 함수를 가져와서 데커레이터 함수의 첫 번째 인수로 넘겨주는데 다른 인수를 받아서 데커레이터를 반환할 수는 없을가요? 답은, 인수를 받아 데커레이터를 반환하는 데커레이터 팩토리
코드 안에서 lewis와 charles는 별명으로 두 변수가 동일 객체에 바인딩되어 있고, alex는 charles에 대한 별명이 아니고, 이 두 변수는 서로 다른 객체에 바인딩되어 있다. alex에 바인딩된 객체와 charles에 바인딩된 객체가 동일한 값을 갖고 있
생성자나 :을 사용하면 얕은 본사를 생성하고, 최상위 컨테이너는 복제하지만 사본은 원래 컨테이너에 들어있던 동일 객체에 대한 참조로 채워지고,모든 항목이 불변형이면 이 방식은 메모리를 절약하며 아무런 문제를 일으키진 않지만 가변 항목이 들어 있을 경우 불쾌한 문제를 야
파이썬은 공유로 호출하는 매개변수 전달 방식만 지원하고, 루비,스몰크, 자바등의 대부분의 객체지향 언어에서 사용하는 방식과 동일하다.공유로 호출한다는 말은 함수의 각 매개변수가 인수로 전달받은 각 참조의 사본을 받는 것으로 함수 안의 매개변수는 실제 인수의 별명이 된
del 명령은 이름을 제거하는 것인지, 객체를 제거하는 것이 아니라 del 명령의 결과로 객체가 가비지 컬렉트될 수 있지만, 제거된 변수가 객체를 참조하는 최후의 변수거나 객체에 도달할 수 없을 때만 가비지 컬렉트되므로 변수를 다시 바인딩해도 객체에 대한 참조 카운트를
객체가 메모리에 유지되거나 유지되지 않도록 만드는 것은 참조의 존재 여부로 객체 참조 카운트가 0이 되면 가비지 컬렉터는 해당 객체를 제거하는 것으로 불필요하게 객체를 유지시키지 않으면서 객체를 참조할 수 있으면 도움이 되는 경우가 종종 있는데 대표적인 예로 캐시이다.
튜플 t에 대해 t:가 사본을 생성하지않고 그 객체에 대한 참조를 반환한다는 사실로, tuple(t)로 작성하더라도 튜플 t에 대한 참조가 반환된다.t1 = (1,2,3)t3 = (1,2,3)t3 is t1 s1 ='ABC's2 = 'ABC's2 is s1 \`\`\`
파이썬 데이터 모델 덕분에 사용지기 정의한 자료형도 내장 자료형과 마찬가지로 자연스럽게 동작을 할 수 있는데상속하지 않고도 덕 타이핑 매커니즘을 통해서 이 모든 것이 가능하고, 단지 객체에 필요한 메서드를 구현하면 기대한 대로 동작한다.지금까지 여러 내장 객체의 구조와
객체 표현을 생성하기 위해 사용하는 여러 메서드의 예를 살펴보기 위해 Vector2d 클래스를 사용하므로 클래스를 계속 확장해나간다.Vec/tor2d 클래스는 vector2d_vo.py에 구현되어 있지만 비교를 위해 사용하는 ==연산자를 제외한 중위 연산자는 구현된다.
Vector2d를 bytes로 변환하는 메서드가 있으니, 당연히 bytes를 vector2d로 변환하는 메서드도 있어야할 것이고 영감을 얻기 위해서 표준 라이브러리를 살펴보면, frombytes()라는 클래스 메서드를 가진 array.array가 우리 상황에 맞다.
파이썬 튜토리얼에서는 @classmethod와 @staticmethod 데커레이터에 대해 설명하지 않는다는 것으로 자바 언어로 객체지향 개념을 배운 사람은 이 두 데커레이터가 파이썬에 있는 이유가 궁금할 것입니다.@classmethod이 데커레이터는 객체가 아닌 클래스
format() 내장 함수와 str.format() 메서드는 실제 포맷 작업을 format(format_spec) 메서드에 위임하고, format_spec는 포맷 명시자로서, format(my_obj, format_spec)의 두 번째 인수, str.format()에
Vector2d를 해시 가능하게 만들려면 hash() 메서드를 구현해야 하므로 불변형으로 만들어야 한다.불변형으로 만들었으니, hash() 메서드를 구현할 차례로, hash() 메서드는 int형을 반환해야합니다.동일하다고 판단되는 객체는 동일한 해시 값을 가져야 하므로
파이썬에 private 수장자가 있는 자바와 달리 비공개 변수를 생성할 수 있는 방법은 없으나, 서브 클래스에서 "비공개"성격의 속성을 실수로 변경하지 못하게 하는 간단한 메커니즘은 있다.예를 들면클래스 외부에 노출시키지 않고 내부적으로 개의 상태를 나타내는 mood
파이썬은 객체 속성을 각 객체 안의 dict라는 딕셔너리형 속성에 저장하고, 딕셔너리는 빠른 접근 속도를 제공하기 위해 내부에 해시 테이블을 유지하므로 메모리 사용량 부담이 상힝히 크므로 속성이 몇 개 없는 수백만 개의 객체를 다룬다면, slots 클래스 속성을 이용해
객체 속성의 기본값으로 사용하는 것은 파이썬의 독특한 특징으로, Vector2d클래스에는 typecode라는 클래스 속성이 있고, 이 속성은 bytes() 메서드에서 두 번 사용되고, 단지 self.typecode로 그 값을 읽습니다. Vector2d 객체가 그들 자신
다차원 벡터를 나타내는 클래스를 생성해서 2차원 Vector2d 클래스를 개선할 것이고, 표준 파이썬의 불변 균일 시퀀스와 비슷하게 작동할 것이며, 실수를 요소로 가지게 된다.지원기능기본 시퀀스 프로토콜: len과 getitem() 메서드여러 항목을 가진 객체를 안전하
Vector 생성자는 Vector2d 생성자와 호환되지 않도록 설계하여, init() 메서드에서 임의의 인수 \*args를 받아서 Vector(3,4) 나 Vector(3,4,5)형태로 작동하게 만들 수 있으나 시퀀스 생성자는 내장 시퀀스처럼 반복형을 인수로 받게 만드
프로토콜은 객체지향 프로그래밍에서 프로토콜은 문서에만 정의되어 있고 실제 코드엔 정의되지 않은 비공식 인터페이스이다.예를 들어, 파이썬의 시퀀스 프로토콜은 len()과 getitem() 메서드를 동반하여 표준 시그니처와 의미에 따라서 이 메서드들을 구현하는 어떠한 클래
FrenchDeck 예제에서 self.\_components를 사용한 것처럼 객체 안에 들어있는 시퀀스 속성에 위임하면 시퀀스 프로토콜을 구현하기 위한 len()과 getitem()메서드를 구현할 수 있다.내장된 시퀀스형은 슬라이싱 했을 때 다른 자료헝이 아니라 자신과
Vector2d에서 Vector로 진화하면서 v.x, v.y처럼 벡터 요소를 이름으로 접근하는 능력을 상실했지만 @prperty 데커레이터를 이용해서 x와 y에 읽기 전용 접근을 제공하여 Vector에 네 개의 프로피터를 작성할 수도 있지만, 그 과정은 지루하고 get
reduce() 메서드는 일련의 값을 하나의 값으로 줄이는 것으로 reduce()가 받는 첫 번째 인수는 두 개의 인수를 받는 함수, 두 번째 인수는 반복형으로 인수 두 개를 받는 함수fn과 리스트 lst가 있을 때, reduce(fn,lst)를 호출하면 첫 번째 요소
Vector의 format() 메서드는 Vector2d의 format과 비슷하지만 구면 좌표를 사용한다.즉, 4차원 공간을 표현하는 방식이 조금 다르다.format() 메서드를수정하기 위해선 몇 가지 지원 메서드를 구현해야 하는데 angle(n)은 특정 좌표의 각 좌표
덕 타이핑의 상징인 동적 프로토콜에서부터 인터페이스를 명시하고 구현이 인터페이스에 따르는지 검증하는 추상 베이스 클래스(ABC)에 이르기까지 다양한 곳에서 인터페이스가 사용된다.인터페이스를 구현할 때 ABC가 슈퍼클래스로 널리 사용되는 것을 보여주고 구상 서브클래스가
파이썬 데이터 모델은 가능한 한 많이 핵심 프로토콜과 협업하겠다는 철할을 가지고 있고, 시퀀스의 경우 가장 단순한 객체를 사용하는 경우에도 파이썬은 최선을 다한다.iter()메서든ㄴ 아직 구현하지 않았지만, 대체 수단인 getitem()메서드가 구현되어 있으므로 Foo
시퀀스처럼 작동하는 클래스가 있다면 shuffle()메서드를 직접 구현할 필요가 없다. 왜냐하면, random.shuffle()함수 문서에서 설명하는 것처럼 random.shuffle()함수가 시퀀스 객체 안의 항목들을 섞어주기 때문이다.'FrenchDeck'객체가 할
ABC는 시퀀스나 정확한 숫자 같은 일종의 프레임워크가 소개하는 상당히 광범위한 개념이나 추상성을 담기 위해서 이 책을 읽는 독자라면 ABC를 새로 만들 필요가 전혀 없으므로 단지 기존 ABC를 제대로 사용한느 것만으로 잘못된 설계 위험없이 99.9%의 혜택을 볼 것이
ㅊ
파이썬 2.6이후 표준 라이브러리에 ABC가 포함된 것으로, numbers와 io 패키지에서도 볼 수 있지만, 대부분의 ABC는 collection.abc 모듈에 정의되어 있으며, 이 모듈에 정의된 ABC들이 가장 많이 사용됩니다.파이썬 3.4버전의 collection
Tombola 캘르스를 테스트하기 위해서 사용한 스크립트는 클래스 계층구조를 조사할 수 있게 해주는 두 가지 클래스 속성을 사용한다.subclasses()클래스의 바로 아래 서브클래스의 리스트를 반환하는 메서드, 리스트에 가상 서브클래스는 들어가지 않는다.\_abc_r
register()를 데커레이터로도 사용할 수 있지만, 다른 곳에서 정의된 클래스를 등록하기 위해서 함수 형태로 사용하는 경우가 더 많습니다.내장 자료형이 \_collections_abc.py에 있는 ABC에 등록이 되어있고, 모듈이 임포트될 때만 등록되는데, ABC에
알렉스 마르텔리는 클래스를 등록하지 않고도 ABC의 가상 서브클래스로 인식시킬 수 있으므로, issubclass()를 사용한 테스트를 추가한다."""issubclass() 함수는 Struggle을 abc.Sized의 서브 클래스라고 간주한다.abc.Sized가 subc
이번주는 Tkinter GUI 툴킷과 장고 웹 프레임워크라는 2개의 중요 파이썬 프로젝트를 이용해서 다중 상속을 설명한다.파이썬 2.2이전까지는 list나 dict등 내장 자료혀을 사용할 수 없지만, 2.2 버전 이후부터는 내장 자료형을 상속할 수는 있었으나 C언어로
다중 상속을 지원하는 언어에선 별개의 상위클래스가 동일한 이름으로 메서드를 구현하 ㄹ때 발생하는 이름 충돌 문제(다이아몬드 문제)를 해결해야 한다.D클래스 객체의 pong() 메서드를 호출하는 두 가지 방법파이썬이 상속 그래프를 조회할 때는 특정한 순서를 따르고, d.
collections.abc 패키지를 통해서 다중 상속을 많이 사용하고, Tcl/Tk에 대한 파이썬 인터페이스로서 tkinter 모듈에 구현된 Tkinter GUI 툴킷은 표준 라이브러리에 다중 상속을 극단적으로 사용하는 예이다.Toplevel시각적 위젯 중 유일하게
인터페이스 상속과 구현 상속을 구분한다.인터페이스 상속은 'is-a'관계를 의미하는 서브타입을 생성구현 상속은 재사용을 통해 코드 중복을 피한다.ABC를 이용해서 인터페이스를 명확히 한다.코드를 재사용하기 위해 믹스인을 사용한다.믹스인 클래스로 객체를 생성하면 안되며,
제너릭뷰는 검색 엔진의 검색 결과에선 자세한 정보 페이지에 대한 링크를 여러 페이지에 걸쳐 나열하는데, 장고의 리스트 뷰와 상세 뷰는 이러한 문제를 해결하기 위해서 설계가 되었고, 리스트 뷰는 검색 결과를 보여주고, 상세 뷰는 각 항목에 대한 페이지를 생성한다.그러므로
연산자 오버로딩은 사용자 정의 객체가 +와 | 같은 중위 연산자, -와 ~같은 단항 연산자를 사용할 수 있게 해주고, 함수 호출, 속성 접근, 항목 접근/슬라이싱도 연산자로 파이썬에 구현되어 있다.잘 사용하면 코드의 가독성이 향상되고 만족스러운 API를 구현할 수 있으
세 개의 단항연산자 및 이 연산자와 연관된 특별 메서드는 같다.abs() 내장 함수는 abs() 특별 메서드와 연관이 되어 있고, 단항 연산자는 구현이 쉬우며 self 인수 하나를 받는 적절한 특별 메서드를 구현하면 된다.클래스에 논리적으로 합당한 연산을 수행하지만,
시퀀스의 결합을 위해서 + 연산자를, 시퀀스의 반복을 위ㅐ서는 \* 연산자를 지원해야 한다.길이가 다른 두 개이 Vector 객체를 더하면, 에러가 생길 수 있으나 정보 검색등에서 활용되는 사례를 보면, 짧은 쪽 벡터의 빈 공간을 0으로 채워서 더하는 것이 낫다.
Vector 피연산자를 이용해서 곱하는 또 다른 방법은 두 벡터의 내적을 구하는 스칼라곱으로 Numpy및 이와 유사한 라이브러리에서는 \* 연산자를 사용하는 경우, 벡터의 각 항목에 값을 곱하며, 벡터의 스칼라곱을 구하기 위해서 numpy.dot()함수를 사용한다.sc
파이썬 인터프리터가 ==, != ,> , <, >=, <= 비교 연산자를 다루는 방법은 앞에서 설명한 방법과 비슷하다.
객체 내용을 변경하는 연산자를 보여주기 위해서 BingoCage 클래스를 확장해서 add와 iadd()를 구현(새로운 서브클래스: AddableBingoCage)AddableBingoCage는 가변형이다.두 번째 피연산자의 측면에서 보면 += 연산자가 + 연산자보다 자
데이터를 처리할 때 반복은 기본이고, 메모리에 들어가지 않는 데이터셋을 검색할 때는 항목들을 느긋하게 가져와야 하고, 한 번에 하나씩 그리고 필요할 때 가져와야 하고 이것을 하는 것이 반복자 패턴입니다.iter() 내장함수객체가 iter() 메서드를 구현하는지 확인하고
단항 연산자는 self 인수 하나를 받는 적절한 특별 메서드를 구현하기에ㅔ 쉽다. 물론, 클래스에 논리적으로 합당한 연산을 수행해야 하므로 self를 수정하지 말고 적절한 자료형의 객체를 새로 생성해서 반환해야 한다.단적으로, +와-인 경우 결과는 아마도 self와 같
리눅스 환경 구축 - WSL활성 윈도우 WSL을 이용해서 구축해 보기커멘드(관리자)창을 통해서 리눅스 서브시스템 지원 활성화WSL 2를 사용하기 위해 윈도우 업데이트 설치dism.exe /online /enable-feature /featurename:Microsoft
Vector 피연산자를 이용해서 곱하는 또 다른 방법은 두 벡터의 내적을 구하는 스칼라곱으로 현재 Numpy 및 이와 유사한 라이브러리에선 \*연산자를 사용하는 경우, 벡터의 각 항목에 값을 곱하며, 벡터의 스칼라곱을 구하기 위해서 numpy.dot()함수 사용
클래스가 인플레이스 연사자를 구현하지 않으면, 복합 할당 연산자는 단지 편의 구문으로서, a += b를 정확히 a = a +b와 동일하게 평가하고, 가변형의 경우 이렇게 동작하는 것이 타당하므로, add() 메서드가 구현되어 있으며 아무런 코드를 추가하지 않고도 +=
데이터를 처리할 땐 반복은 기본이며 메모리에 다 들어가지 않는 데이터셋을 검색할 때는 항목들을 느긋하게 가져와야 하므로 한 번에 하나씩 필요할 때 가져와야 합니다.(반복자 패턴)파이썬은 리스프와 달리 매크로가 없기에 반복자 패턴을 추상화할 수 있게 yield 키워드가
Sentence 클래스의 다음 버전은 고전적인 반복자 패턴에 맞춰 구현하고, 리팩토링하면서 명확해지지만, 파이썬의 관용적인 방법은 아니다.iter() 특별 메서드를 구현하고 있고, 이 메서드가 SentenceIterator를 반환하기 때문이다.
동일한 기능을 파이썬스럽게 구현하려면 SequenceIterator 클래스 대신 제너레이터 함수를 사용한다.Sentence 코드에서iter—( )는 SentenceIterator ( ) 생성자를 호출해서 반복자를생성하고반환했다. [예제 14-5] 의 반복자는사실 제너레
Iterator 인터페이스는 느긋하게 처리하도록 설계 되어 있고, next는 한 번에 한 항목만 생성하고, 느긋한 계산법의 반대는 조급한 계산법이고, 둘 다 프로그래밍 언어 이론에서 실제 사용되는 용어이다.init()에서 텍스트 안에 있는 단어들의 리스트를 조급하게 생
제너레이터 표현식은 지능형 리스트의 느긋한 버전으로 리스트를 생성하는 대신, 필요에 따라 항목을 느긋하게 생성하는 제너레이터를 반환하므로 지능형 리스트가 리스트 팩토리라면, 제너레이터 표현식은 제너레이터 팩토리라고 생각할 수 있다.제너레이터 표현식은 제너레이터를 생성하
.eq(), hash(), abs(), angle(), format(), add(), mul() 메서드가 각각 제너레이터 표현식을 사용하고 메서드에서 지능형 리스트를 사용해도 제대로 작동하겠지만, 중간의 리스트 값을 저장하기 위한 메모리를 더 많이 사용한다.제너레이터
전통적인 반복자 패턴은 모두 데이터 구조체를 뒤져서 항목들을 나열하기 위한 것이지만 수열에서 다음 항목을 가져우는 메서드에 기반한 표준 인터페이스는 컬렉션에서 항목을 가져오는 대신 실행 도중에 항목을 생성하는 경우에도 유용하게 사용할 수 있다.내장함수 range()는
다른 제너레이터에서 생성된 값을 상위 제너레이터 함수가 생성해야할 때는 전통적으로 중첩된 for 루프를 사용했다.chain() 제너레이터 함수는 입력받은 각각의 반복형에 차례대로 위임된다.yielf from i 문이 내부 for 루프를 완전히 대체한다.루프를 대체하는
모두 반복형을 입력받아 하나의 값으로 반환하고, 이 함수는 "리듀스","폴딩","누적"함수라고 한다.이런 함수는 모두 functools.reduce() 함수로 구현할 수 있지만, 자주 발생하는 특정 문제를 쉽게 처리하기 때문에 별도의 내장형 함수로 존재하고, all()
iter()함수는 일반 함수나 콜러블 객체로부터 반복자를 생성하기 위해 두 개의 인수를 전달해서 호출할 수 있다. 첫 번째 인수는 값을 생성하기 위해서 인수없이 반복적으로 호출되는 콜러블이다.두 번째 인수는 구분 표시로서, 콜러블에서 이 값이 반환되면 반복자가 Stop
제너레이터는 반복하기 위한 데이터를 생성한다.코루틴은 데이터의 소비자다.머리가 터지지 않으려면 이 두 개념을 뒤섞지 마라코루틴은 반복과 상관없다.주의: 코루틴 안에서 yield가 값을 생성하게 하는 것은 쓸모가 있지만, 이것은 반복과 상관없다.
with문은 콘텍스트 관리자 객체의 제어를 받아서 임시로 콘텍스트를 생성하고 신뢰성 있게 해제한다.with문은 에러를 예방하고 반복되는 코드를 줄여주며, API를 안전하고 편리하게 사용할 수 있게 만들고, 파일을 자동으로 닫아주는 기능 이상을 with 블록이 제공하고
반복자가 for문을 제어하기 위해 존재하는 것처럼 콘텍스트 관리자 객체는 with문을 제어하기 위해 존재한다.with문은 try//finally 패턴(이 패턴은 예외,return, sys.exit()호출등의 이유로 어떤 블록의 실행이 중단되더라도 이후의 일정한 코드를
closing()close() 메서드는 제공하지만 enter()/exit() 프로토콜을 구현하지 않는 객체로부터 콘텍스트 관리자를 생성하는 함수suppress지정한 예외를 임시로 무시하는 콘텍스트 관리자@contextmanager클래스를 생성하고 프로토콜을 구현하는 대
@contextmanager 데커레이터는 콘텍스트 관리자를 생성할 때 작성하는 틀에 박힌 코드를 줄여주고, enter()와 exit() 메서드를 가진 클래스 전체를 작성하는 대신 enter() 메서드가 반환할 것을 생성하는 yield문 하나를 가진 제너레이터만 구현하면
영사전에서 yield는 생산한다와 양보한다는 두 가지 뜻을 볼 수 있는데, 파이썬의 제너레이터에서 yield 키워드를 사용할 땐 두 가지 의미가 모두 적용된다.yied item 문장은 next()의 호출자가 받을 값을 생성하고, 양보하고, 호출자가 진행하며 또 다른 값
코루틴이 갖는 4가지 상태로 inspect.getgeneratorstate() 함수를 이용해서 현재 상태를 알 수 있다.GEN_CREATED실행을 시작하기 위해 대기하고 있는 상태GEN_RUNNING현재 인터프리터가 실행하고 있는 상태GEN_SUSPENDED현재 yie
클러저를 생성한 후 total과 count를 변수를 보존하는 고급함수코루틴을 사용 시, total과 count를 지역변수로 사용할 수 있고, 객체 속성이나 별도의 클로저없이 평균을 구한느데 필요한 값들을 유지할 수 있다.
코루틴은 기동되기 전엔 할 수 있는 게 많이 없고, my_coro.send(x)를 호출하기 전에 반드시 next(my_coro)를 호출한다.코루틴과 함께 사용하도록 설계된 특별 데커레이터를 제공하는 프레임워크는 많지만, 모두 코루틴을 기동시키는 것은 아니다.
close()와 thorw()가 코루틴 제어코루틴이 어떻게 종료되든 어떤 정리 코드를 실행해야 하는 경우에는 try/finally 블록 안에 코루틴의 해당 코드를 넣어야 한다.
averager() 코루틴을 변형해서 값을 반환하고, 활성화할 때마다 이동 평균을 생성하지 않는다.의미 있는 값을 생성하지는 않지만 최후에 어떤 의미 있는 값을 반환하는 코루틴도 있음을 설명해야 한다.return 문이 반환하는 값은 StopIteration 예외의 속성
제어 흐름 코루틴 yield from 사용하기 제너레이터 gen()이 yield from subgen()이 직접 호출자를 이끌고, gen()은 subgen()이 종료될 때까지 실행을 중단한다.
반복자가 또 다른 제너레이터인 경우, 하위 제너레이터의 본체가 yield from 표현식의 대상 안에 들어 가는 것과 동일한 효과가 발생하고 하위 제너레이터는 값을 가진 return문을 이용해서 값을 반환하며 yield from표현식의 값이 된다.동작 특징하위 제너레이
제어 흐름 코루틴 사용 사례: 이산 이벤트 시뮬레이션을 위한 코루틴 이산 이벤트 시뮬레이션(DES)에 대해 일련의 이벤트로 모델링을 하는 것이므로 고정된 값만큼 진행하는 것이 아니라, 모델링된 다음 이벤트의 시뮬레이션된 시각으로 바로 진행이 된다. 즉, 이벤트 루
긴 지연 시간동안 CPU 클록을 낭비하지 않기 위해서 네트워크 입출력을 효율적으로 처리하라면 동시성을 이용해야하고, 네트워크에서 응답이 오는 동안 다른 일을 처리하는 것이 좋다.순차 내려받기 스크립트동시성 버전을 구현할 때 중복을 피하기 위해 하나의 라이브러리로 사용
CPython 인터프리터는 내부적으로 스레드가 안전하지 않기에, 전역 인터프리터 락(GIL)을 가지고 있고, GIL은 한 번에 한 스레드만 파이썬 바이트코드를 실행하다록 제한한다. 그렇기 때문에 단일 파이썬 프로세스가 동시에 다중 CPU 코어를 사용할 수 없다.물론,
제어 흐름 Future를 이용한 동시성 Executor.map() 실험 Executor.map() 메서드를 이용하면 여러 콜러블을 아주 간단히 동시에 실행할 수 있다. >실행을 한 후 하나씩 나오는 결과를 직접 확인하면서 ThreadPoolExecutor 대한 ma
asyncio는 이벤트 루프에 의해 운용되는 코루틴을 이용해서 동시성을 구현하는 패키지이다.스레드 및 GIL에 대해 설명하면서 미셜 시미오나토는 장시간 연산이 실행되는 동안 multiprocessing 패키지를 이용해서 콘솔에 아스키 문자로 스피너 애니메이션을 보여준다
asyncio는 TCP와 UDP만 직접 지원하고, HTTP등의 프로토콜을 지원하려면 서드파티 패키지가 필요하며 현재 비동기 HTTP 클라이언트/서버를 구현하는 사람들은 모두 aiohttp를 사용하는 것 같다.asyncio.wait ( ) 코루틴은 Future 객체나 코
블로킹 함수를 디스크나 네트워크 입출력의 수행으로 정의하면서, 논블로킹 함수처럼 다루면 안된다. -라이언 달-블로킹 함수가 전체 애플리케이션의 실행을 멈추지 않게 하는 두 가지 방법블로킹 연산을 각기 별도의 스레드에서 실행모든 블로킹 연산을 논블로킹 비동기 연산으로 바
Error 서버에서 100개의 동시 요청을 이용해서 100개의 국기 이미지를 내려받는 방법asyncio.as_completed()사용하기asyncio를 이용해서 flags2는 concurrent.futures 버전이 재사용하는 여러 함수를 수정하고, asyncio 프로
콜백지옥은 어떤 연산이 다른 연산에 종속적일 때, 콜백 안에 콜백이 들어가는 것을 말하고, 차례대로 발생해야 하는 비동기 호출이 세 개 있을 때는 자바스크립트 코드에서 보는 것처럼 세 단계의 콜백을 구현한다.api_call1(), api_call2(), api_call
에코 서버는 TCP 서버의 고전적인 예제로, 먼저 TCP로 구현한 뒤 HTTP로 구현하여 유니코드 문자를 찾아내는 서버를 만들 것이고, unicodedata 모듈을 이용해서 클라이언트가 유니코드 공식 명칭으로 유니코드 문자를 검색할 수 있게 해서, 유니코드 문자를 찾아