머신러닝/인공지능(AI) 기초 다지기

1. 파이썬 기초 - Pythonic code

#fdd4ff 2023. 10. 18. 20:03
해당 포스트의 내용 출처는 Naver boostcourse : 인공지능(AI) 기초 다지기 에 있습니다.

 

 

split & join

코테 준비에서 input값을 다루거나 output 형태를 맞출 때 자주 썼던 함수였던 걸로 기억한다.
- split()은 기준에 따라 나누는 것이고 join은 반대로 모두 합치는 것.
- 보통 리스트 안의 요소들을 string형태로 통째로 출력하고 싶을 때 많이 썼던 것 같다.

join의 예제코드만 간단하게 쓰고 넘어가도록 한다. 

colors = ['red', 'blue', 'green', 'yellow']
result = ''.join(colors)
# 'redbluegreenyellow'
result = '-'.join(colors) # 연결 시 "-"으로 연결
# 'red-blue-green-yellow'

 

list comprehension

얘도 역시 보통 코테 준비할 때 많이 쓰이는 함수이기도 한다.
- 코드가 간략하게 쓰이기 때문에 보기 편하다는 장점이 있다.
- 또한 일반적으로 for 루프와 append를 쓰는 코드보다 속도가 빠름.

result = []
for i in range(10):
result.append(i)
result = [i for i in range(10)]


2차원 배열도 가능하다.

result = [i+j for i in word1 for j in word 2]

예시 결과




만약 if문 같이 들어가있으면 맨 끝 조건이 있으면 해당 조건만 찍히게 된다. 이것을 filter라고 불린다.

 

enumerate & zip

- enumerate : list의 element 추출 시 번호를 붙여서 추출 (dict 타입 쓸 때 많이 쓰인다곤 한다)

for i in range(n):
	print(i, array[i])
# 이런식으로 코딩을 할 수도 있지만

for idx, num in enumerate(array):
	print(idx, num) 
# idx : index 값과 num : 리스트의 원소 값을 같이 추출해놓을 수 있다.
# 코드의 간편성


- zip : 두 개의 list의 값을 병렬적으로 추출함

# 보통 x,y 좌표같은 문제를 풀 때 봤던 것 같다.
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 & reduce

 

(1) lambda

lambda 함수는 파이썬보다 보통 코틀린, 자바, 자바스크립크에서 많이 쓰이긴 했는데..
나 혼자만 파이썬에서 거의 안 쓴건가 싶기도 하다..
- 함수의 이름없이 쓸 수 있는 익명 함수 (python3부터 권장하지 않으나, 여전히 쓰인다고 한다.)

f = lambda x, y: x + y # x, y를 매개변수로 하여, x+y를 더한 것을 반환
print(f(1, 4)) # 1+4 인 값인 5를 반환
f = lambda x: x ** 2 # 제곱한 값을 반환
print(f(3)) # 9를 반환

 

(2) reduce

- 리스트에 똑같은 함수를 적용해서 통합

from functools import reduce
print(reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]))
# 1+2 = 3, 3+3 = 6, 6+4 = 10, 10+5 = 15
# 결과는 15를 출력

 

 

iterable object

- iter과 next 함수를 사용
- iter 함수로 iter 객체 생성 후, next 함수를 사용해서 하나씩 원소를 건너는 느낌

cities = ["Seoul", "Busan","Jeju"]
iter_obj = iter(cities)
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
next(iter_obj)

 

 

generator

# generator를 사용하지 않은 일반 함수
def general_list(value):
    result = []
    for i in range(value):
    	result.append(i)
    return result


# generator를 사용했을 때
def geneartor_list(value):
    result = []
    for i in range(value):
    	yield i

generator를 사용하면 큰 데이터 처리에 유용함. (파일 데이터 처리에도 사용)

 

 

가변인자

이 부분은 나도 좀 생소했던 개념..(반성하는 중 ㅠㅠ) 자주 써보도록 하자 

def asterisk_test(a, b,*args):
	return a+b+sum(args)
print(asterisk_test(1, 2, 3, 4, 5))
# a = 1, b = 2, 나머지 3~5는 args에 들어간다.

*args 에 3,4,5 들어간 것을 확인할 수 있다.

 

 

키워드 가변인자

- 파라미터 이름을 따로 지정하지 않고 입력한다.
- (*) 를 두 번 사용하여 함수의 파라미터를 표시함
- 입력된 값은 dict type으로 사용할 수 있음 

def kwargs_test_1(**kwargs):
    print(kwargs)
    
def kwargs_test_2(**kwargs):
    print(kwargs)
    print("First value is {first}".format(**kwargs))
    print("Second value is {second}".format(**kwargs))
    print("Third value is {third}".format(**kwargs))

def kwargs_test_3(one,two,*args,**kwargs):
    print(one+two+sum(args))
    print(kwargs)
    
kwargs_test_1(a=1, b=2, c=3)    
kwargs_test_2(first=1, second=2, third=3) 
kwargs_test_3(3,4,5,6,7,8,9, first=3, second=4, third=5)

dict type으로 들어가는 것을 확인. print format을 보면 key형태로 꺼낼 수 있음.

 

unpacking a container

- tuple, dict 등 자료형에 들어가 있는 값을 바깥으로 풀어낸다(unpacking)

언팩킹의 간단한 예시

- 자료형 앞에 * 하나면 unpacking으로 풀려버린다.
항상 코테 output을 출력할 때 join으로만 생각했었는데, unpacking 기능을 사용해서 쉽게 쓸 수도 있었다.

def asterisk_test(a, b, c, d,):
    print(a, b, c, d)
    
data = {"b":1 , "c":2, "d":3}
asterisk_test(10, **data)

 

a = 10, b, c, d = 1, 2, 3