파일 업로드

함수의 이해

profile
실행 시간 제한메모리 제한
1 초10 MB
📃 해결할 문제

이번 시간에는 Python 에서의 함수에 대해 좀 더 자세하게 알아볼 거에요 :)

먼저 함수를 정의할 때, 실수하기 쉬운 경우들 입니다. 

 

함수를 정의할 때 흔히 실수하는 오타

  • :를 적었는지 확인하기!
def myfunction()
# 위의 선언문은 에러 발생!

def myfunction():
# :를 적었는지 확인하세요!
  • 들여쓰기 (tab)
def myfunction():
x = 3
return x
# 위의 선언문은 에러 발생!

def myfunction():
	x = 3
	return x
# 함수 내부의 코드를 작성할 때는 반드시 들여쓰기를 확인해주세요!

만약에 함수를 정의하는 코드를 작성하였는데 에러가 난다면 

위의 2가지를 확인해보세요!

 

다양하게 함수를 정의하기

  • 반환 값(return)이 없는 경우
# 반환값이 없는 경우
def my_function1(x):
	result = x + 10

# 반환값이 있는 경우
def my_function2(x):
	result = x + 10
	return result

# 결과를 받아옴
result1 = my_function1(3)
result2 = my_function2(3)
print("my_function1(3)의 결과는 :", result1)
print("my_function2(3)의 결과는 :", result2)
my_function1(3)의 결과는 : None
my_function2(3)의 결과는 : 13

return 이 없으면 반환 값이 없는 함수로 정의한 것 입니다. 

Python에서는 값이 없다(값의 부재)는 의미None이라는 값을 사용해요!

 

  • 자료형 표시하기

함수의 입력(매개 변수들)이나 반환(return)값이 특정 type이 아니면, 오류가 나는 경우가 있을 수도 있겠죠? 

def my_function(x):
	# 내부에서 int(정수형) 타입이 아니면 에러나는 경우가 존재
	result = x + 10
	# '안녕하세요 문자열입니다.' + 10 => TypeError가 난다!
	return result

# 문자열로 입력하면 에러가 남!
# my_function('안녕하세요 문자열입니다.')

# int(정수형)으로 입력하면 에러가 안남!
# my_function(10)

특히 2명이 협업할 때, 한 명은 코드를 작성하고 한 명은 실행만 한다면 주석(#)으로 적어 놓을 수도 있지만, 함수 자체에 표기해 놓을 수 있습니다. 

def my_function(x: int):
	# 이 함수를 실행만 하는 사람에게 알리기 위해
	# 매개변수 값에 type 을 명시할 수 있음
	result = x + 10
	return result

def my_function(x: int) -> int:
	# 반환(return) 타입을 명시할 수도 있음
	result = x + 10
	return result

# 실행해볼까요?
print(my_function(2))
# 12

 

  • 함수의 초기 값 지정

만약 함수의 입력 값으로 특정한 매개변수가 입력될 때도 있고 안들어올 때도 있다면 어떻게 해야할까요?

이때 초기값을 설정하여 값이 입력되지 않을 때, 대신할 값을 정의하여 사용할 수 있습니다.

# 기본 초기 값 지정
def my_function(x, y = 2):
	# y값의 기본 값을 (default) 2로 지정함
	result = x+y
	return result

# y 값을 입력하지 않으면 default값인 y = 2 로 대입된다.
# x = 3, y = 2
print("my_function(3) ==> ", my_function(3))
# y 값을 직접 입력 가능하다.
# x = 2, y = 10
print("my_function(2,10) ==> ", my_function(2,10))
my_function(3) ==> 5
my_function(2,10) ==> 12

 

  • 함수 내부에 함수를 정의하기

다른 함수에서는 사용하지 않고, 특정 함수 내에서만 사용하고 싶은 함수가 있나요? 

이럴때 내부함수를 정의하여 사용할 수 있습니다 :)

def my_function(x: int) -> int:
	# 함수 내부에서 사용하는 함수를 선언하는 것이 가능
	def inner(i):
		# 들여쓰기 조심!
		return i + 10
	result = inner(x) + inner(x)
	return result

