1. 사용 중인 파이썬 버전 파악하기
import sys
print(sys.version_info)
print(sys.version)
python3 --version
첫번째는 파이썬 코드에서 파이썬 버전을 알아내는 방법
2. PEP8 스타일 가이드를 따르라
*PEP8 스타일 가이드를 사용하는 이유: 일관된 스타일 사용하기 위해서 ,그리고 협업하기 위해서 ^!^ 매우 중요하다고 본인은 협업하면서 느꼈음.
- 공백
- 특히 탭과 스페이스는 매우 비슷하면서도 다른 성격을 지님 -> 본인은 개발할 때 소스코드를 복사해서 올 때 이 부분때문에 이슈가 발생한 경험이 있음 -> 탭 대신 스페이스를 사용하여 들여쓰기를 해라
- 라인 길이는 79개 문자 이하여야 함.
- 긴 식을 들여쓸 때 4 스페이스를 들여 씀
- 함수와 클래스 사이에서는 빈 두줄 추가
- 메서드와 메서드 사이에는 빈 한줄 추가
- 딕셔너리: key, value 사이에 공백 x
- 변수 대임에서 = 전후에는 스페이스를 하나씩만 넣음
- 타입 표기를 덧붙이는 경우에는 변수 이름과 콜론 사이에 공백을 넣지 않도록 주의하고, 콜론과 타입 정보 사이에는 스페이스 넣기
- 명명 규약
- 함수, 변수, 애트리부트: 소문자, 밑줄 사용
- 보호돼야 하는 인스턴스 애트리뷰트: 이름 규칙 따르고, 밑줄로 시작함
- 비공개 인스턴스 애트립류트: __ 밑줄 두개로 시작
- 클래스: 여러 단어로 구성, 첫 단어는 대문자
- 모듈 수준의 상수: 모든 글자를 대문자, 단어와 단어 사이를 밑줄로 연결한 형태를 사용
- 클래스에 들어 있는 인스턴스 메서드: 호출 대상 객체를 가리키는 첫 번째 인자의 이름, self. 사용
- 클래스 메서드: 클래스를 가리키는 첫 번째 인자의 이름으로 cls 사용
- 식과 문
- 긍정 식 부정 x -> 부정을 내부에 넣음
- if a is not b (O), if not a is b (X)
- 빈 컨테이너, 시퀀스를 검사할 때는 길이를 0과 비교하지 말고 If not 컨테이너 사용
- 한줄로 if, for, while, except 복합문 사용하지 않기 -> 여러 줄에 나눠서 배치하기
- 한 줄 안에 다 못쓸 경우 읽기 쉽게 줄바꿈, 들여쓰기 사용
- 여러 줄에 결쳐 쓸 때는 \ 보다는 괄호 사용
- 긍정 식 부정 x -> 부정을 내부에 넣음
- import
- 항상 파일 앞에 씀 -> 당연한거 아닌가 .. ?
- 모듈 임포트할 때 절대적인 이름 사용하기
- from b import foo(O), import b(x)
- 상대적인 구문 import 할 때 명시적인 구문 사용하기
- from . import foo
- import 적을 때, 표준 라이브러리 모듈, 서드 파티 모듈, 모듈 순서로 나누기
3. bytes 와 str의 차이를 알아두라
- str: 직접 대응하는 이진 인코딩이 없음
- bytes: 직접 대응하는 텍스트 인코딩이 없음.
- 유니코드 -> 이진 데이터: str의 encode 호출
- 이진 데이터 -> 유니코드: bytes의 decode 호출
- 유니코드 샌드위치: 유니코드 데이터를 인코딩하거나 디코딩하는 부분을 인터페이스의 가장 먼 경계 지점에 위치시켜야 함.
4. C스타일 형식 문자열을 str.format과 쓰기보다는 f-문자열을 통한 인터폴레이션을 사용
- 형식화: 정의된 문자열에 데이터 값을 끼워 넣어 사람이 보기 좋은 문자열로 저장하는 과정
- 형식 문자열: %형식화 연산자 사용하는 것.
- 단일 값, 값이 여러개일 경우 튜플로 지정
- 형식 지정자 사용함.
- 딕셔너리를 사용해 형식화하는 기능 추가 -> 여러 형식 지정자에 같은 키를 지정할 수 있어 같은 값을 반복하지 않아도 됨.
- 형식 문자열: %형식화 연산자 사용하는 것.
- 내장 함수 format, str.format
- 고급 문자열 형식화: format 내장 함수
- 각 위치 지정자에는 콜론 뒤에 형식 지정자를 넣어 문자열에 값을 넣을 때 어떤 형식으로 변환할지 정할 수 있음.
- 같은 위치 인덱스를 여러 번 사용할 수 있음.
- 고급 문자열 형식화: format 내장 함수
formatted = '{0}은 음식을 좋아해. {0}가 요리하는 모습을 봐요.'.format(name)
name = '철수'
print(formatted)
>> 철수는 음식을 좋아해. 철수가 요리하는 모습을 봐요
- 인터폴레이션을 통한 형식 문자열
- 형식 문자열 앞에 f를 붙여줌.
- 지정자 중괄호 안에 완전한 파이썬 식을 넣을 수 있음.
- 형식 문자열 앞에 f를 붙여줌.
key = 'my_var'
value = 1.234
formatted = f'{key}={value}'
print(formatted)
>> my_var=1.234
- 복잡한 식을 쓰는 대신 도우미 함수를 작성해라
6. 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹하라
- 튜블에 있는 값은 숫자 인덱스를 통해 접근 가능
- 하지만 튜블은 새로운 값을 대입해서 튜플 변경은 불가능
items = ('사과', '감자')
first = item[0]
second = item[1]
print(first, '&', second)
>> 사과 & 감자
- 언패킹: 한문장 안에서 여러 값을 대입할 수 있음.
item = ('감자', '고구마')
first, second = item
print(first, '&', second)
>>> 감자 & 고구마
- 언패킹을 사용하면 두 인덱스가 가리키는 원소를 서로 맞바꿀 수 있음.
7. range보다는 emurate를 사용하라
- range
- list의 길이를 알아야 함
- 인덱스를 사용해 배열 원소에 접근해야 함
- 단계가 여러개이므로 코드를 읽기 어려움
- emurate: 지연 계산 제너레이터로 감싼다.
- 루프 인덱스와 이터레이터의 다음 값으로 이뤄진 쌍을 남겨줌
- next내장 함수를 이용해 다음 원소를 가져옴.
- 코드를 훨씬 간단하게 만들 수 있음.
it = emurate(flavor_list)
print(next(it))
print(next(it))
8. 여러 이터레이터에 대해 나란히 루프를 수행하려면 zip을 사용하라
- zip: 둘 이상의 이터레이터를 지연 계산 제너레이터를 사용해 묶어줌
- 자신이 감싼 이터레이터 원소를 하나씩 소비함
- 메모리를 다 소모해서 프로글매이 중단되는 위험 없이 긴 입력도 처리 가능
- 출력: 가장 짧은 입력의 길이와 같음.
- zip_logest: 존재하지 않는 값을 None으로 대신함. -> 길이가 서로 다른 이터레이터에 대해 루프를 사용하기 위해 사용
import itertools
for name, count in itertools.zip_longest(names, counts):
print(f'{names}:{count}')
9. for나 while루프 뒤에 else 블록을 사용하지 말라
- else: 처리할 예외가 없는 경우에 이 블록을 실행하라 라는 의미
- 아래 코드에서 if에서 break에 걸리면, else문은 실행되지 않음.
for i in range(3):
print('Loop', i)
if i == 1:
break
else:
print("Else block!")
- 도우미 함수로 작성할 것
- 원하는 조건을 찾자마자 빠르게 함수를 반환하는 방식
- 루프 안에서 원하는 대상을 찾았는지 나타내는 결과 변수를 도입하는 것
10. 대입식을 사용해 반복을 피하라
- 왈러스 연산자 사용하기
- count 연산자가 if 문의 첫 번쨰 블록에서만 유의미 하다는 것이 명확히 보임
if count := fresh_fruit.get('lemon', 0):
make_lemonade(count)
else:
out_of_stock()
- 무한 루프 -> 흐름 제어하기