본문 바로가기

fluent python

Fluent Python (챕터 9) - 파이썬스러운 객체 9.1 객체 표현 repr() : 객체를 개발자가 보고자 하는 형태로 표현한 문자열로 반환한다. str() : 객체를 사용자가 보고자 하는 형태로 표현한 문자열로 반환한다. repr(), str() 메서드를 지원하려면 각각 __repr__(), __str__() 매직 메서드를 구현해야 한다. 객체를 표현하는 다른 방법을 지원하는 __bytes__(), __format__() 매직 메서드도 있다. __bytes__() 는 __str__() 과 비슷하지만 bytes() 메서드에 의해 호출되어 객체를 바이트 시퀀스로 표현한다. __format__() 은 내장 함수 format() 과 str.format() 메서드 둘 다 사용하며, 특별 포맷 코드를 이용해서 객체를 표현하는 문자열을 반환한다. 9.2 벡터 클.. 더보기
Fluent Python (챕터 8) - 객체 참조, 가변성, 재활용 8.1 변수는 상자가 아니다. 흔히들 변수를 상자로 비유한다. 어떠한 값을 변수에 할당하면 변수라는 상자에 그 값이 들어간다고 표현한다. 하지만 이는 잘못된 비유다. 상자보다는 포스트잇에 빗대는 것이 더 명확한 비유라고 볼 수 있다. 단지 어떠한 값(객체) 에 이 값의 별명이 무엇이라고 포스트잇을 붙여 놓는 것과 같다. a = [1, 2, 3] b = a a.append(4) print(b) > [1, 2, 3, 4] 변수를 어떤 값을 담고 있는 상자라고 생각하면 위의 코드를 설명할 수 없다. a와 b는 서로 다른 상자임에도 a 에 추가한 값이 b 에도 들어가 있기 때문이다. 비슷한 맥락에서 할당에 관하여 어떠한 객체에 대해서 얘기할 때, '변수 s 가 객체에 할당되었다' 라고 하는 것이 '객체가 변수 .. 더보기
Fluent Python (챕터 7) 함수 데커레이터와 클로저 데커레이터를 자유자재로 사용하기 위해서는 클로저에 대한 이해가 필수이다. 클로저는 데커레이터 뿐만 아니라, 콜백을 이용한 효율적인 비동기 프로그래밍과 필요에 따라 함수형 스타일로 코딩하는 데에도 필수적이다. 이 장에서는 함수 데커레이터가 정확히 어떻게 동작하는지 설명한다. 그에 앞서 우선 아래의 내용을 먼저 살펴봐야 한다. 파이썬이 데커레이터 구문을 평가하는 방식 변수가 지역 변수인지 파이썬이 판단하는 방식 클로저의 존재 이유와 작동 방식 nonlocal 로 해결할 수 있는 문제 7.1 데커레이터 기본 지식 데커레이터는 다른 함수를 인수로 받는 콜러블이다. 데커레이터는 데커레이트된 함수에 어떤 처리를 수행하고, 함수를 반환하거나 함수를 다른 함수나 콜러블 객체로 대체한다. @de.. 더보기
Fluent Python (챕터 6) 일급 함수 디자인 패턴 디자인 패턴은 어떤 언어를 사용하는가에 따라 적용될 수도, 그렇지 않을 수도 있다. 특히 일급 함수를 지원하는 언어에서는 여러 패턴에 대해 다시 생각해 볼 수 있다. 패턴에 참여하는 일부 클래스의 객체를 간단한 함수로 교체하면 획일적으로 반복되는 코드의 상당 부분을 줄일 수 있다는 것이다. 이 장에서는 함수 객체를 이용해서 전략 패턴을 리팩토링하고, 비슷한 방법으로 명령 패턴을 단순화하는 방법에 대해 알아본다. 먼저 전략 패턴이 어떤 것인지 알아본다. 전략패턴이란? 일련의 알고리즘을 정의하고 각각을 하나의 클래스 안에 넣어서 교체하기 쉽게 만든다. 전략을 이용하면 사용하는 클라이언트에 따라 알고리즘을 독립적으로 변경할 수 있다. 즉, 특정한 기능(콘텍스트)에 대하여 클라이언트(객체.. 더보기
Fluent Python (챕터 5) 일급함수 파이썬의 함수는 일급 객체다. 프로그래밍 언어 이론가들은 다음과 같은 작업을 수행할 수 있는 프로그램 개체를 일급 객체로 정의한다. 런타임에 생성할 수 있다. 데이터 구조체의 변수나 요소에 할당할 수 있다. 함수 인수로 전달할 수 있다. 함수 결과로 반환할 수 있다. 정수, 문자열, 딕셔너리도 파이썬의 일급 객체다. 일급 객체로서의 함수인 일급 함수에 대해 알아본다. 인수를 하나 받는 함수는 모두 key 인수로 사용할 수 있다. def reverse(word): return word[::-1] fruits = ['apple', 'banana', 'fig', 'raspberry', 'cherry', 'strawberry'] print(sorted(fruits, key=reverse)) > ['ba.. 더보기
Fluent Python (챕터 4) 텍스트와 바이트 현재 문자를 가장 잘 정의한 것은 유니코드 문자다. 유니코드 표준은 문자의 단위 원소와 특정 바이트 표현을 명확히 구분한다. 문자의 단위 원소(코드 포인트)는 10진수 0에서 1,114,111까지의 숫자이며, 유니코드 표준에서는 U+ 접두사를 붙여 4자리에서 6자리 사이의 16진수로 표현한다. 문자를 표현하는 실제 바이트는 사용하는 인코딩에 따라 달라진다. 인코딩은 코드 포인트를 바이트 시퀀스로 변환하는 알고리즘이다. s = 'café' print(len(s)) > 4 b = s.encode('utf8') print(b, len(b)) > b'caf\xc3\xa9' 5 print(b.decode('utf8')) > café café 문자열은 네 개의 유니코드 문자를 갖고 있다. UTF-8.. 더보기
Fluent Python (챕터 3) 딕셔너리와 집합 dict 형은 애플리케이션에서 뿐만 아니라, 파이썬 구현의 핵심 부분이기도 하다. 모듈 네임스페이스, 클래스 및 인스턴스 속성, 함수의 키워드 인수 등 핵심 부분에 딕셔너리가 사용되고 있다. 내장 함수들은 __builtins__.__dict__에 들어 있다. 파이썬 dict 클래스는 상당히 최적화되어 있는데, 이는 해시 테이블이라는 엔진 덕분이다. dict 의 키는 해시 가능해야 한다. 수명 주기 동안 절대 변하지 않는 해시값을 갖고 있고(__hash__() 메서드 필요) 다른 객체와 비교할 수 있으면(__eq__()메서드) 객체를 해시 가능하다고 한다. 동일하다고 판단되는 객체는 반드시 해시값이 동일해야 한다. 불변 내장 객체는 모두 해시 가능하다고 하는 경우도 있는데, 튜플은 내부에 .. 더보기
Fluent Python (챕터 2) 시퀀스 문자열, 리스트, 바이트 시퀀스, 배열, XML요소, 데이터베이스 결과에는 모두 반복, 슬라이싱, 정렬, 연결 등 공통된 연산을 적용할 수 있다. 파이썬 표준 라이브러리는 C로 구현된 다음과 같은 시퀀스형을 제공한다. 컨테이너 시퀀스 서로 다른 자료성의 항목들을 담을 수 있는 list, tuple, collections.duque 형 균일 시퀀스 단 하나의 자료형만 담을 수 있는 str, bytes, bytearray, memoryview, array.array 형 균일 시퀀스가 메모리를 더 적게 사용지만 문자, 바이트, 숫자 등 기본적인 자료형만 저장할 수 있다. 시퀀스형은 가변성에 따라서도 구분할 수 있다. 가변 시퀀스 list, bytearray, array.array, collections.. 더보기