파이썬 함수 이해하기

파이썬 함수 이해하기

함수(Function)

함수란 무엇일까? 사실 파이썬을 처음 접하면서 사용했던 print()len() 같은 것들이 모두 함수이다. 익숙한 len() 함수로 함수란 무엇인지 더 자세히 이해해보자.


함수는 값이다

파이썬에서 가장 중요한 함수의 특성 중 하나가 함수는 값이면서 변수에 할당될 수 있다는 것이다. len을 입력하면 파이썬은 len이라는 이름이 값이 내장 함수인 변수라고 알려준다.

>>> len
<built-in function len>

정수(int) 값이나 문자열(str)처럼 함수의 값 또한 타입(종류)를 가진다.

>>> type(len)
<class 'builtin_function_or_method'>

다른 변수처럼 len에도 값을 할당할 수 있다.

>>> len = "I'm not the len you're looking for."
>>> len
"I'm not the len you're looking for."

len에 문자열 값을 할당 했음으로, type이 str로 바뀐 것을 확인할 수 있다.

>>> type(len)
<class 'str'>

쉬운 예제를 사용하기 위해 여기서는 len을 사용했지만, 사실 파이썬에서 len키워드이다. 물론, 위처럼 len이라는 변수를 생성해 원하는 값을 생성할 수 있지만, 좋지 않은 관습임을 기억하자.

내장함수인 len을 변수로 사용했으므로, 더 이상 내장 함수인 len에 접근할 수 없게 된다. 되돌리고 싶다면 del 키워드를 사용하면 된다.

del 키워드는 값에서 변수의 할당을 취소하는 데 사용된다. del 키워드는 삭제(delete)를 의미하지만, 값 자체를 삭제하지는 않는다. 대신, 값에서 이름을 분리하고, 그 이름을 삭제한다.

>>> del len

일반적으로, del 키워드를 사용하고 삭제된 변수의 이름을 사용하려고 하면 파이썬은 NameError를 일으킨다. 하지만 len이란 이름은 내장 함수의 이름이기때문에 자동으로 원래 함수 값으로 재할당되고 에러를 발생시키지 않는다.

>>> len
<built-in function len>

파이썬은 어떻게 함수를 실행시키는가

함수를 사용하며 처음 주목해야 할 점은, 함수의 이름을 입력만 함으로 함수를 실행시킬 수 없다는 점이다.

# 함수의 이름만 입력한다고해서 함수가 실행되지 않는다.
# IDLE은 변수를 일반적으로 받아들인다.
>>> len
<built-in function len>

# 함수를 호출하기 위해서는 괄호를 다음과 같이 사용해야 한다.
>>> len()
Traceback (most recent call last):
	File "<pyshell#3>", line 1, in <module>
		len()
TypeError: len() takes exactly one argument (0 given)

함수를 호출하기 위해 올바르게 괄호를 사용했지만, 파이썬이 TypeError를 일으킨 것을 확인 할 수 있다. 왜냐면 len()이 호출될 때 len() 함수는 인수를 예상했기 때문이다.

인수(인자, argument)는 인풋으로 함수에 전달되는 값이다. 일부 함수는 인수없이 호출될 수도 있지만, 일부는 원하는 만큼 인수를 전달할 수도 있다. 여기서 len() 함수는 딱 하나의 인수를 필요로 한다.

함수의 실행이 완료되면 함수는 아웃풋으로서 값을 반환한다. 반환된 값은 보통 함수에 전달되는 모든 인수의 값에 따라 달라진다.

함수가 실행되는 과정은 다음과 같이 요약될 수 있다.
  1. 함수가 호출되고 모든 인수는 인풋으로 함수에 전달된다.
  2. 함수가 실행되고 어떤 행위가 인수와 함께 수행된다.
  3. 함수가 반환되고 원래의 함수 호출은 반환된 값으로 대체된다.

설명된 과정을 다음의 코드로 한 번 살펴보자.

>>> num_letters = len("four")

먼저, len() 함수가 인수 four과 함께 호출된다. 함수는 실행되어문자열 "four"의 길이가 4로 계산된다. 그 다음 len() 함수는 숫자 4를 반환하고 함수 호출을 값으로 대체한다.

즉, 파이썬은 값 4를 num_letters 변수에 할당하고 계속 이어 다른 코드를 실행한다.

>>> num_letters = 4

함수는 부작용을 일으킬 수 있다

함수가 변경되거나 함수 자체 외부의 영향을 미칠 경우, 함수는 부작용을 일으킬 수 있다. 예를 들어, print() 함수를 문자열 인수와 호출하면 문자열은 파이썬 쉘에 텍스트로 표시되게 된다. 하지만 함수 print()는 값으로 어느 텍스트도 반환하지 않는다.

>>> return_value = print("What do I return?")
What do I return?
>>> return_value
>>>

print("What do I return?")return_value라는 변수에 할당했을 때, 문자열 "What do I return?"이 출력된 것을 볼 수 있다. 하지만 변수 return_value를 호출하면 아무 값도 반환되지 않는다.

print() 함수는 None이라고 불리는 특별한 값을 반환한다. None은 데이터의 부재를 의미하며 NoneType이라고 불리는 타입을 가진다. 즉, print() 함수가 호출됬을 때 표시되는 텍스트는 사실 반환 값이 아니다. 이런 부분이 바로 print() 함수의 부작용이라고 할 수 있다.

>>> type(return_value)
<class 'NoneType'>
>>> print(return_value)
None

Reference