본문 바로가기

Algorithm

알고리즘 기초 및 파이썬 기초 문법(6) - 함수와 람다 표현식, 표준 라이브러리

함수

- 함수(Function)란 특정한 작업을 하나의 단위로 묶어 놓은 것

- 불필요한 소스코드의 반복을 줄일 수 있음

 

- 내장 함수 : 파이썬이 기본적으로 제공하는 함수

- 사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수

1. 함수 정의하기

- 매개변수 : 함수 내부에서 사용할 변수

- 반환 값 : 함수에서 처리 된 결과를 반환

 

# 더하기 함수 1
def add(a, b):
	return a + b
print(add(3, 7))
# 10

# 더하기 함수 2
def add(a, b):
	print('함수의 결과:', a + b)
add(3, 7)
# 함수의 결과: 10

 

+ ) 여러 개의 반환 값

- 파이썬에서 함수는 여러 개의 반환 값을 가질 수 있음

 

def operator(a, b):
	add_var = a + b
    subtract_var = a - b
    multiply_var = a * b
    divide_var = a / b
    return add_var, subtract_var, multiply_var, divide_var
    
 a, b, c, d = operator(7, 3)
 print(a, b, c, d)

2. 파라미터 지정하기

- 파라미터의 변수를 직접 지정할 수 있음

 

def add(a, b):
	print('함수의 결과:', a + b)
add(b = 3, a = 7)
# 함수의 결과: 10

3. global 키워드

- global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고

- 함수 바깥에 선언된 변수를 바로 참조하게 됨

 

a = 0

def func():
	global a
    a += 1
for i in range(10):
	func()
print(a)
# 10

람다 표현식

- 람다 표현식을 이용하면 함수를 간단하게 작성할 수 있음

- 특정한 기능을 수행하는 함수를 한 줄에 작성 가능

 

#일반적인 add() 메서드
def add(a, b):
	return a + b

print(add(3, 7))
# 10

#람다 표현식으로 구현한 add() 메서드
print(lambda a, b: a + b)(3, 7))
# 10
array = [('홍길동', 50), ('이순신', 32), ('아무개', 74)]

def my_key(x):
	return x[1]
print(sorted(array, key = my_key))
print(sorted(array, key = lambda x: x[1]))

# [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
# [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]

result = map(lambda a, b: a + b, list1, list2)
print(list(result))

# [7, 9, 11, 13, 15]

실전에서 유용한 표준 라이브러리

- 내장 함수 : 기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공 (필수적인 기능 포함)

- itertools : 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공 (순열과 조합(완전탐색) 포함)

- heapq : 힙(Heap) 자료구조 제공 (우선순위 큐 구현 - 최단경로)

- bisect : 이진탐색(Binary Search) 기능을 제공

- collections : 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함

- math : 필수적인 수학적 기능을 제공 (펙토리얼, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수 포함)

 

#sum()
result = sum([1, 2, 3, 4, 5])
print(result)
# 15

#min(), max()
min_result = min(7, 3, 5, 2)
max_result = max(7, 3, 5, 2)
print(min_result, max_result)
# 2 7

# eval()
result = eval("(3+5)*7")
print(result)
# 56

# sorted()
result = sorted([9, 1, 8, 5, 4])
reverse_result = sorted([9, 1, 8, 5, 4], reverse=True)
print(result)
print(reverse_result)
# [1, 4, 5, 8, 9]
# [9, 8, 5, 4, 1]

# sorted() with key
array = [('홍길동', 35), ('이순신', 75), ('아무개', 50)]
result = sorted(array, key = lambda x: x[1], reverse=True)
print(result)
#  [('이순신', 75), ('아무개', 50), ('홍길동', 35)]

 

순열과 조합

모든 경우의 수를 고려해야 할 때 어떤 라이브러리를 효과적으로 사용?

출처: 이코테

- 순열 : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열

         {'A', 'B', 'C'}에서 세 개를 선택하여 나열하는 경우 : 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA'

- 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 경우

         {'A', 'B', 'C'}에서 순서를 고려하지 않고 두 개를 뽑는 경우: 'AB', 'AC', 'BC'

 

1. 순열

- 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열

 {'A', 'B', 'C'}에서 세 개를 선택하여 나열하는 경우 : 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA'

 

from itertools import permutations

data = ['A', 'B', 'C']

result = list(permutations(data, 3))
print(result)
# [('A','B','C'), ('A','C','B'), ('B','A','C'), ('B','C','A'), ('C','A','B'), ('C','B','A')]

 

2. 조합

- 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 경우

{'A', 'B', 'C'}에서 순서를 고려하지 않고 두 개를 뽑는 경우: 'AB', 'AC', 'BC'

 

from itertools import combinations

data = ['A', 'B', 'C']

result = list(combinations(data, 2))
print(result)
# [('A','B'), ('A','C'), ('B','C')]

 

3. 중복 순열과 중복 조합

 

from itertools import product

data = ['A', 'B', 'C']

#2개를 뽑는 모든 순열 구하기 (중복 허용)
result = list(product(data, repeat=2))
print(result)

from itertools import combinations_with_replacement

data = ['A', 'B', 'C']

#2개를 뽑는 모든 조합 구하기 (중복 허용)
result = list(combinations_with_replacement(data, 2))
print(result)

Counter

- 파이썬 collections 라이브러리의 Counter는 등장 횟수를 세는 기능 제공

- 리스트와 같은 반복 가능한(iterable) 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장했는 지를 알려줌

 

from collections import Counter

counter = Counter(['red', 'blue', 'blue', 'green', 'red', 'red'])

print(counter['blue']) # 'blue'가 등장한 횟수 출력
print(counter['red']) # 'red'가 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 변환

# 2
# 3
# {'red': 3, 'blue': 2, 'green': 1}

최대 공약수와 최소 공배수

- 최대 공약수를 구해야 할 때는 math 라이브러리의 gcd( ) 함수를 이용

 

import math

# 최소 공배수(LCM)를 구하는 함수
def lcm(a, b):
	return a * b // math.gcd(a, b)

a = 21
b = 14

print(math.gcd(21, 14)) # 최대 공약수(GCD) 계산
print(lcm(21, 14)) # 최소 공배수(LCM) 계산
# 7
# 42