세조목

PYTHON 정리(점프투파이썬 - 함수 리턴값은 언제나 하나, 매개변수 초깃값 설정, 함수 內 선언한 변수의 효력 범위, 함수 안에서 함수 밖의 변수를 변경하는 방법(return, lambda))(24.01.05) 본문

데이터 분석 공부/Python

PYTHON 정리(점프투파이썬 - 함수 리턴값은 언제나 하나, 매개변수 초깃값 설정, 함수 內 선언한 변수의 효력 범위, 함수 안에서 함수 밖의 변수를 변경하는 방법(return, lambda))(24.01.05)

세조목 2024. 1. 5. 16:19
  • 본 내용들은 PYTHON을 공부하면서 차후 제가 복습하기위해 정리해놓은 것으로 제가 새롭게 알게된 내용들만을 정리하였습니다. 또한 배움이 부족하여 미처 다 파악하지 못한 부분들도 많으니 혹시나 이 포스팅을 보시는 분들께서는 다른 포스팅, 도서, 강의도 함께 참고하시기 바라겠습니다.

함수의 return값

1. reuturn값이 두 개라면 어떻게 출력될까?

def food(a, b):
	return a-b, a/b

위와같은 함수가 있다고 가정했을때

return 값에 두 개의 산식이 들어가있다면 어떻게 출력될까?

def food(a, b):
	return a-b, a/b
    
result = food(5, 2)
print(result)
>>> (3, 2.5)

두 개의 산식에따른 값이 출력되긴하나 튜플로 묶여서 출력된다.

튜플로 묶인 이유함수는 언제나 하나의 값만 return할 수 있기때문이다.

 

만약 a-b, a/b 로 나눠서 반환받고싶다면

result1, result2 = food(5,2)

로 입력해줘야한다.

그렇게 했을때 print(result1)을 입력하면 3이,

print(result2)를 입력하면 2.5

가 출력된다.

print(result1, result2)를 입력하면 3 2.5 가 출력될 것이다.

 

2. 두 개 이상의 return

지금까지는 하나의 return에 두 개 이상의 산식을 적어줬는데

하나의 return에 하나의 산식만 적어주고, return의 개수를 늘리는 경우에는 어떻게 출력될까?

예시는 다음과 같다.

def food(a, b):
	return a-b
        return a/b

result = food(5, 2)
print(result)
>>> 3

a/b의 값은 출력되지 않는다.

함수는 return문을 만나는 순간, 리턴값을 반환한 후 다음 함수를 빠져나가게끔 되어있기때문이다.

 

3. 함수 빠져나가기(reuturn값 비워두기)

return을 단독으로 사용하는(=비워두는) 방식으로 함수를 즉시 빠져나갈 수 있다.

def student_name(name): 
     if name == "camry": 
         return 
     print("나의 이름은 %s 입니다." % name)

이렇게 쿼리가 적혀있다고 가정해보자.

'나의 이름은 camry입니다.' 라고 반환될까?

그렇지 않다.

이 경우 반환되는 값이 없다.

코드에서 확인할 수 있는 것처럼 return 값이 비어있기 때문이다.

 

하지만 camry가 아닌 다른 이름을 인자로 넣어준다면

'나의 이름은 ~~ 입니다.' 가 출력된다.

def student_name(name): 
     if name == "camry": 
         return 
     print("나의 이름은 %s 입니다." % name)
     
student_name('camry')
>>>

student_name('white')
>>> '나의 이름은 white입니다.'

 

4. 매개변수에 초깃값 미리 설정하기

함수의 매개변수에 초깃값을 미리 설정할 수 있다

def say_myself(name, age, man=True): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % age) 
    if man: 
        print("남자입니다.")
    else: 
        print("여자입니다.")

위와 같이 말이다.

 

그래서

say_myself('이정희', 28)

을 입력하든

say_myself('이정희', 28, True)

를 입력하든 값은 동일하게

>>> '나의 이름은 이정희입니다.'
>>> '나이는 28살입니다.'
>>> '남자입니다.'

