Script/Python

[Python 강의] 9. 파이썬 함수의 활용과 람다 함수

Bloger A 2023. 12. 28. 18:53
반응형

[목차]
1. 파이썬의 리스트, 튜플, 사전, 집합 자료형의 특징
2. 파이썬의 리스트, 튜플, 사전 자료형의 활용
3. 파이썬의 수치형 자료형과 문자열 자료형의 특징
4. 파이썬의 문자열 자료형의 메소드와 포맷팅
5. 파이썬의 조건문
6. 파이썬의 반복문
7. 파이썬의 파일 입출력
8. 파이썬의 함수
9. 파이썬 함수의 활용과 람다 함수
10. 파이썬의 모듈
11. 파이썬의 클래스
12. 파이썬 클래스의 활용
13. 파이썬의 예외 처리


9. 파이썬 함수의 활용과 람다 함수

PYTHON

 

1. 파이썬의 람다 함수

 리스트 내포, 조건부 표현식 등과 같이 여러 줄의 코드를 간결하게 표현할 수 있도록 도와주는 새로운 함수 정의 방법
●  Lambda로 정의할 수 있고, def와 같은 역할

[사용법]
Lambda 매개변수 1, 매개변수 2, ... : 함수식

  ○  함수의 이름을 정의하지 않고, 일회성으로 간편하게 사용할 때
  ○  def로 정의할 만큼 복잡하지 않을 때 사용
  ○  매개변수를 이용한 표현식으로 정의
 
 

2. 람다 함수 정의

●  람다 함수를 func라는 변수에 할당해 일반 함수처럼 사용
●  따로 변수에 할당하지 않고 한 줄로 표현
●  def 함수와 같이 기본 매개변수, 키워드 매개변수, 가변 매개변수 모두 설정 가능

예제 1) 일반 함수 선언
def func(a, b):
	return a + b
    
    res = func(7, 3)
    print(res)
-----------------
출력 : 10


예제 2) 람다 함수로 선언
func = lambda a, b: a + b
res = func(7, 3)
print(res)
-----------------
출력 : 10


예제 3) 기본 매개변수 사용 예제
print((lambda a, b=1: a + b)(3))
-----------------
출력 : 4


예제 4) 키워드 매개변수 사용 예제
print((lambda key1, key2: key1 + key2)(key1=7, key2=3))
-----------------
출력 : 10


예제 5) 가변 매개변수 사용 예제
print((lambda a, *b: a * b)(3, 1, 2, 3))
-----------------
출력 : (1, 2, 3, 1, 2, 3, 1, 2, 3) # (1, 2, 3) 을 3회 반복

 
 

3. 람다 함수 응용

♣  조건문, 내장함수 map, filter와 활용 가능
 
●  조건문과 함께 사용

예제 1) 일반 함수 조건문
def func(a, b):
	if a == 2:
    	return b
    else:
    	return a + b

res = func(7, 3)
print(res)
-------------------------
출력 : 10


예제 2) 람다 함수 조건문
print((lambda a, b:b if a==2 else a + b)(7, 3)
-------------------------
출력 : 10

 
 
●  map 내장 함수와 함께 활용 -> map(함수, 리스트)
  ○  시퀀스 자료형이 지닌 각 요소 값들에 대해 함수 적용 후 각 값들에 대해 map 객체 반환
  ○  map(함수, 리스트) -> 리스트 항목마다 함수를 적용하여 값을 반환하는 함수

예제 1) 일반 함수 로직
def func(x):
	return x * x

a = [1,2,3,4,5,6,7,8,9]
b = []
for i in a:
	y = func(i)
    b.append(y)

print(type(b))
print(b)
----------------------
출력: <class 'list'>
	  [1, 4, 9, 16, 25, 36, 49, 64, 81]

예제 2) map 함수 적용 일반 함수
def func(x):
	return x * x

a = [1,2,3,4,5,6,7,8,9]
b = map(func, a)

print(type(b))
print(b)
----------------------
출력: <class 'map'>
	  [1, 4, 9, 16, 25, 36, 49, 64, 81]


예제 3) 람다 함수에 map 함수 적용
print(list(map(lambda x: x * x, [1,2,3,4,5,6,7,8,9])))
----------------------
출력: [1, 4, 9, 16, 25, 36, 49, 64, 81]

 
 

●  filter 내장 함수와 함께 활용 -> filter(함수, 리스트)
  ○  시퀀스 자료형이 지닌 각 요소 값들에 대해 함수에 적용한 결과가 참인 원소값만 지닌 filer 객체 반환
  ○  filter(함수, 리스트) -> 원하는 조건에 맞는 항목만 반환하는 함수

예제 1) 일반 함수 로직
def func(x):
	return x % 2 == 0	# 2로 나누어 0과 같으면 0을 반환

a = [1,3,4,5,6,7]
b = []
for i in a:
	y = func(i)
    b.append(y)

