본문 바로가기
Python

[Python 기초] 함수 (Function)

by Air’s Big Data 2020. 4. 23.

 

 

함수란?

 

 

함수는 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것이다.

프로그래밍에서는 함수를 이용해 실행 과정을 약속할 수 있다.

 

 

함수를 사용하는 이유

반복적으로 사용되는 가치 있는 부분을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 결괏값을 돌려주기 위해 함수를 사용한다. 즉, 자주 사용되는 코드를 함수로 정의해 두면, 그 뒤로는 동일한 코드를 함수 이름만으로 실행시킬 수 있다.

 

파이썬 함수의 구조

def 함수이름(매개변수):   # 첫 행
    본문          # 함수를 호출했을 때 실행할 코드 블록

def는 함수를 만들 때 사용하는 예약어이며,  함수 이름 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다. 

 

(예시) 

>>> def add(a, b):       #add는 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값
...    return a + b     #return : 함수의 결괏값을 돌려주는 명령어

 

 

>>> a = 3
>>> b = 4
>>> c = add(a, b)
>>> print(c)
7

 


 

매개변수 vs 인수

매개변수: 함수에 입력으로 전달된 값을 받는 변수

인수: 함수를 호출할 때 전달하는 입력값

def add(a, b):  # a, b는 매개변수
    return a+b

print(add(3, 4))  # 3, 4는 인수

 

 


 

입력값과 결괏값에 따른 함수의 형태

일반적인 함수 : 입력값과 결괏값이 있는 함수

결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)

def 함수이름(매개변수):
    <수행할 문장>
    ...
    return 결과값 #입력값이 있고 결괏값이 있는 함수가 일반적인 함수

(예시)

def add(a, b): 
    result = a + b 
    return result
>>> a = add(3, 4)
>>> print(a)
7

 

입력값이 없는 함수

- 결괏값을 받을 변수 = 함수이름()

- 'return 결과값'은 있으나 함수 이름 뒤 '입력 인수' 가 없다.

>>> def say(): 
...     return 'Hi' 
>>> a = say()
>>> print(a)
Hi

 

 

 

결괏값이 없는 함수

- 함수이름(입력인수1, 입력인수2, ...)

- 함수 이름 뒤 '입력 인수' 는 있으나 'return 결과값'은 없다.

>>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))

%d는 뒤따르는 ‘%변수’의 변수값으로 바꾸어 준다. 두 개 이상을 출력하려면 다음과 같이 괄호로 묶어주면 된다. (괄호로 묶인 자료 집합을 튜플이라고 한다.)

>>> add(3, 4)
3, 4의 합은 7입니다.
>>> a = add(3, 4)
>>> print(a)
None   #돌려받을 값을 a 변수에 대입하여 출력해 보면 결괏값이 있는지 없는지 알 수 있다.

- 여기서 pint는 <수행할 문장>에 해당하는 부분일 뿐이다.

 

 

입력값도 결괏값도 없는 함수

함수이름()

>>> def say(): 
...     print('Hi')
>>> say()
Hi

 

매개변수 지정하여 호출하기 

 

-함수를 호출할 때 매개변수를 지정할 수도 있다. 💻

>>> def add(a, b):
...     return a+b
>>> result = add(a=3, b=7)  # a에 3, b에 7을 전달
>>> print(result)
10
>>> result = add(b=5, a=3)  # b에 5, a에 3을 전달, 순서와 상관 없이 사용 가능
>>> print(result)
8

 

 


 

입력값이 몇 개가 될지 모를 때

 

def 함수이름(*매개변수): 
    <수행할 문장>
    ...

 

여러 개의 입력값을 받는 함수 만들기 💻

*매개변수 : *을 붙임으로써 여러개의 여러 개의 입력값을 받을 수 있다.

>>> def add_many(*args): #args는 매개변수(arguments)라는 뜻이며 관례적으로 자주 사용
...     result = 0 
...     for i in args: 
...         result = result + i #여러 개의 입력값을 모두 더하는 함수
...     return result 
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55

 

