오늘은 책 '파이썬 코딩의 기술'을 읽고 파이썬으로 코딩하는 데에 유용한 내용들을 정리해보고자 한다. 이 책의 챕터는 다음과 같이 구성되어 있다.
- 파이썬답게 생각하기
- 리스트와 딕셔너리
- 함수
- 컴프리헨션과 제너레이터
- 클래스와 인터페이스
- 메타클래스와 애트리뷰트
- 동시성과 병렬성
- 강건성과 성능
- 테스트와 디버깅
- 협업
이 중에서 첫 번째인 1. 파이썬답게 생각하기 중 일부를 기술하겠다.
1. 들어가면서
이번 챕터의 제목은 '파이썬답게 생각하기'다. '파이썬답게'란 무엇일까? 파이썬은 컴파일러의 엄격한 통제, 강요가 있는 스타일이 아니다. 파이썬은 1. 단순한 걸 좋아하고, 2. 가독성을 최대한 높이려 한다. 이제 두 키워드가 나왔다. '단순', 그리고 '가독성'.
2. PEP 8 스타일 가이드 -명명 규약
PEP 8 (python enhancement proposal #8)은 파이썬 코드에 대한 스타일 가이드다. 이 중 명명 규약을 살펴보자.
- 함수, 변수, 에트리뷰트 -> 소문자, 밑줄 사용 (ex. function_name)
- 보호 필요한 인스턴스 에트리뷰트 -> 이름 앞에 밑줄 사용 (ex. _function_name)
- 비공개 인스턴스 에트리뷰트 -> 이름 앞에 밑줄 두 개 사용(ex. __function_name)
- 클래스 -> 첫글자 대문자 (ex. Myclass)
- self <- 클래스 내 인스턴스 메서드가 호출 대상 객체를 가리키는 인자의 이름으로, 첫 번째에 사용
##ex class Myclass: ... def my_function(self, x, y):
- cls <- 클래스 매서드가 클래스 가리키는 인자의 이름으로, 첫 번째에 사용
## ex. class Myclass: ... @classmethod def Myclass(cls, x, y):
3. bytes 와 str
문자열을 표현할 때 bytes와 str을 사용한다.
bytes | str |
부호가 없는 8바이트 데이터 | 유니코드 코드 포인트 포함 (사람이 사용하는 언어의 문자를 표현) |
직접 대응하는 텍스트 인코딩 X | 직접 대응하는 이진 인코딩 X |
.decode()를 사용해 str화 가능 | .encode()를 사용해 bytes화 가능 |
ex.) b'hi' | ex.) 'hi' |
with open(file_name, 'wb') with open(file_name, 'rb') |
with open(file_name, 'w') with open(file_name, 'r') |
위 내용을 활용한 예시를 하나 들자면, bytes형태 파일을 str로 읽을 수 있다.
FILE_NAME='byte_file'
ENC_TYPE='UTF-8'
with open(FILE_NAME, 'rb') as f:
tmp = f.read()
result = tmp.decode(ENC_TYPE)
위 코드에서 ENC_TYPE은 인코딩 타입이다. 인코딩 타입에는 'Latin-1', 'Shift JIS', 'euc-kr', 'cp949', 'UTF-8'과 같은 텍스트 인코딩들이 있을 수 있다.
4. 문자열 출력 방법
문자열 형식화 방법들에 대한 장단점에 대해 알아보자. (단점은 생각도 안 하고 아무거나 쓰고 있었음)
%연산자- %튜플 or 딕셔너리 | format | f-문자열 |
print('내 %d원! %s가 준건데!' %(a, b)) | '내 {}원! {}가 준건데!'.format(a,b) | f'내 {a}원 {b}가 준건데!' |
형식지정자 사용. C 스타일. | 위치지정자 {} 사용 | 인터폴레이션을 통한 형식 문자열 |
단) 길어지면 가독성 별로... | 단) 길어지면 가독성 별로... | |
단) a, b 순서 바뀌면....(타입에러) | {0}처럼 순서 지정 가능 | |
단) a, b가 여러번 나오면... (튜플에 같은값 계속 반복) |
{0}처럼 순서 지정 가능 |
결론 : 이왕이면 f-문자열을 쓰자!
cf.) 용어 정리
- formatting(형식화) : 미리 정의된 문자열에 데이터 값을 끼워넣어 문자열로 저장하는 과정
5. else 블록
else의 실행조건은 '루프가 정상적으로 완료되지 않으면 이 블록을 실행하라'가 아니다.
'이 블록 앞의 블록이 실행되지 않으면 이 블록을 실행하라'
이다. 그렇기 때문에 for, while 문 바로 뒤에 else가 온다면 무조건 실행된단 뜻이다. 그렇기 때문에 앞 블록이 break를 만났을 때는 실행되지 않는다. 추가적으로 while 조건이 False이거나 for문이 빈 시퀀스를 실행했을 때에도 else블록은 실행된다.
### else 문 실행
for i in []:
print(i)
else:
print('else start!')
#### else 문 비실행
for i in range(2):
print(i)
if i==1:
break
else:
print('else start!')
6. 왈러스 연산자( :=)
이 책을 읽으면서 가장 신기했던 내용이 왈러스 연산자(== 대입식)다. 대입식으로 대입문을 사용할 수 없는 위치에서 값을 대입할 수 있다.
### no walrus
cnt = my_fruit_count('사과')
if count:
return 1
else:
return 0
#### walrus
if cnt := my_fruit_count('사과'):
return 1
else:
return 0
위 예와 같이 왈러스 연산자를 쓰면 반복을 피할 수 있다. if문, while문, 비교 연산자 등에서 다양하게 사용할 수 있다.
위 방법들로 파이썬 코드 가독성을 올릴 수 있고, 코드를 보다 단순하게 짤 수 있다.
'python > 파이썬 코딩의 기술' 카테고리의 다른 글
파이썬 코딩의 기술 리뷰 - 클래스, 인터페이스 (0) | 2022.01.16 |
---|---|
파이썬 코딩의 기술 리뷰- 동시성과 병렬성 1 (2) | 2022.01.10 |
파이썬 코딩의 기술 - 컴프리헨션, 제너레이터 (0) | 2022.01.09 |
파이썬 코딩의 기술 리뷰 - 함수 (0) | 2021.12.19 |
파이썬 코딩의 기술 - 리스트, 딕셔너리 (0) | 2021.12.19 |