print(b)
----------------------
출력: [4, 6]


예제 2) map 함수 적용 일반 함수
def func(x):
	return x % 2 == 0	# 2로 나누어 0과 같으면 0을 반환

a = [1,3,4,5,6,7]

print(list(filter(func, a)))	# filter 예제
----------------------
출력: [4, 6]


예제 3) 람다 함수에 map 함수 적용
print(list(filter(lambda x: x % 2 == 0, [1,3,4,5,6,7])))
----------------------
출력: [4, 6]

 

●  복잡한 객체를 정렬할 때 활용 가능 -> sorted(함수)

예제 1) sorted 함수 사용
actor = [
	("송강호", "복수는", "2002년"),
    ("정우성", "지우개", "2004년"),
    ("정우성", "더 킹", "2017년")
]

print(sorted(actor))
print(sorted(actor, key=lambda x:x[2]))	# x[2] 값을 기준으로 정렬
print(sorted(actor, key=lambda x:x[1]))	# x[1] 값을 기준으로 정렬
----------------------
출력:
[('송강호', '복수는', '2002년'), ('정우성', '더 킹', '2017년'), ('정우성', '지우개', '2004년')]
[('송강호', '복수는', '2002년'), ('정우성', '지우개', '2004년'), ('정우성', '더 킹', '2017년')]
[('정우성', '더 킹', '2017년'), ('송강호', '복수는', '2002년'), ('정우성', '지우개', '2004년')]

 

●  문자열 포맷팅과 함께 응용

예제 1) lambda와 문자열 포맷팅 함께 활용
print((lambda x, y : "{} X {} = {}".format(x, y, x * y))(2, 1))
----------------------
출력:
2 X 1 = 2

 
 
3. 파이썬 함수의 활용 : 재귀함수

●  재귀 함수는 자기 자신을 호출하는 함수로 파이썬은 자기 자신을 함수 내에서 호출할 수 있기 때문에 재귀 함수라고 함
  ○  파이썬은 끝없이 자기 자신을 호출해 무한루프에 빠지는 현상을 방지하기 위해 일정횟수 이상 반복하여 자기 자신을 호출할 경우 오류 발생 (종료 조건이 반드시 필요)
  ○  파이썬에서는 반복횟수를 제한하고 있음.
●  반복이 필요한 작업을 간결한 코드로 작성 가능
●  무한루프에 빠지지 않도록 종료 조건 반드시 설정 필요.

예제 1) 재귀 함수 에러 예제(종료 조건 없음)
def recursive(num):
	print(num)
    num+=1
    recursive(num)

recursive(1)	# 무한 루프로 빠지므로 에러가 남
----------------------
출력: File "C:\Users\Desktop\test.py", line 3
    num+=1
          ^
IndentationError: unindent does not match any outer indentation level

 
 

●  팩토리얼 factorial 함수는 1부터 n까지 곱셈의 결과를 출력하는 함수
  ○  만약 n이 5이면 5 팩토리얼의 결과는 5 x 4 x 3 x 2 x 1 = 120 
●  math 모듈의 factorial 함수 사용 가능
●  람다 함수로 변환 가
  ○  람다 함수는 함수명이 없기 때문에 변수로 저장하여 활용

[팩토리얼 사용법]
factorial(10) = 10 X factorial(8)
			  = 10 X 9 X factorial(8)
              = 10 X 9 X 8 X factorial(7)
              = 10 X 9 X 8 X 7 X factorial(6)
              = 10 X 9 X 8 X 7 X 6 X factorial(5)
              = ....


예제 1) 팩토리얼 재귀 함수 (종료조건 미작성)
def fact(n):
	return n*fact(n-1)	# 재귀함수 종료조건이 없음

print(fact(10))	# 무한 루프로 빠지므로 에러가 남
# 파이썬에서는 반복횟수를 제한하고 있음.
----------------------
출력: Traceback (most recent call last):
  File "C:\Users\Documents\test.py", line 4, in <module>
    print(fact(10))     # 무한 루프로 빠지므로 에러가 남
  File "C:\Users\Documents\test.py", line 2, in fact
    return n*fact(n-1)  # 재귀함수 종료조건이 없음
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded


예제 2) 팩토리얼 재귀 함수(종료조건 작성)
def fact(n):
	if n == 0:	#  n이 0이면 1을 반환하고 재귀함수 종료
    	return 1
	return n * fact(n - 1)

print(fact(10))
----------------------
출력: 3628800


예제 3) math 모듈 내부의 factorial 함수 이용
import math
print(math.factorial(10))
----------------------
출력: 3628800


예제 4) 람다 함수로 변환
fact = lambda x: x==0 and 1 or x*fact(x-1)
print(fact(10))
----------------------
출력: 3628800

 

 
※ 출처
직업교육 : [온캠] 인공지능 구현을 위한 파이썬 프로그래밍
김선용 교수님
 
(강의 최고예요..👍)

반응형