# 실행해볼까요?
print(my_function(2))
# 24

 

  • 함수에서의 명명규칙 (가독성을 위한 함수명 표기법)

변수명 또는 함수명을 지을 때, 대표적으로 2가지 방식을 사용하여 표기합니다.

 

1. 카멜 케이스 (camel case)
대표적으로 Java 같은 경우는 아래와 같이 변수명 또는 함수명을 작성합니다.

  • 첫번째 단어는 '소문자'
  • 두번째 단어첫 글자 '대문자' (이후의 단어들은 동일함)

예시) get 가져오다 sample 샘플 -> getSample()

public void myFunction(String x) {
	System.out.println(x);
}

2. 스네이크 케이스(Snake Case)

대표적으로 C언어 , Python 같은 경우는 아래와 같이 변수명 또는 함수명을 작성합니다.

  • 각 단어마다 _ 표시를 사용하여 구분짓는다.

예시) get 가져오다 sample 샘플 -> get_sample()

def my_function(x):
	print(x)

 

  • 매개변수가 원시자료형일때와 참조형일때

이 부분은 조금 어려워하실 수도 있는데요

C언어를 경험하셨다면 참조형과 원시자료형의 차이를 이해하실 수 있을텐데 Python 에서는 pointer 같은 개념을 다루기에는 조금 이를 수 있습니다. 

이해안되시면 천천히 이해해보세요!

  • 원시자료형일 때는? 
    아래처럼 함수에서 매개변수의 값을 바꿔도 바뀌지가 않습니다.
def my_function(x):
	x = x + 2
	return x

a = 3
print("함수에 넣기 전의 변수 a의 값은 : ", a)
my_function(a)
print("함수에 넣은 후의 변수 a의 값은 : ", a)
함수에 넣기 전의 변수 a의 값은 : 3
함수에 넣은 후의 변수 a의 값은 : 3

 

  • 참조형일 때는? 
    아래처럼 함수에서 매개변수의 값을 바꾸면 값이 바뀝니다.
def my_function(x):
	x.append(6)
	x.append(7)
	return x

a = [3,4,5]
print("함수에 넣기 전의 변수 a의 값은 : ", a)
my_function(a)
print("함수에 넣은 후의 변수 a의 값은 : ", a)
함수에 넣기 전의 변수 a의 값은 : [3, 4, 5]
함수에 넣은 후의 변수 a의 값은 : [3, 4, 5, 6, 7]

 

신기하죠?

왜 이런 현상이 나타날까요?

함수는 원시자료형이 매개변수로 주어졌을 때, 값을 복사하게 됩니다.

하지만 이외의 경우에는 참조값을 가져오게 되기 때문에, 직접적으로 그 정보에 영향을 미치게 되기 때문입니다.

원시 자료형이 아닌 모든 자료형은 참조 자료형입니다.
참조자료형은 메모리에 실질적으로 저장되어있는 객체라고 생각하시면 되고, 그 메모리의 주소정보로 직접적으로 영향을 줄수 있게 됩니다.

이런 부분에 대해 정말 자세히 알고 싶으시면, C언어에서 Pointer 개념을 이해해보시면 많은 도움이 되실꺼에요 :)

 


이제 실습해볼까요?

 

실습 문제

임의의 과일 리스트하나의 과일 이름이 주어집니다.

이때, 주어진 과일 이름과일 리스트에 몇 개 담겨있는지를 구하는 함수를 작성하세요.

💻 입력

첫 번째 줄에는 과일 이름들이 나열되어 있고

두 번째 줄에는 개수를 세야 하는 과일의 이름이 주어집니다.

🖨️ 출력

주어진 과일 이름이 과일 리스트에 몇 개 담겨있는지 출력합니다.


💻 예제 입력 1
사과,딸기,바나나,포도,사과,딸기,포도,사과,딸기,바나나
사과
🖨️ 예제 출력 1
3

출처: 돌핀 코딩