실행 시간 제한 | 메모리 제한 |
---|---|
1 초 | 10 MB |
이번 시간에는 Python 에서의 함수에 대해 좀 더 자세하게 알아볼 거에요 :)
먼저 함수를 정의할 때, 실수하기 쉬운 경우들 입니다.
함수를 정의할 때 흔히 실수하는 오타
def myfunction()
# 위의 선언문은 에러 발생!
def myfunction():
# :를 적었는지 확인하세요!
def myfunction():
x = 3
return x
# 위의 선언문은 에러 발생!
def myfunction():
x = 3
return x
# 함수 내부의 코드를 작성할 때는 반드시 들여쓰기를 확인해주세요!
만약에 함수를 정의하는 코드를 작성하였는데 에러가 난다면
위의 2가지를 확인해보세요!
다양하게 함수를 정의하기
# 반환값이 없는 경우
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 개념을 이해해보시면 많은 도움이 되실꺼에요 :)
이제 실습해볼까요?
실습 문제
임의의 과일 리스트와 하나의 과일 이름이 주어집니다.
이때, 주어진 과일 이름이 과일 리스트에 몇 개 담겨있는지를 구하는 함수를 작성하세요.
첫 번째 줄에는 과일 이름들이 나열되어 있고
두 번째 줄에는 개수를 세야 하는 과일의 이름이 주어집니다.
주어진 과일 이름이 과일 리스트에 몇 개 담겨있는지 출력합니다.
사과,딸기,바나나,포도,사과,딸기,포도,사과,딸기,바나나 사과
3
출처: 돌핀 코딩