[부캠] 파이썬에서 효율적인 문법들 총 집합!
파이썬 특유의 효율적인 문법들에 대한 A to Z
- Split / Join / list comprehension /enumerate / zip
- lambda & map & reduce
- generator
- asterisk
자주 쓰이는 문법을 간단한 예시들로 쉽게 이해해보자.
Split
split함수는 문자열을 기준값으로 나눠서 List 형태로 변환한다.
>>> s='jeju_samdasoo_water'
>>> s.split('_')
['jeju', 'samdasoo', 'water']
Join
String으로 구성된 list를 특정한 기준으로 합쳐 하나의 문자열로 반환
>>> a=['I','Love','myself']
>>> ' '.join(a)
'I Love myself'
List comprehension
기존 List를 사용해서 간단히 다른 List를 만드는 기법
일반적으로 for + append 보다 속도가 빠르다고 알려져있다.
- 1d 리스트 list comprehension으로 나타내기
>>> result = [i for i in range(10)]
>>> result
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 컨디션 추가
>>> result = [i for i in range(10) if i % 2 == 0]
>>> result
[0, 2, 4, 6, 8]
- 1d 리스트 2 value가 있을때
>>> word_1 = "Hello"
>>> word_2 = "World"
>>> result = [i+j for i in word_1 for j in word_2]
>>> result[10:20]
['lW', 'lo', 'lr', 'll', 'ld', 'lW', 'lo', 'lr', 'll', 'ld']
- condition 추가
>>> result = [i+j for i in word_1 for j in word_2 if not(i==j)]
>>> result[10:20]
['lW', 'lo', 'lr', 'ld', 'lW', 'lo', 'lr', 'ld', 'oW', 'or']
- 2d 리스트
>>> case_1 = ["A","B","C"]
>>> case_2 = ["D","E","A"]
>>> result = [ [i+j for i in case_1] for j in case_2]
>>> result
[['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AA', 'BA', 'CA']]
- condition 추가
>>> case_1 = ["A","B","C"]
>>> case_2 = ["D","E","A"]
>>> result = [ [i+j for i in case_1 if i!=j] for j in case_2]
>>> result
[['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['BA', 'CA']]
Enumerate
리스트의 element와 인덱스를 같이 추출
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i,v)
...
0 tic
1 tac
2 toe
Zip
2개의 list값을 병렬적으로 추출
>>> alist = ['a1', 'a2', 'a3']
>>> blist = ['b1', 'b2', 'b3']
>>> for a, b in zip(alist, blist):
... print (a,b)
...
a1 b1
a2 b2
a3 b3
Lambda
함수처럼 쓸수 있는 익명함수
함수 def를 활용하지 않고 1줄로 간단히 표현할 수 있어 많이 쓰인다.
Map
iterable한 객체를 지정해준 객체로 처리해준다. (말이 어렵다..)
>>> a=['1','2','3']
>>> list(map(int,a))
[1, 2, 3]
파이썬 알고리즘하면 꼭 알아야하는 코드랄까..
여기서 int 는 형변환시켜주는 int() function이다.
a라는 iterable한 객체(리스트)의 원소를 하나씩 int라는 함수에 각각 맵핑해주는 함수이다.
Reduce
iterable한 객체를 함수에서 처리하는데, 여기선 똑같은 함수에서 처리를 한다. (return값을 다시 parameter로 받는 느낌)
>>> from functools import reduce
>>> a=[1,2,3]
>>> print(reduce(lambda x,y : x+y,a))
6
Generator
이번 강의의 하이라이트가 아닐까 싶다.
Asterisk
파이썬에서 사용하는 * 는 크게 3가지 의미를 가지고 있다.
1) 곱하기 연산과 제곱연산
>>> 3*7
21
>>> 2**3
8
2) iterable 함수의 unpacking
>>> def asterist_task(a,b,c):
... print(a,b,c)
... print(a+b+c)
>>> asterist_task(*[1,2,3])
1 2 3
6
3) 가변인수
* 는 개수가 정해지지 않은 변수를 함수의 parameter로 사용할때 이용된다.
*args (args는 변수이름) 는 일반 가변인자
*kwargs (kwargs는 변수이름)는 키워드 가변인자로, dict type으로 input을 넣을 수 있다.
>>> def asterisk_test_2(*args):
... print(args)
>>> asterisk_test_2(3, 4, 5)
(3, 4, 5)
이렇게 *args를 사용하면 parameter의 개수에 제한을 두지 않고, 함수로 넘길 수 있다.
>>> def kwargs_test_3(one,two,*args,**kwargs):
... print(args)
... print(kwargs)
...
>>> kwargs_test_3(3,4,5,6,7,8,9, first=3, second=4, third=5)
(5, 6, 7, 8, 9)
{'first': 3, 'second': 4, 'third': 5}
**kwargs는 키워드가 있는 변수들을 다음과 같이 제한 없이 함수로 넘길 수 있다.
단 함수 parameter순서는 기본 parameter, 가변인자, 키워드 가변인자 순이어야 한다!