Youtube '동빈나' - [이코테 2021 강의 몰아보기] 영상을 보고 복습하는 글입니다.
6. 함수와 람다 표현식
ㄱ. 함수
▶함수(Function): 특정한 작업을 하나의 단위로 묶어놓은 것
-> 불필요한 소스코드의 반복을 줄일 수 있다.
▶내장 함수 : 파이썬이 기본적으로 제공하는 함수 ex)input(), print()
▶사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수
▶매개변수 : 함수 내부에서 사용할 변수
▶반환 값 : 함수에서 처리된 결과를 반환
▶파라미터 지정할 때, 매개변수의 순서가 달라져도 직접 지정할 수 있다.
ex) add(b = 3, a = 7)
ㄴ. global 키워드
▶함수 내부에서 바깥에 선언된 변수를 사용하고자 한다면, global 키워드로 변수를 지정한다.
a = 0
def func():
global a # 함수 밖에 있는 변수를 참조하기 위해 global키워드로 변수를 선언.
a += 1
for i in range (1,10):
a += 1
print(a)
func()
▶단순히 전역변수를 참조하여 값을 출력하는 경우에는 global키워드없이 참조가능하지만,
전역변수의 값을 변경하는 경우에는 global키워드를 사용해야한다.
* 단, 리스트의 경우 append()로 원소를 추가하는 것은 global키워드없이 가능하다.
a = 10
array = [1, 2, 3, 4, 5]
def func1():
global a
a += 1
print(a) #11
def func2():
global array
array = [3, 4, 5]
print(array) #[3, 4, 5]
func1() # 11
func2() # [3, 4, 5]
▶global키워드 없이 이름이 같은 변수를 함수 내에서 선언하여 사용하는 경우, 지역변수를 우선순위로 생각하지만, 함수 밖에서는 전역변수가 출력된다.
a = 10
array = [1, 2, 3, 4, 5]
def func1():
a = 0
a += 1
print(a) # 1
def func2():
array = [3, 4, 5]
print(array) # [3, 4, 5]
func1() # 10
func2() # [1, 2, 3, 4, 5]
ㄷ. 여러개의 반환 값
▶파이썬에서 함수는 여러개의 반환 값을 가질 수 있다.
packing : 여러개의 변수가 한꺼번에 반환되는 것
unpacking : 반환된 값을 차례대로 특정 변수에 담는 것
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 # packing
A, B, C, D = operator(7, 3) #unpacking
print(A, B, C, D)
ㄹ. 람다 표현식
▶람다 표현식을 이용하면 함수를 간단하게 작성 할 수 있다.
-> 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점! (별도의 함수를 정의하지 않고) (이름 또한 정의 X)
▶함수 자체를 입력으로 받는 또다른 함수가 존재할 때 유용하게 사용 가능.
혹은 함수를 한번 사용하고 말 경우
# 기존 함수 정의
def add(a,b):
return a+b
print(add(3, 7))
# 람다 표현식으로 구현한 add()메서드
print((lambda a, b: a + b)(3, 7)) # (lambda [입력으로 받을 매개변수]: [함수 반환 값])(매개변수 값)
▶람다 표현식 예시1 : 내장 함수에서 자주 사용.
array =[('홍길동',50), ('이순신',32), ('아무개',74)]
# 일반적
def my_key(x):
return x[1] #두번째 원소를 반환
print(sorted(array, key=my_key)) #array리스트를 정렬하는 내장함수에서, key속성의 값을 정렬 기준으로 넣어줄 수 있다.
#람다식
print(sorted(array, key=lambda x: x[1])) #튜플 x에서 두번째 원소를 반환.
▶람다 표현식 예시2 : 여러 개의 리스트에 동일한 규칙을 적용할 경우.
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
result = map(lambda a,b: a+b, list1, list2)
# a,b에 list1,list2를 넣어서 a+b를 반환하는데, 각 원소에 lambda함수를 모두 적용(map)
print(list(result)) # list형태로 출력
7. 자주 사용되는 표준 라이브러리
▶코딩 테스트에서 사용빈도가 높은 라이브러리로 살펴보겠다.
- 내장함수 : 기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공. (import없이 사용 가능)
ex)input(), print(), sum(), min(), max(), sorted(), eval()
- itertools : 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공.
특히 순열과 조합 라이브러리는 코딩 테스트(완전탐색 문제)에서 자주 사용됨! (모든 경우의 수를 고려해야할 때 사용)
- heapq : 힙 자료구조를 제공. 일반적으로 우선순위 큐 기능을 구현하기 위해 사용된다.
최단경로 알고리즘에서 많이 활용
- bisect : 이진 탐색 기능을 제공.
- collections : 덱, 카운터 등의 유용한 자료구조를 포함.
- math : 필수적인 수학적 기능을 제공.
팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수 ~ 파이(pi)같은 상수 포함.
▶내장 함수
ⓐ eval()함수 : 사람입장에서 표현된 수식을 계산하여 숫자로 반환하는 함수
result = eval("(3+5)*7)")
print(result) # 56 출력
ⓑ sorted() 함수 with key : key속성으로 정렬 기준을 지정해주어 원소를 오름/내림차순으로 정렬하는 함수
array = [('홍길동', 35), ('이순신', 75), ('아무개', 50)]
result = sorted(array, key= lambda x: x[1], reverse=True) #x[1]값을 key값으로 내림차순(reverse=True) 정렬
print(result) # [('이순신', 75), ('아무개', 50), ('홍길동', 35)]
▶itertools : 모든 경우의 수를 고려해야할 때 사용하는 라이브러리
ⓐ 순열 nPr : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것 (순서 고려)
- ['a', 'b', 'c']에서 세 개를 선택하여 나열하는 경우 : 'abc', 'acb', 'bac', 'cab', 'bac', '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')]
ⓑ 조합 nCr : 서로 다른 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')]
-> 해당 문제를 풀기 위해 모든 경우의 수를 고려했을 때 시간초과가 되는지를 확인할 때 사용함.
순열로 구했을 때 값이 천만, 1억 단위로 넘어가는 경우, 완전탐색을 이용하면 시간초과 판정받게 됨.
ⓒ 중복 순열을 구할 때의 코드 (product이용)
from itertools import product
data = ['A', 'B', 'C']
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용)
print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
ⓓ 중복 조합을 구할 때의 코드 (combinations_with_replacement 이용)
from itertools import combinations_with_replacement
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기 (중복 허용)
print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
▶ collections
ⓐ Counter : 등장 횟수를 세는 기능을 제공. ->워드클라우드에서 사용됨.
- 리스트와 같은 반복 가능한 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장하는지 알려준다.
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) # Counter 객체를 생성
print(counter['blue']) # 3
print(counter['green']) # 1
print(dict(counter)) # 사전 자료형으로 변환하는데, key값이 등장 횟수
# 3
# 1
# {'red': 2, 'blue': 3, 'green': 1}
▶ math
- 최대 공약수를 구해야 할 때 math 라이브러리의 gcd()함수를 이용할 수 있다. >>gcd(greatest common deviser)
- a,b의 최소 공배수 : a*b를 최대공약수로 나눈 값.
import math
# 최소 공배수(LCM)를 구하는 함수
def lcm(a,b):
return (a*b) // math.gcd(a,b)
a = 21
b = 14
print(math.gcd(a,b)) # 21, 14의 최대 공약수(GCD) 계산
print(lcm(a,b)) # 21, 14의 최소 공배수(LCM) 계산
# 7
# 42
'Python' 카테고리의 다른 글
[colab] 2. colab으로 Numpy 모듈 사용하기 (0) | 2021.01.19 |
---|---|
[colab] 1. 코랩 설치 및 기초 명령어 (0) | 2021.01.17 |
파이썬 기초 문법2 (기본 입출력과 반복문&조건문) (0) | 2021.01.02 |
라즈베리파이의 GPIO (0) | 2020.11.06 |
Beautiful Soup 사용하여 html 분석하기 (0) | 2020.09.07 |