함수(Functions)
특정 작업을 수행하기 위한 재사용 가능한 코드 묶음
함수를 사용하는 이유
두 수의 합을 구하는 함수를 정의하고 사용함으로써 코드의 중복을 방지
재사용성이 높아지고 코드의 가독성과 유지보수성 향상
내장함수 (Built-in Function)
파이썬이 기본적으로 제공하는 함수 (별도의 import 없이 바로 사용 가능)
print()함수, abs()함수 등이 그 예시임 → 별도의 사전작업 필요 없음
내장함수 예시
함수 호출 (function call)
함수를 실행하기 위해 함수의 이름을 사용하여 해당 함수의 코드 블록을 실행하는 것
함수를 호출할 땐 꼭 소괄호를 열었다가 닫아야 한다!
function_name(arguments)
parameter = 매개변수
docsting = 주석 (``` # 을 쓰는 주석을 활용하지 않음 → 함수를 사용하는 가이드를 작성)
return value = 반환값
함수 정의 (정의)
함수 정의는 def 키워드로 시작
def 키워드 이후 함수 이름 작성
괄호 안에 매개변수를 정의할 수 있음
매개변수(parameter)는 함수에 전달되는 값을 나타냄
함수 body
콜론(:) 다음에 들여쓰기 된 코드 블록
함수가 실행될 때 수행되는 코드를 정의
Docstring은 함수 body 앞에 선택적으로 작성 가능한 함수 설명서
함수 반환 값
함수는 필요한 경우 결과를 반환할 수 있음
return 키워드 이후에 반환할 값을 명시
return 문은 함수의 실행을 종료하고, 결과를 호출 부분으로 반환
함수라고 해서 무조건 return 값을 가져야 하는 것은 아니다!
함수 호출
함수를 호출하기 위한 함수의 이름과 필요한 인자 (argument)를 전달해야 함
호출 부분에서 전달된 인자는 함수 정의 시 작성한 매개변수에 대입됨
매개변수 (parameter)
함수를 정의할 때, 함수가 받을 값을 나타내는 변수
인자 (argument)
함수를 호출할 때, 실제로 전달되는 값
매개변수와 인자 예시
Positional Arguments (위치 인자)
함수 호출 시 인자의 위치에 따라 전달되는 인자
위치 인자는 함수 호출 시 반드시 값을 전달해야 함
return이 항상 필수는 아님!
Default Argument Values (기본 인자 값)
함수 정의에서 매개변수에 기본 값을 할당하는 것
함수 호출 시 인자를 전달하지 않으면, 기본값이 매개변수에 할당됨
사용자가 값을 누락해도 기본으로 설정해놓은 매개변수 값이 자동으로 입력됨
Keyword Arguments (키워드 인자)
함수 호출 시 인자의 이름과 함께 값을 전달하는 인자
매개변수와 인자를 일치시키지 않고, 특정 매개변수에 값을 할당할 수 있음
인자의 순서는 중요하지 않으며, 인자의 이름을 명시하여 전달
단 호출시 키워드 인자는 위치 인자 뒤에 있어야 함
Arbitrary Argument List (임의의 인자 목록)
정해지지 않은 개수의 인자를 처리하는 인자
함수 정의 시 매개변수 앞에 '*'를 붙여 사용하며, 여러 개의 인자를 tuple로 처리
Arbitrary Keyword Argument Lists (임의의 키워드 인자 목록)
정해지지 않은 개수의 키워드 인자를 처리하는 인자
함수 정의 시 매개변수 앞에 ‘’를 붙여 사용하며,
여러 개의 인자를 dictionary**로 묶어 처리
함수 인자 권장 작성순서
위치 -> 기본 -> 가변 -> 가변 키워드
호출 시 인자를 전달하는 과정에서 혼란을 줄일 수 있도록 함
단, 모든 상황에 적용되는 절대적인 규칙은 아니며, 상황에 따라 유연하게 조정될 수 있음
Python의 범위(Scope)
함수는 코드 내부에 local scope를 생성하며, 그 외의 공간인 global scope로 구분
울타리의 기준은 함수!
scope
variable
Scope 예시
num은 local scope에 존재하기 때문에 global에서 사용할 수 없음
이는 변수의 수명주기와 연관이 있음
변수 수명주기(lifecycle)
built-in scope
파이썬이 실행된 이후부터 영원히 유지
print(), abs() 같은 함수들로 어디서든 활용 가능
global scope
local scope
이름 검색 규칙(Name Resolution)
파이썬에서 사용되는 이름(식별자)들은 특정한 이름공간(namespace)에 저장되어 있음
아래와 같은 순서로 이름을 찾아 나가며, LEGB Rule이라고 부름
함수 내에서는 바깥 Scope의 변수에 접근 가능하나 수정은 할 수 없음
작은 영역에서 없다면 밖으로 찾아 나가지만, 바깥 영역에서 안쪽 영역으로는 찾아 들어갈 수 없음
LEGB Rule 예시 1
sum이라는 이름을 global scope에서 사용하게 되면서
기존에 built-in scope에 있던 내장함수 sum을 사용하지 못하게 됨
sum을 참조 시 LEGB Rule에 따라 global에서 먼저 찾기 때문
sum 변수 객체 삭제를 위해 del sum을 입력 후 진행
함수를 호출할때 실행됨
정의되는 부분이 중요한게 아니라 호출되는 부분이 중요함!
‘global’ 키워드
변수의 스코프를 전역 범위로 지정하기 위해 사용
일반적으로 함수 내에서 전역 변수를 수정하려는 경우에 사용
‘global’ 키워드 주의사항 (1/2)
‘global’ 키워드 주의사항 (2/2)
global 키워드는 가급적 사용하지 않는 것을 권장
함수로 값을 바꾸고자 한다면 항상 인자로 넘기고
함수의 반환 값을 사용하는 것을 권장
재귀 함수
함수 내부에서 자기 자신을 호출하는 함수
재귀 함수 특징
특정 알고리즘 식을 표현할 때 변수의 사용이 줄어들며, 코드의 가독성이 높아짐
1개 이상의 base case(종료되는 상황)가 존재하고, 수렴하도록 작성
재귀 함수 예시 - 팩토리얼 3
factorial 함수는 자기 자신을 재귀적으로 호출하여 입력된 숫자 n의 팩토리얼을 계산
재귀 호출은 n이 0이 될 때까지 반복되며, 종료 조건을 설정하여 재귀 호출이 멈추도록 함
재귀 호출의 결과를 이용하여 문제를 작은 단위의 문제로 분할하고, 분할된 문제들의 결과를 조합하여 최종 결과를 도출
재귀함수는 1. 종료 조건을 명확히! 2. 반복되는 호출이 종료 조건을 향하도록 해야 한다!
유용한 내장 함수
map(function(함수), iterable(반복 가능한=sequence))
순회 가능한 데이터구조(iterable)의 모든 요소에 함수를 적용하고,그 결과를 map object로 반환
zip(*iterables)
임의의 iterable을 모아 튜플을 원소로 하는 zip object를 반환
lambda 함수
이름 없이 정의되고 사용되는 익명 함수
lambda 함수 구조
lambda 키워드
매개변수
표현식
lambda 함수 예시
간단한 연산이나 함수를 한 줄로 표현할 때 사용
함수를 매개변수로 전달하는 경우에도 유용하게 활용
1회성으로 쓸 때 많이 사용
Packing (패킹)
여러 개의 값을 하나의 변수에 묶어서 담는 것, 가변인자와 유사
패킹 예시
‘*’을 활용한 패킹
*b
는 남은 요소들을 리스트로 패킹하여 할당Unpacking (언패킹)
패킹된 변수의 값을 개별적인 변수로 분리하여 할당하는 것
‘*’을 활용한 언패킹
*
는 리스트의 요소를 언패킹‘’을 활용한 언패킹**
**
는 딕셔너리의 키-값 쌍을 함수의 키워드 인자로 언패킹*, 패킹 / 언패킹 연산자 정리**
‘*’
‘**’