AI 부캠

[부캠] 파이썬에서 효율적인 문법들 총 집합!

리하이 2021. 1. 20. 23:26

파이썬 특유의 효율적인 문법들에 대한 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, 가변인자, 키워드 가변인자 순이어야 한다!