: 특정한 기능을 하는 코드의 조각(묶음)
- 특정한 명령을 수행하는 코드를 매번 작성하지 않고 명령어 입력으로만 한번에 실행시킨다.
- 사용자 함수: 사용자가 직접 정의하여 사용하는 함수
- 내장함수: 언어에 내장되어 기본적으로 제공되는 함수
- 왜 함수를 사용할까?:
- 재사용성, 가독성, 생산성이 향상된다.
- 복잡한 내부의 데이터를 생각하지 않고 명령어만 입력하여 편하게 수십줄의 코드를 실행시킨다.
- Decomposition(기능을 분해, 재사용 가능)
- Abstraction(복잡한 내용을 숨기고, 기능에 집중하여 사용할 수 있게 한다. 블랙박스라고도 부른다.
# sum을 코드로 나타내보자
numbers = [1, 10, 100]
result = 0
count = 0
for i in numbers:
result += i
count += 1
print(result/count)
# 위의 코드를 sum과 len 함수를 사용하면 코드가 매우 짧고 간결해진다.
numbers = [1, 10, 100]
print(sum(numbers)/len(numbers))
-
함수는
def 함수명()
으로 정의한다. -
함수는
함수명()
으로 호출한다.
# 사용자 함수
def foo():
return True
def add(x,y): # parameter를 받아서
return x + y # 결과를 return 해준다.
def minus(x,y):
return x - y
#add(2,3) 할 시 5가 출력될 것이다.
-
함수는 반드시 값을 하나만 return한다.
- 명시적 return이 없는 경우에는 None을 반환한다.
-
return 후에 함수는 종료된다.
아래 코드의 문제점이 무엇일까?
def minus_and_product(x,y):
return x - y
return x * y
# 실행할 시 x - y만 반환된다.
하지만 아래와 같이 코드를 작성할 경우 두 값을 한꺼번에 튜플로 반환이 가능하다.
def minus_and_product(x,y):
return x-y, x * y
minus_and_product(4, 5)
# (-1, 20)으로 튜플로 반환된다.
⛔return vs print
-
return
은 함수 안에서 값을 반환하기 위해 사용되는 키워드이다. -
반환된 값을 출력하기 위해서는
print
를 해야 한다.
⛔parameter vs argument
-
parameter: 함수를 실행할 때, 함수 내부에서 사용되는 식별자
-
argument: 함수를 호출 할 때, 넣어주는 값
- 함수 호출 시 함수의 parameter를 통해 전달되는 값
- 소괄호 안에 할당된다. func_name(argument)
-
positional arguments: 기본적으로 함수 호출 시 argument는 위치에 따라 전달된다.
-
keyword arguments: 직접 변수의 이름으로 특정 argument를 전달 가능하다.
def add(x,y):
return x + y
add(2,5) # positional argument
add(x = 5, y = 2) # keyword argument
add(y = 2, x = 5) # keyword argument
- default argument values
- 함수 정의 시, argument의 기본값을 정의해 놓는다.
def add(a, b=0)
의 경우 a값만 넣어줘도 함수가 작동하고, 원한다면 b 값도 재정의해서 입력해도 된다.
def add(x, y = 0): # default argument value y = 0
return x + y
add(4) # 출력값은 4이다. y의 값은 default argument value에 의해 0으로 고정되어 있기 때문이다.
- 정해지지 않은 개수의 arguments
- 여러개의 positional argument를 하나의 필수 parameter로 받아서 사용한다.
- arguments의 갯수가 정해지지 않았기 때문에 유동적으로 argument를 추가/삭제 등이 가능하다.
*args
: 여러개의 argument를 입력받는다. 단, 값이 튜플로 생성된다.**kwargs
: 여러개의 argument를 입력받고 나중에 키워드로 불러올 수 있다. 값이 딕셔너리로 생성된다.
def my_add(*args): #arguments (*args)
return args
result = my_add(1,2,3)
print(result) # (1,2,3) <class 'tuple'>
def my_func(**kwargs): #keyword arguments (**kwargs)
return kwargs
result = my_func(name = '홍길동', age = '100', gender = 'male')
print(result) # {name = '홍길동', age = '100', gender = 'male'} <class 'dictionary'>
- 함수의 범위(scope)는 함수 내부의 local scope와 그 외의 외부 공간인 global scope로 구분된다.
scope:
glocal scope
: 코드 어디에서든 참조 가능한 공간local scope
: 함수가 만든 scope이며 함수 내부에서만 참조가 가능
variable:
global variable
: global scope에 정의된 변수local variable
: local scope에 정의된 변수
: 객제는 각자의 수명주기가 존재한다.
-
built-in scope: 기본적으로 내장되어 있는 객체이다.
-
global scope: 모듈이 호출된 시점 이후 인터프리터가 끝날 때까지 유지된다.
-
local scope: 함수 안에서 정의되어서 함수가 끝나면 사라진다.
- 파이썬에서 사용되는 식별자들은 **이름공간(namespace)**에 저장되어 있다.
- 식별자를 호출 할 때 아래의 순서로 이름을 찾아나가며, 이를 LEGB Rule이라고 한다.
Local scope
: 함수Enclosed scope
: 특정 함수의 상위 함수Global scope
: 함수 밖의 변수, Import 모듈Built-in scope
: 파이썬 안에 내장되어 있는 함수 또는 속성
⛔함수 내에서 바깥 Scope의 변수에 접근이 가능은 하나, 수정은 불가능하다는 것을 명심하자.
: 반복 가능한 것의 모든 요소에 적용하고 싶은 함수를 적용하여 반환한 결과이다.
map(function, iterable)
: 순회 가능한 데이터구조(iterable)의 모든 요소에 함수(function)를 적용하고 그 결과를 map object로 반환.
ex:
# list에 map(int, list)를 적용해보자.
numbers = ['1', '2', '3', '4']
new_numbers_2 = map(int, numbers) # numbers 리스트의 모든 value에 int 형변환을 적용한다.
print(new_numbers_2) # <map object at 0x0000029B7BE92E30>
print(list(new_numbers)) # 리스트로 변환하여 출력한다. 보기 위해서 리스트로 바꾼 것이지 반드시 바꿔야 하는 것은 아니다.