함수란?
함수는 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것이다.
프로그래밍에서는 함수를 이용해 실행 과정을 약속할 수 있다.
함수를 사용하는 이유
반복적으로 사용되는 가치 있는 부분을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 결괏값을 돌려주기 위해 함수를 사용한다. 즉, 자주 사용되는 코드를 함수로 정의해 두면, 그 뒤로는 동일한 코드를 함수 이름만으로 실행시킬 수 있다.
파이썬 함수의 구조
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)
'Python' 카테고리의 다른 글
[Python 기초] 크롤링 실습 - 텔레그램 봇 만들기 (0) | 2020.05.30 |
---|---|
[Python 기초] 크롤링 실습 - 네이버 뉴스 기사 크롤링하기 (0) | 2020.05.23 |
[Python 기초] 프로그래밍 시작하기 (0) | 2020.05.16 |
[Python 기초] 클래스 (Class) (0) | 2020.04.06 |
[Python 기초] 문자열 (String) (0) | 2020.03.22 |
댓글