가 출력된다.

 

say_myself함수 세번째 인자에 False를 넣는다면 값이 어떻게 나올까?

>>> '나의 이름은 이정희입니다.'
>>> '나이는 28살입니다.'
>>> '여자입니다.'

초깃값으로 man=True 를 입력해놨기때문에 False를 입력하면 '여자'가 출력된다.

if문에서 man이 아니라면(=True가 아니라면) '여자'라고 출력되게끔 적어놨기때문이다.

 

그런데 여기서 유의해야할 점이 하나 있다.

바로 매개변수의 위치를 바꾸면 오류가 뜬다는 것이다.

def say_myself(name, man=True, age): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % age) 
    if man: 
        print("남자입니다.")
    else: 
        print("여자입니다.")

age와 man=True 두 개의 매개변수 위치가 변경되었다.

이렇게 함수를 등록해놓은 상태에서

say_myself('이정희', 28, True)

를 입력하면 아래와같은 오류 메시지가 출력된다.

SyntaxError: non-default argument follows default argument

'초깃값이 없는 매개변수(age)는 초깃값이 있는 매개변수(man) 뒤에 사용할 수 없다'는 뜻이므로

매개변수에 초깃값을 설정하고싶을때는 항상 가장 뒤쪽에 위치시키자

 

5. 함수 안에서 선언한 변수의 효력 범위

a = 3

def solution(a):
	a+=1
    
solution(a)
print(a)

이렇게 함수를 입력했을때 결과값은 어떻게 될까?

3? 4?

정답은 3이다.

'1을 더하는 함수인데 왜 3이 아닌 4가 나온다는 거지?'

함수 안에서 사용하는 매개변수는 함수 안에서만 효력을 미치기때문이다.

 ※ 함수에서 a+1 다음절에 print(a)를 넣어주면 4가 출력되긴한다.

 

def solution(a):
	a+=1
    
solution(4)
print(a)

위와 같이 함수를 만들어준다면 어떤 값이 출력될까?

NameError: name 'a' is not defined

위와 같은 오류 메시지가 뜨는데 변수 a를 지정하지 않았다는 말이다.

a에 숫자 4가 들어가서 1이 더해진 숫자 5가 함수 내에서는 만들어지지만

함수 내에서 print(a)를 적어주지 않았기때문에 출력되는 값은 없게된다.

함수 바깥에서 print(a)를 하려고해도 a라는 변수가 없기때문에

오류 메시지가 뜨게 되는 것이다.

 

6. 함수 안에서 함수 밖의 변수를 변경하는 방법

함수 안에서 함수 밖의 변수를 변경하는 방법의 크게 두 가지 정도가 있다.

  •  점프투파이썬에서는 총 세 가지의 방법을 소개했으며 그 중 하나가 global 명령어인데 저자의 말에따르면 global 함수를 사용하게 되면 외부 변수에 종속되기때문에 가급적이면 사용을 지양하라고 한다. 그래서 금번 학습시에 global 명령어 관련 내용은 포함시키지 않았다. 

첫번째 방법은 return을 사용하는 것이다.

a = 3
def example(a): 
    a = a +5 
    return a

a = example(a) 
print(a)
>>> 8

 

위의 코드에서 확인할 수 있는것처럼 example함수에 return 값을 넣어주고,

함수 바깥에서 변수 a가 example을 가리키도록 한다면

숫자 8이 출력된다.

 

두번째 방법은 lambda 예약어를 사용하는 것이다.

lambda 예약어는 보통 함수를 한 줄로 간결하게 만들 때 사용하며

함수를 사용해야 할 정도로 복잡하지 않거나

함수를 사용할 수 없는 곳에 주로 쓰인다.

lambda 예약어의 구조는 아래와 같다.

함수 이름 = lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 표현식

 

lambda 예약어를 사용하여 간단한 예시를 한 번 만들어 보자.

multiple = lambda a, b : a*b
result = multiple(5, 7)
print(result)
>>> 35

lambda예약어의 경우 return 명령어가 없어도 결과값을 반환한다.