[Python] 22가지 코드 지름길
파이썬 스킬 업을 보고 정리한 내용입니다.
1 - 필요하다면 코드를 여러 줄에 걸쳐서 작성한다.
- 물리적으로 1줄보다 더 긴 문장을 작성하려면?
1
2
3
4
5
6
7
#줄-연장 문자인 역슬래시 기호 사용
my_str = 'I am Hen-er-y the Eigth,' \
' I am!'
#괄호를 사용해서 물리적으로 다음 줄을 자동으로 연결
my_str = ('I am Hen-er-y the Eigth, '
' I am!')
2 - for 루프는 현명하게 사용한다.
- range 사용 자제
1
2
3
4
5
6
7
#이거보단
for i in range(len(my_list)):
print(my_list[i])
#이거
for guy in my_list:
print(guy)
3 - 대입 연산자 조합을 이해한다.
- 대입 연산자는 피연산자의 가변 유무에 따라 객체 값 변경 유무를 결정함
- 불변일 경우: 같은 변수에 완전히 새로운 객체를 생성하여 대입
1
2
3
4
s1 = s2 = 'A String.'
s1 += '...with more stuff!'
print(s1) #A String...with more stuff! -> 새로운 객체
print(s2) #A String. -> 기존 건 그대로
- 가변일 경우: 이미 메모리에 존재하는 데이터를 변경
1
2
3
4
a_list = b_list = [1,2]
a_list += [3,4]
print(a_list) #[1,2,3,4]
print(b_list) #[1,2,3,4] #변경된 그 데이터를 참조하기 때문에 같이 추가됨
- 값을 직접 변경하는 연산 대부분이 항상 더 효율적임
- 큰 문자열을 만들 때 처리 속도가 중요하다면 +=보다 join이 더 효율적
4 - 다중 대입을 사용한다.
a = b = c= d = e = 0
5- 튜플 대입을 사용한다.
a, b = 1, 0
a = 4,8, 12
이렇게 하면 a 는 3개의 값을 지닌 튜플이 됨- 임시 변수 없이 두개 변수를 동시에 설정하는 것도 가능
1
2
3
4
5
6
7
8
9
#이렇게 안하고
temp = a
a = a+b
b = temp
#이렇게
a, b = a+b, a
#서로 값을 바꿀 때도
a, b = b, a
6 - 고급 튜플 대입을 사용한다.
- 튜플 언팩
1
2
3
tup = 10, 20, 30
a, b, c = tup
#개수 안 맞으면 런타임 에러
- 하나의 항목만 가진 튜플 생성하기
1
2
my_tup = (3) #이렇게 하면 class int
my_tup = (3,) #이렇게 해야 튜플
- 별표 기호 사용하기
1
2
a, *b = 2,4,5,6 #a 가 2 고 b가 나머지 항목 리스트
a, *b, c = 10, 20, 30, 40, 50 #a가 10, c가 50, b가 가운데 항목 리스트
7 - 리스트와 문자열 ‘곱하기’를 사용한다.
매우 큰 리스트를 특정 값으로 초기화하기
my_list = [0]*100000
- 단 곱하기는 유일한 키를 가지는 딕셔너리와 세트에서는 사용할 수 없음
- 문자열에서는 사용할 수 있음
8 - 다중 값을 반환한다.
- 함수의 출력변수는 여러 개를 반환할 수 있음
1
2
3
def quad(a, b, c):
#...
return x1, x2
9 - 루프와 else 키워드를 사용한다.
- 루프에서 사용하는 try-except 문법으로 else를 사용
- 루프가 break 문을 만나서 일찍 빠져나오지 않는 한 루프 종료시 실행함
1
2
3
4
5
6
7
def find_divisor(n, m):
for i in range(2, m+1):
if n%i ==0:
print(i, 'divides evenly into', n)
break
else: #약수를 못찾고 루프가 종료되는 경우
print('No divisor found')
10 - 불리언과 not의 이점을 활용한다.
- 파이썬은 모든 객체를 True 혹은 False로 평가함
- 예를 들어 파이썬의 모든 빈 컬렉션이나 None인 컬렉션은 불리언 테스트하면 False임
if len(my_str)==0
해도 되지만if not my_str
해도 됨
- 값이 0인 숫자나 None 도 False임
11 - 문자열은 문자의 나열로 다룬다.
- 각각의 문자들로 복잡한 연산 처리를 한 후 문자열을 만든다면 문자(길이가 1인 문자열)로 이루어진 리스트를 생성하여 join과 함께 리스트 함축을 하는 것이 더 효율적
- 회문인지 테스트하기
1
2
a_list = [c.upper() for c in test_str if c.isalnum()]
print(a_list == a_list[::-1]_
12 - replace를 사용하여 문자를 제거한다.
s = s.replace(' ', '')
- 만약 한번에 많이 삭제하고 싶다면 리스트 함축 사용
1
2
a_list = [c for c in s if c not in 'aeiou']
s = ''.join(a_list)
13 - 필요 없는 루프는 사용하지 않는다.
- sum, len 등의 내장 함수를 사용할 수 있다면 굳이 루프를 쓰지 않는다.
14 - 연결된(chained) 비교 연산자를 사용한다.
- 일반적인 if 문 조건 작성 방식이
if 0 <x and x <100
이라면, 연결된 비교 연산자는if 0 < x <100
이런 식으로 작성 - 비교 개수는 제한이 없으며 모든 표준 비교 연산자를 사용가능. 동일한 방향을 바라볼 필요도 없음
0<a<=c>b>1
이렇게도 됨
15 - 함수 테이블(리스트, 딕셔너리)로 switch 문을 모방한다.
- 사용자 입력에 따라 서로 다른 함수를 호출한다고 치면
1
2
3
4
5
6
if n=1:
num_1(df)
elif n=2:
num_2(df)
#...
#이런식으로 쓰면 너무 장황하다.
- 파이썬 함수는 객체이기 때문에 다른 객체와 같이 리스트의 항목이 될 수 있다.
1
2
fn = [num_1, num_2, num_e, num_4][n-1]
fn(df)
- 만약 n=2 이면 fn[1]인 num_2 실행
- 딕셔너리를 사용해서 더 유연하게 제어할 수 있다.
1
2
menu_dict = {'load': load_fn, 'same':save_fn, 'exit', exit_fn}
(menu_dict[selector])() #함수 호출
16 - is 연산자는 정확하게 사용한다.
- 동등비교 연산자
(==)
와 is 연산자는 결과가 같을 때도 있고 다를 때도 있다. ==
는 값이 같은지를 보고 is 는 메모리 상 같은 객체를 참조하고 있는지를 보기 때문- None, True, False와 같은 독특한 객체는 is 를 통해 비교할 수 있고, is 가 더 효율적이다.
17 - 단일 행 for 루프를 사용한다.
- 루프 안에 1줄만 있을 정도로 충분하면 그냥 1줄로 한다.
for in in range(10): print(i)
18 - 여러 문장을 하나의 행으로 줄인다.
- 세미콜론을 사용해 물리적 줄을 나누는 기준으로 쓴다.
for i in range(5): n = i*2; m=5; print(n+m)
19 - 단일 행 if/then/else 문을 작성한다.
cell = 'X' if turn %2 else '0'
20 - range와 함께 Enum을 생성한다.
- red, green, blue, green, white, black을 인디케이터 값을 1~5로 지정하고 싶다고 치자
red, blue, green, black, white = range(1,6)
21 - IDLE 안에서 비효율적인 print 함수 사용을 줄인다.
- IDLE 안에서 호출한 print 문은 속도가 너무 느리다.
- 별표
(*)
로 40x20 블록을 만들고 싶다고 할 때 800번 출력하면 안됨 - 그냥 여러 줄의 문자를 만들어 한번만 프린트하도록 하자.
print('\n'.join(['*'*40]*20))
22 - 큰 번호 안에 언더스코어(_)
를 넣는다.
- 큰 리터럴 숫자는 읽기 힘드므로 콤마 대신 언더스코어를 사용한다.
- 예:
CEO_salary = 1_500_000
- 예:
- 언더스코어는
- 한번에 2개 사용할 수 없고, 맨앞/맨뒤에 사용할 수 없다. 맨앞에 사용하면 변수 이름으로 여긴다.
- 실수의 정수나 소수점 양쪽에 모두 사용할 수 있다.
This post is licensed under CC BY 4.0 by the author.