- 함수(매개변수, *매개변수) 형태도 가능 💻

>>> def add_mul(choice, *args): 
...     if choice == "add": 
...         result = 0 
...         for i in args: 
...             result = result + i #입력되는 모든 값을 더함
...     elif choice == "mul": 
...         result = 1 
...         for i in args: 
...             result = result * i #입력되는 모든 값을 곱합
...     return result 
>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

 

키워드 파라미터 kwargs

**매개변수 : 딕셔너리로 만들어져서 출력 

>>> def print_kwargs(**kwargs):
...     print(kwargs)
>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}

 


 

함수의 결괏값 특성

- 함수의 결괏값은 언제나 하나이다! 💻

>>> def add_and_mul(a,b): #add_and_mul 함수는 2개의 입력 인수를 받아 더한 값과 곱한 값을 돌려주는 함수
...     return a+b, a*b
>>> result = add_and_mul(3,4)
result = (7, 12) #결괏값으로 (7, 12)라는 튜플 값을 갖게 된다.

 

>>> result1, result2 = add_and_mul(3, 4)
result1, result2 = (7, 12)

 

- 결과값은 하나이기 때문에 return을 두 번 입력할 경우 첫 번째 return만 실행한다. 즉, 함수는 return문을 만나는 순간 결괏값을 돌려준 다음 함수를 빠져나가게 된다. 💻

>>> def add_and_mul(a,b): 
...     return a+b 
...     return a*b 
>>> result = add_and_mul(2, 3)
>>> print(result)
5

 

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

def say_myself(name, old, man=True):  #man=True: 초깃값 설정, 초기화시키고 싶은 매개변수를 항상 뒤쪽에 위치
    print("나의 이름은 %s 입니다." % name)
    print("나이는 %d살입니다." % old) 
    if man: 
        print("남자입니다.") #마지막 인수인 man이 True이면 "남자입니다.", False이면 "여자입니다."를 출력
    else: 
        print("여자입니다.")
say_myself("Oggy", 29, False)
나의 이름은 Oggy입니다.
나이는 29살입니다.
여자입니다.

 

 

lambda

- lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할 수행

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

- def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.

- lambda 예약어로 만든 함수는 return 명령어가 없어도 결괏값을 돌려준다.

>>> def hap(x, y):
...   return x + y
...
>>> hap(10, 20)
30
>>> (lambda x,y: x + y)(10, 20)
30

map()

- map(함수, 리스트)

- map 함수는 리스트에서 원소를 하나씩 꺼내서 함수를 적용시킨 결과를 새로운 리스트에 담아준다.

>>> list(map(lambda x: x ** 2, range(5))) #x ** 2는 x 값을 제곱 
[0, 1, 4, 9, 16]   #range(5)는 [0, 1, 2, 3, 4]라는 리스트를 돌려줌.

 

 

질문


 

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

- 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않는다.

a = 1
def vartest(a): #매개변수 a는 함수 안에서만 사용하는 변수이며, 함수 밖의 변수 a가 아니다.
    a = a +1

vartest(a)
print(a) #1로 출력
def vartest(a):
    a = a + 1

vartest(3)
print(a) #print(a)에서 입력받아야 하는 a 변수를 찾을 수가 없기 때문에 오류 발생



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

return 사용

a = 1 
def vartest(a): #vartest 함수는 입력으로 들어온 값에 1을 더한값을 돌려준다. 
    a = a +1 
    return a

a = vartest(a) #a가 vartest 함수의 결괏값으로 바뀐다.
print(a)

global 명령어 사용하기 

- 함수는 독립적으로 존재하는 것이 좋기 때문에 global 명령어는 비추천

a = 1 
def vartest(): 
    global a  #함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻
    a = a+1

vartest() 
print(a)

 

 


 

댓글