예상 대진표 문제를 풀이하다가 만나게 된 문제, 정확히 알지 못해서 기본적인 개념이지만 정확하게 정리해두려고 한다.
파이썬에서 함수가 return문이 없어도 되고, 없으면 리턴 없이 끝나는 줄 알았다.
알고보니 아니었음 .. 암튼 return문이 없으면 자동으로 return None을 하게 된다.
def dfs():
if 재귀 종료 조건:
return cnt
dfs()
이러한 함수가 있다고 하면, 나는 이런 트리 동작을 생각했다.
근데 이게 아니라 이거였다.
재귀가 종료되면, 해당 재귀에서 cnt를 리턴하고 해당 함수는 종료된다. 그리고, 해결되지 않은 나머지 함수에서는 자동으로 None을 리턴한다.
그렇다.. 아무튼 난 몰랐던 것 ...
따라서 내가 풀었던 문제에서는 global변수로 cnt를 선언하고, 함수에서는 해당 변수를 재할당 한뒤, return None인 방식으로 동작하는 것이 맞다.
사실 함수에 global변수를 사용하는 것은 좋지 않으나, 코딩테스트에서는 사용해도 무관한 것 같다.
함수 정의를 할때 명시적으로 None을 리턴해줘야 하는 경우가 있다.
기본적으로는 하단의 3가지 경우에 자동으로 None을 리턴한다.
def return_case_1():
return
def return_case_2():
return None
def return_case_3():
test_a = 1
여기서 구분해야 하는 경우가 있다.
~가 아닌경우이다. 예를들어 다음과 같은 경우이다.
목적으로 하는 대상이 아닌경우에는 명시적으로 None값을 리턴해줘야 한다.
TESTS = {"test1", "test2"}
def get_test(test):
if test in TESTS:
return test
return None
if __name__ == "__main__":
if get_test("test1") is not None:
print("테스트 입니다.")
else:
print("None입니다. ")
early return의 경우 많이 사용한다. 맥락 상 break와 유사한 효과를 내기 때문에, 무언가를 리턴하기 보다는 실행 중단의 의미가 더 크다.
함수가 무언가를 반환하는게 목적이 아닌, 단순 연산의 목적일 경우이다.
연산이 끝난 후 연산 성공이나 실패를 반환해야 한다면 달라지겠지만, 그게 아니라 단순히 글로벌 변수 연산이 목적이라면, 사용하지 않는 경우가 있다.
def dfs():
if 재귀 종료 조건:
return cnt
return dfs() -> 이렇게 해줘야 된다.
그래야 다음의 그림처럼 실행된다.
감사합니다. 덕분에 재귀함수 리턴 오류 바로잡았네요 ㅜㅜ!!