반응형
Pythonic
- 파이썬 스타일의 코딩기법
- 파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현하는 기법
- 그러나 더이상 파이썬 특유는 아님, 많은 언어들이 서로의 장점을 채용
- 남의 코드에대한 이해도를 높여줌
- 효율성이 조금 더 좋음
Pythonic Contents
목차
추후 업로드
1. split & join
2. list comprehension
ex_1 )
result_1 = [i for i in range(10)]
result_1 => [0,1,2,3,4,5,6,7,8,9]
result_2 = [i for i in range(10) if i%2 == 0]
result_2 => [0,2,4,8]
ex_2 )
word_1 = ["a","b","c"]
word_2 = ["d","e","f"]
result = [i+j for i in word_1 for j in word_2]
#아래의 코드와 같음
result = []
for i in word_1:
for j in word_2:
result.append(i+j)
ex_3 )
word_1 = ["a","b","c"]
word_2 = ["c","e","f"]
result = [i+j for i in word_1 for j in word_2 if not(i==j)]
#아래의 코드와 같음
result = []
for i in word_1:
for j in word_2:
if not(i==j):
result.append(i+j)
ex_4 ) if else 쓸 때
word_1 = ["a","b","c"]
word_2 = ["c","e","f"]
result = [i+j if not (i==j) else i for i in word_1 for j in word_2]
#아래의 코드와 같음
result = []
for i in word_1:
for j in word_2:
if not (i==j):
result.append(i+j)
else:
result.append(i)
ex_5 ) two dimensional
result = [[i+j for i in word_1] for j in word_2]
#아래의 코드와 같음
result = []
for j in word_2:
temp_list = []
for i in word_1:
temp_list.append(i+j)
result.append(temp_list)
3. enumerate & zip
3-1 enumerate
- index와 데이터를 같이 return
for i,v in enumerate(['t1','t2','t3'])
print(i,v) => (0,'t1') (1,'t2') (2,'t3')
#많이 사용되는 패턴
a = ['a','b','c']
{v:i for i,v in enumerate(a)} -> {'a': 0, 'b': 1, 'c': 2}
3-2 zip
- 기본적으로 tuple 형태로 리턴
alist = [1,2,3]
blist = [4,5,6]
[c for c in zip(alist, blist)] -> [(1,4), (2,5), (3,6)]
4. lambda & map & reduce
4-1 lambda
- 함수이름 없이 함수처럼 사용할 수 있는 익명함수
- PEP8에서 파이썬 3부터는 권장하지는 않으나 여전히 많이 사용됨
- 람다의 문제점
- 어려운 문법
- 테스트의 어려움
- 함수의 문서화(docstring) 지원 미비
(lambda x, y: x+y)(10,50) => 60
4-2 map
- 두개이상의 list에도 적용 가능함
- 시퀀스의 데이터에 각각 적용해주고 각각 리턴받음
- 실행시점의 값을 생성하기 때문에 메모리 관리가 효율적
- 최근에 map을 사용하면 이해하기 어렵다는 지적이 있기 때문에 list comprehension을 더 자주 활용해보자
ex = [1,2,3,4,5]
list(map(lambda x: x**2, ex)) => [1,4,9,16,25]
# 2개의 인자값일 때 첫번째인자는 함수, 두번째 세번째인자는 시퀀셜 데이터가 zip처럼 사용됨
f = lambda x,y : x + y
list(map(f, ex, ex)) => [2,4,6,8,10]
4-3 reduce
- map과는 달리 list에 똑같은 함수를 적용해서 통합
- 대용량의 데이터를 다룰 때 자주 사용됨
from functools import reduce
print(reduce(lambda x, y: x+y, [1,2,3,4,5])) => 15
# 풀이
1) x,y -> 1,2 -> x+y = 3
2) x,y -> 3,3 -> x+y = 6
3) x,y -> 6+4 -> x+y = 10
4) x,y -> 10 + 5 -> x+y = 15
5. Iterable Object
- 내부적으로 __iter__와 __next__가 사용됨
- iter()와 next()함수로 iterable 객체를 iterator object로 사용
- iter객체로 만들면 처음 호출된 데이터는 메모리 주소를 가져온다 (다음 메모리 주소를 갖고있다) -> 메모리 관리 효율적
- 연결리스트라고 이해했음
- generator
- 이터러블 오브젝트를 특수한 형태로 사용해주는 함수
- element가 사용되는 시점에 값을 메모리에 반환 -> yeield를 사용하면 한번에 하나의 element만 반환한다
- generator comprehension
gen_ex = (n*n for n in range(500)) print(type(gen_ex)) -> generator
- generator를 사용해야 할 떄
- list 타입의 데이터를 반환해주는 함수일 경우
- 큰 데이터를 처리해야할 경우
- 파일 데이터를 처리할 경우
- generator comprehension
# 1. 리스트를 평범하게 사용할 때 def general_list(value): result = [] for i in range(value): result.append(i) return result result = general_list(50) sys.getsizeof(result) -> 511Byte가 사용됨 # 2. Generator 사용할 때 def generator_list(value): for i in range(value): yield i result = generator_list(50) sys.getsizeof(result) -> 112Byte가 사용됨 # 3. Generator로 만들고 list로 전부 받았을 때 result = list(generator_list(50)) sys.getsizeof(result) ->464Byte가 사용됨
6. function passing arguments
6-1 keyword arguments
def print_something(first_name, last_name):
print(f"My first_name is {first_name}") => My first_name is JIHOON
print_something(last_name="HEO", first_name="JIHOON")
- default arguments
- 지정한 파라미터에 데이터가 들어오지 않을경우 기본값을 부여함
def print_something_2(first_name, last_name="HH"):
print(f"My last_name is {last_name}) => My last_name is HH
print_something_2("HOON")
6-2 variable-length arguments
- 개수가 정해지지 않은 변수를 함수의 파라미터로 사용
- Asterisk(*)를 사용하여 파라미터를 표시
- 입력된 값은 튜플타입으로 사용할 수 있음
def asterisk_test(a,b,*args):
return a+b+sum(args)
print(asterisk_test(1,2,3,4,5)) => 15
- keyword variable-length 키워드 가변인자
- 파라미터 이름을 따로 지정하지 않고 입력
- asterisk(*) 두개를 사용하여 함수의 파라미터를 표시
- 입력된 값은 dict type으로 사용
- 키워드 형태로 넣기 시작하면 뒤에는 args로 받을 수 없다
- 키워드 아닌거먼저넣고 키워드넣는다
ex_1) **kwargs
def kwargs_test_1(**kwargs):
print(kwargs) => {first:3, second:4, third:5}
kwargs_test_1(first=3, second=4, third=5)
ex_2) *args with **kwargs
def kwargs_test_3(one, two, *args, **kwargs):
print(one+two+sum(args)) => 55
print(kwargs) => {first:1,second:2,third:3}
kwargs_test_3(10,30, 1,2,3,4,5, first=1, second=2, third=3)
- asterisk unpacking a container
- tuple, dict 등 자료형에 들어가 있는 값을 unpacking
- 함수의 입력값, zip등에 유용하게 사용
ex_3) unpacking using asterisk
sing asterisk
def asterisk_test(a, *args):
print(a, args) => (1,(1,2,3,4,5))
asterisk_test(1, *(1,2,3,4,5))
ex_4) double asterisk
def asterisk_test(a,b,c,d):
print(a,b,c,d)
data = {"b":1,"c":2,"d":3}
asterisk_test(10,**data) => **data는 b=1, c=2, d=3 으로 바뀌어서 들어감
ex_5) zip with asterisk
ex = ([1,2],[3,4],[5,6])
a,b,c = ex
#아래 두개의 for문이 동일함
for value in zip(a,b,c):
print(value)
for value in zip(*ex):
print(value)
반응형
'부스트캠프 AI Tech 2기 > Precourse' 카테고리의 다른 글
Python Module, Package (0) | 2021.07.18 |
---|---|
Python OOP(Object Oriented Programming) (0) | 2021.07.18 |
Python Data Structure (0) | 2021.07.15 |
Python Function (0) | 2021.07.15 |
Python String에 대해서 (0) | 2021.07.14 |