이번에는 함수에 대해 알아보도록 하자.
함수는 아마 많이 보았을거다.
y = x+1이라는 식이 있으면
x=1일때 y가 2가 된다는 것.
파이썬에서도 비슷하게 우리가 값(x)을 주면 그 결과값(y)을 반환해주는 함수가 존재한다.
함수의 경우, 우리가 직접 만들수도 있지만
파이썬에서 기본적으로 제공하는 함수, 내장함수가 존재하는데,
먼저 내장함수의 대표적인(?) 예시들을 살펴보고자 한다.
print(abs(-1)) #abs(a) a의 절댓값
print(pow(3,2)) #pow(a,b) a의 b제곱
print(round(4.3)) #round(a) a를 반올림
print(int(34.44)) #int(a) a값을 정수로 변환
print(float(21)) #float(a) a값을 실수로 변환
print(str(1)) #str(a) a값을 문자열로 변환
한 번 실행해보자.
잘 되는 것 같다. 그런데 마지막 str(1)의 경우 진짜 문자열이 맞는지 의심이 든다.
그럼 한번 확인해보자. 확인하기 위한 코드는 간단하다.
print(str(1)+1)
맨 처음에 말했지만 type이 다르면 더해지지 않고 오류가 발생할 것이다.
(만일 type이 같다면 2라는 값이 출력되야 한다.)
Type에러가 뜨는 걸보아 문자열이 맞다.
이 밖에도 여러 유용한 내장함수들이 있는데 시간과 분량상 공식 사이트를 확인해보기 바란다.
https://docs.python.org/ko/3/library/functions.html#round
자 그렇다면 이제 나만의 함수를 만들어보자.
형식은 다음과 같다.
def 함수이름(입력받을 내용):
코드
.
.
.
return 반환할 값
함수 역시 매우 중요하다고 생각되므로 긴설명이 될지도 모르겠다.
우선 함수이름을 지을때는 파이썬내에 이미 존재하는, 쉽게 말해서 모두가 약속한 코드를 함수이름으로 해서는 안된다.
예를 들어 위에서 배운 abs나 int를 한다거나 나중에 배울 조건문 문법인 if를 사용해서는 안된다. 만일 그럴경우 오류가 발생하게 된다. 모두가 약속한 코드를 예약어라고 하는데 흔히 쓰이는 것들은 다음과 같다.
and, del, from, not, while, as, elif, global, or, with, assert, else, if,
break, except, import, print, class, exec, in, raise, continue, finally,
pass, yield, def, for, lambda, try, is, return
다음으로 입력받을 내용은 없을 수도 있고, 하나만 있을 수도 있고, 혹은 여러개가 있을 수도 있다.
아주 간단한 함수를 만들어보겠다.
a=1
def plus():
global a
a = a + 1
def sub():
a = a-1
print(a)
plus()
print(a)
간단히 설명하자면 a변수에 1을 집어넣고 plus함수는 a에 1을 더하고 sub함수는 1을 빼는 함수를 만들고 싶은 상황이다.
그래서 처음값을 확인하기 위해
a를 출력한다.
그 다음 함수를 호출하려고 한다. 함수를 호출할때는 함수를 선언한 형식을 생각해주면 된다. plus와 sub는 입력할 내용이 없으므로 그냥 plus()라고 적으면 된다. 그래서 적었다.
그다음 a를 출력한다. 어떻게 되었는가?
예상대로 2가 나왔다. 그럼 이번에는 sub()만 해볼까?
a=1
def plus():
global a
a = a + 1
def sub():
a = a-1
print(a)
sub()
print(a)
지체없이 실행해보자.
어라? 오류가 생겼다.
여기서 지역변수와 전역변수에대해 알아야한다.
전역변수는 코드내에서 언제든 부를 수 있는 변수다.
지역변수는 해당지역. 그러니까 그 함수안에서만 부를 수 있는 변수다.
위 코드에서는 sub()라는 함수를 에서 a는 이미 존재하기 때문에 지역변수로 할 수 없는 것이다.
그럼 plus()가 오류가 안생긴 이유는 뭘까? 바로 global이란 코드 때문이다.
global뒤에 변수를 적으면 그 변수는 함수내에서 지역변수가 아닌 전역변수로 사용된다.
따라서 기존에 a를 그대로 사용할 수 있게된 것이다.
그러면 global외에 방법이 없는 걸까?
물론 아니다. return혹은 print를 사용하면 global없이 충분히 할 수 있다.
두가지 예시를 보여주겠다.
1번.
a=1
def plus():
global a
a = a + 1
def sub():
a = a-1
print(a)
print(a)
sub()
2번.
a=1
def plus():
global a
a = a + 1
def sub():
b = a-1
return b
print(a)
print(sub())
1번의 경우 함수 안에서 그결과를 바로 출력해주므로 이전과 달리 print(a)를 해줄 필요가 없게 되었고, 빼기도 잘된다!
2번의 경우 b라는 변수에 a-1이라는 값을 집어넣고 return b를 해준다음 sub()라는 함수를 출력했다!
출력한 결과를 확인해보면 둘다 0이다.
하지만 1에서 print(sub())를 하면
아까와 같은 에러가 뜬다.
이유는 위에서 말한것과 동일하다.
2번에서 print(b)를 해볼까?
정의되지 않았다는 오류가 뜬다. 이유는 앞서말했듯 지역변수는 함수내에서만 존재하므로 밖에서는 print될 수 없다.
그렇다면 return은 무엇일까?
return은 반환값이라고 한다.
2번에서 return b를 해주었는데 이는 b를 반환한다는 의미다.
무슨 말이냐면 이 함수를 호출하면 그 결과 값으로 b를 반환한다는 것이다.
마치 y=x+1에서
x=1일때 y는 자동으로 2가 되듯이 a가 1인 상태에서 sub()라는 함수를 호출하면 자동으로 그안의 코드 b= a-1을 통해 b=0이 되고 그 값을 return 하며 0이란 값을 반환한다는 것이다.
그래서 함수를 출력했을 때 0이 나온 것이다.
만약 함수에 return 값이 없다면 자동으로 None이 된다.
함수내에서 변수는 지역변수이므로 이를 전역변수로 바꾸는 등의 행위를 하고자 한다면
return 값이 필수라는 것을 기억하자.
'[파이썬]Python > 기초 문법' 카테고리의 다른 글
[파이썬] .py 파일 합치기 import 사용법 (0) | 2023.03.28 |
---|---|
[Studying Python 4] 문자열 / String (0) | 2020.07.18 |
[Studying Python 2] 변수 / Variables (0) | 2020.07.13 |
[Studying Python 1] 출력 /print (0) | 2020.07.10 |
[Studying Python] 주피터노트북 /아나콘다 설치 (0) | 2020.07.08 |