뚝딱햄 탈출기

[Python] 함수 : 함수의 구조 def, global, 람다 표현식 lambda express, map() 본문

Programming language/Python

[Python] 함수 : 함수의 구조 def, global, 람다 표현식 lambda express, map()

hyrmzz1 2023. 10. 3. 17:04
이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저
APPENDIX A. 코딩 테스트를 위한 파이썬 문법 정리 내용

함수

동일한 알고리즘을 반복적으로 사용해야 할 때 함수를 사용한다.

똑같은 코드를 반복적으로 사용할 때 함수를 사용하지 않으면 소스코드가 길어지고 이로 인해 프로그램의 크기가 비효율적으로 커진다.

코딩 테스트에서는 테스트 케이스가 입력된 뒤에 테스트 케이스만큼 특정 알고리즘의 수행 결과를 반복적으로 출력하도록 요구하는 문제가 많이 출제되는데, 문제를 푸는 코드를 함수화 하면 매우 효과적으로 풀 수 있다.

함수의 구조

def 함수명(매개변수):
	실행할 소스코드
	return 반환값

매개변수나 return문은 존재하지 않을 수도 있다.

아래의 두 예제는 동일한 기능을 제공한다.

# 더하기 함수
def add(a, b):
	return a + b

print(add(3, 5))	# 8

# return문 없이 작성
def add(a, b):
	print(a + b)

add(3, 5)	# 8

함수를 호출하는 과정에서 인자(Argument)를 넘겨줄 때, 파라미터의 변수를 직접 지정해 값을 넣을 수 있다.

def minus(a, b):
	print(a - b)

minus(5, 3)	# 파라미터에 인자 순서대로 넘겨줌. 2 
minus(b = 9, a = 2)	# 파라미터의 변수 직접 지정해 인자 넘겨줌. -7

global

함수 내부에서 함수 밖의 변수 데이터에 접근 및 변경하려면, 함수에서 global 키워드를 이용한다.

함수 내부에서 global 키워드로 변수를 지정하면 해당 함수에서 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 된다. (global 키워드를 이용해 함수 밖의 변수 데이터를 전역 변수처럼 사용할 수 있다!)

a = 0

def func():
	global a	# 함수 외부에 있는 변수 a 참조
	a += 1	# 함수 외부의 변수 a를 함수 내부에서도 접근 및 수정할 수 있음.
    
for i in range(10):	# 0부터 9까지
	func()	# func() 10번 반복
    
print(a)	# 10

람다 표현식 Lambda Express

람다 표현식을 이용하면 특정 기능을 수행하는 함수를 한 줄에 작성할 수 있기 때문에 함수를 매우 간단하게 작성해 적용할 수 있다.

람다 표현식은 파이썬의 정렬 라이브러리를 사용할 때, 정렬 기준(Key)을 설정할 때에도 자주 사용된다.

람다 표현식 구조

lambda 매개변수 : 표현식

출처: https://wikidocs.net/64

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

# 람다 표현식으로 구현한 add() 메서드
lambda a, b: a + b

주의할 점은, 람다 표현식 안에서는 새로운 변수를 만들 수 없다는 것이다.

표현식 부분에는 변수 없이 식 한 줄로 작성해야 하고, 만약 변수가 필요한 코드라면 람다 표현식이 아닌 def로 함수를 작성하는 것이 좋다.

람다 표현식 바깥에 있는 변수는 사용할 수 있다.

(lambda x: y = 8; x + y)(5)	# 에러 발생. y라는 새로운 변수 만들 수 없음.

# 람다 표현식 바깥의 변수 사용하기
y = 8
lambda(x: x + y)(5)	# 13

람다 표현식에서도 매개변수가 없는 함수를 만들 수 있다.

람다 표현식으로 매개변수가 없는 함수를 만들 때는 lambda 뒤에 아무 것도 지정하지 않고 콜론(:)을 붙인다.

단, '표현식'은 반드시 값으로 평가되어야 하기 때문에 콜론 뒤에는 반드시 반환할 값이 있어야 한다.

# 람다 표현식 구조 
# lambda 매개변수 : 표현식

# 람다 표현식으로 매개변수 없는 함수 만들기 1
print(lambda : 1)())	# 1

# 람다 표현식으로 매개변수 없는 함수 만들기 2
x = 1
print(lambda : x)())	# 1

람다 표현식 호출

람다 표현식은 변수에 할당하지 않고 그 자체를 바로 호출할 수 있다.

람다 표현식을 괄호(())로 묶은 뒤, 뒤에 인수를 괄호(())에 넣어 호출한다.

# 람다 표현식 호출
(lambda a, b: a + b)(3, 7)

람다 표현식을 인수로 사용하기

람다 표현식은 함수의 인수 부분에서 간단히 함수를 만들기 위해 사용하는데, 이러한 방식으로 사용하는 대표적 예시가 map() 함수이다.

map()

각 요소들에 특정한 함수를 적용시키는 함수로, map(funtion, iterable) 형태이다. map(적용시킬 함수, 함수를 적용할 값들)

첫 번째 매개변수에는 함수를 작성하고, 두 번째 매개변수에는 반복 가능한 문자열(리스트, 튜플, 문자열 등)이 온다.

두 번째 인자로 들어온 반복 가능한 자료형을 첫 번째 인자로 들어온 함수에 하나씩 집어넣어 함수를 수행한다.

map() 함수의 반환 값은 map 객체이기 때문에 해당 자료형을 list 혹은 tuple 자료형으로 변환시켜줘야 한다.

# 리스트의 모든 원소에 각각 1을 더하기
list = [1, 2, 3, 4, 5]

# for 반복문 이용해 리스트의 각 원소에 접근
result1 = []
for i in list:	# in 뒤에는 iterable 자료형이 온다. (리스트, 튜플, 문자열 등)
    result1.append(i + 1)	# 인덱스 순서대로 리스트 원소에 접근해 1을 더하고 result1에 추가
print(result1)	# [2, 3, 4, 5, 6]

# map 함수 이용
def add(n):
    return n + 1
result2 = list(map(add, list))  # list의 모든 원소에 add 함수를 적용. map 형태로 반환되므로 list로 변환
print(result2)	# [2, 3, 4, 5, 6]

람다 표현식과 map()

map() 함수의 인자로 사용할 함수가 일회성이거나 매우 짧다면 람다 표현식과 사용하는 것이 효율적이다.

# 리스트의 각 원소에 1 더해 출력
print(list(map(lambda x: x + 1, [1, 2, 3])))

# def를 사용해 위의 코드를 작성한다면
def plus_one(x):
	return x + 1
print(list(map(plus_one, [1, 2, 3])))	# map 형식으로 반환되므로 list로 변환해야 함!!
Comments