python을 활용한 함수생성 및 활용에 대해 정리합니다.
개요
- python의 주요 기능인 함수의 개념과 활용방법에 대한 내용을 정리합니다.
함수?
-
지금까지 정리하면서 사용한 다양한 함수들이 있었다.
-
len 이나 range같은 것들이 대부분
-
함수란 간단히 말해 주어진 입력(input)에 대해서 의도된 출력(output)를 전달하는 기능이다.
e.g)
range 함수는 정수를 입력으로 전달하면 (0, 정수) 로 이루어진 리스트를 생성하는 역할
sum 함수는 리스트, 튜플등을 입력으로 전달하면 전체 아이템의 합을 출력으로 전달하는 역할
len 함수는 리스트, 튜플등을 입력으로 전달하면 아이템의 개수를 출력으로 전달하는 역할
-
그리고, 위의 함수들은 모두 python 내부에 이미 정의(구현)이 되어 있는 것이다.
-
위와 같은 함수를 내장함수(built-in function)이라고 한다.
1
2
3
4
5
6
7
# 내장 함수의 예
a = [1, 2, 3, 4]
length = len(a)
print("The length of feature a is {}".format(length))
summation = sum(a)
print("Then sum of feature a's all of values is {}".format(summation))
The length of feature a is 4 Then sum of feature a's all of values is 10
함수의 정의
-
정의 시 최초에 def 키워드 사용
-
argument 정의 (함수에 입력으로 전달하는 값을 의미, argument 또는 parameter라고 함)
-
: (콜론) -> 함수 역시 코드 블록이기 때문에 콜론(:)이 반드시 필요
-
body (함수의 구현 부분, 함수 역시 코드 블록이기 때문에 들여쓰기 된 부분까지 함수의 코드블록으로 인지 함)
-
함수를 호출한 코드 (caller)로 함수가 해당 기능을 수행하고 완료된 값(output)을 전달하기 위해 return 키워드 사용
-
즉, return 이후에 오는 값을 caller로 전달
-
-
Tip) 함수의 네이밍을 잘 하는 것이 중요
-
즉, 어떤 기능을 하는 함수인지 이름으로 최대한 나타날 수 있게 해야함
-
e.g) get_a (x) get_student_name (o)
-
1
2
3
def add(x, y):
n = x + y
return n
1
2
3
4
l = 3
c = add(30, 300)
print(c)
330
함수의 사용(호출)
-
함수명(파라미터1, 파라미터2, … 파라미터n) 와 같은 식으로 정의한다.
-
위와 같이 정의 된 함수의 이름과 전달되는 parameter(인자)를 괄호안에 전달하여 함수를 호출한다.
-
함수가 호출되면 실행의 흐름이 호출자(caller)에서 함수(callee)로 변경 된다.
-
함수의 입력(input) 파라미터(parameter), 아규먼트(argument)라고 표현한다.
1
2
3
# 미리 만든 함수를 활용해 변수선언을 할 수도 있다.
c = add(30, 40)
print(c)
70
함수 네이밍(naming)
-
함수 이름으로부터 기능이 명시 되도록 하는 것이 좋다.
-
의미와 반대되거나 맞지 않는 이름은 사용하면 사용하기가 헷갈리고, 코드를 보는 제 3자가 이해하기도 어렵다.
1
2
3
4
5
def substract(x, y):
sub = x - y
return sub
print(substract(4, 3))
1
parameter(argument) (인자)
-
함수에 전달되는 입력(input)을 의미
-
입력이 필요하지 않을 수도, 1개의 입력만 있을 수도, 여러개의 입력이 존재할 수 도 있다.
-
파라미터로 int, string, float, boolm, list, dict 등 어떤 파이썬 객체든 가능하다.
-
함수도 함수의 파라미터로 전달 가능하다.
-
python의 경우, 타입 명시가 없기 때문에, 함수 생성 시, 의도된 파라미터의 타입에 맞게 입력을 전달하는 것이 중요하다.
-
또한 파라미터를 전달 할 때, 정의된 순서에 따라 값을 전달하는 것이 중요하다.
1
2
3
4
5
6
def substract(x, y):
sub = x - y
return sub
a = substract(100, 70)
print(a)
30
Default parameter (기본 인자)
-
함수의 파라미터에 기본값 지정 가능하다.
-
파라미터를 명시하지 않을 경우, 지정된 기본값으로 대체된다.
1
2
3
4
5
def add(x, y=10, z=5):
a = x + y + z
return a
add(10, 1, 2)
13
기본 파라미터의 다른 예
-
print 함수
- sep, end, file등 여러 기본 파라미터를 가짐
1
2
print(1, 2, 3, sep='!', end='%%%') # 각 값을 ! 기준으로 seperate 하고 end는 %%%를 붙인다.
print(2, 3, 4, sep='p')
1!2!3%%%2p3p4
Default parameter 사용 시 주의 점
- 디폴트 파라미터 뒤에 일반 파라미터가 위치할 수 없다.
-
e.g) 올바른 예
def test(a, b, c = 1)
def test(a, b = 1, c = 2)
def test(a = 1, b = 1, c = 3)
-
e.g) 올바르지 않은 예
def test(a, b = 1, c)
def test(a = 1, b, c)
def test(a = 1, b = 1, c)
1
2
3
4
5
6
# 디폴트 파라미터 뒤에 일반 파라미터가 위치할 수 없다.
def test(a, b=3, c):
print(a, b, c)
test(10, 20, 1)
keyword parameter (키워드 파라미터)
-
파이썬의 경우, 파라미터에 값을 전달 할 때, 파라미터의 이름을 명시하여 전달 가능하다.
-
파라미터 이름을 사용하지 않을 경우, 기본적으로 순서에 맞게 전달한다.
1
2
3
4
5
6
def test(x, y, z):
a = x + y + z
return a
# 파라미터의 이름을 명시하여 전달
test(x=10, y=50, z=3)
63
1
2
3
4
# 순서에 맞게 파라미터를 전달
# 어느 방식을 하나 결과는 같다.
test(10, 50, 3)
63
return (리턴)
- 기본적으로 함수의 종료를 명시해준다.
1) return 옆에 값이나 수식이 있다면 해당 값을 호출자(caller)에게 반환(전달)한다.
2) return 만 존재하면 None을 반환한다.
3) return이 없는 경우, 기본적으로 함수 코드 블록이 종료되면 종료로 간주되며, 이때도 None을 반환한다.
return 옆에 값이나 수식이 있는 경우
해당 값을 호출자(caller)에게 반환(전달)한다.
1
2
3
4
5
def eg_multiply(x,y):
if x > 10:
return x * y
eg_multiply(15,6) # return옆의 x * y 가 반환되었다.
90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def eg_multiply2(x,y):
if x > 10:
return x * y
print(x + y) #실행된다.
return (x + 3) * y
print(x + y) #실행되지 않는다.
eg_multiply2(1,9)
# x>10을 만족하지 않아서 아래의 return문을 수행
# 이때 위에 쓰인 쓰인 print(x + y) 는 수행되지만, 아래에 쓰인 동일한 print는 수행되지 않는다.
# 즉 return이 수행되기 전에는 함수가 실행되지만, return이 실행되는 순간 함수가 종료됨을 알 수 있다.
10
36
return 만 존재하면 None을 반환
1
2
3
4
5
6
7
8
9
10
11
def eg_multiply3(x,y):
if x > 10:
return
# none이 나오는 결과를 보이기 위해 변수선언
result = eg_multiply3(15,6)
print(result)
# if문을 만족하는 경우에 대한 return은 있지만, 그렇지 않은 경우에 대한 return이 없다.
# 이 경우는 None을 반환한다.
None
return이 없는 경우
1
2
3
4
5
6
7
8
def eg_multiply4(x,y):
if x > 10:
return x * y
# none이 나오는 결과를 보이기 위해 변수선언
result = eg_multiply4(2,6)
print(result)
None
1
2
# 물론 if문을 만족하는 경우는 이상없이 출력이 된다.
eg_multiply4(15,9)
135
multiple return (복수 값 반환)
-
tuple반환을 하여 복수개의 값 리턴 가능
-
복수개의 값을 리턴하는 것 같지만 실제 파이썬의 개념상으로는 튜플을 반환하는 것
1
2
3
4
5
6
7
8
9
def add_multi(x, y):
s = x + y
m = x * y
return s, m # 복수값 반환
a, b = add_multi(20, 3) #tuple unpacking을 활용해 각각의 값으로 반환
print(a, b)
23 60
1
2
3
c = add_multi(20, 3)
print(type(c))
print(c)
<class 'tuple'> (23, 60)
variable scope (변수의 범위)
-
변수가 참조 가능한 코드상의 범위를 명시
-
함수내의 변수는 일종의 생명주기가 있다.
-
즉, 자신이 속한 코드 블록이 종료되면 소멸된다.
-
이렇게 특정 코드 블록에서 선언된 변수를 지역변수(local variable) 라 한다.
-
반대로 가장 상단에서 정의되어 프로그램 종료 전까지 유지되는 변수를 전역변수(global variable)이라고 한다.
-
같은 이름의 지역변수와 전역변수가 존재할 경우, 함수를 실행할때는 지역변수의 우선순위가 더 높다.
1
2
3
4
5
6
7
8
9
10
11
# 전역 변수
num1 = 10
num2 = 30
#def test 내의 num1, num2 => 지역변수
def test(num1, num2):
print(num1, num2)
test(30, 40)
print(num1, num2)
30 40 10 30
test(30, 40) 에 입력된 num1, num2는 test 함수내에서만 생명주기를 갖는 지역변수 이다.
위와 같은 경우 전역 변수 인 10과 30이 test() 함수내에 입력된 30과 40으로 업데이트 되는 것이라 착각하기 쉽지만, 사실은 사람의 눈으로 보기에만 같은 변수명을 가진 variable일 뿐, 컴퓨터상으로는 전혀 다른 변수이다.
variable length argument (가변길이 인자)
-
전달되는 파라미터의 개수가 고정적이지 않은 경우 사용
-
e.g)
-
print 함수
-
format 함수
-
*args, **kwargs 2가지를 사용하여 가변길이 인자를 표현할 수 있다.
*args : 파라미터를 tuple의 형태로 전달 (argument parameter)
**kwargs : 파리미터를 dict 형태로 전달(keyword parameter)
- 다른 변수앞에 * 나 ** 을 붙여서 args나 kwargs를 표현할 수도 있으나, 보통은 고정적으로 *args 와 **kwargs 를 사용하는 것이 관례이다.
argument parameter
1
2
3
4
5
def test(*args): # arguments 를 의미
for item in args:
print(item)
test(10, 30, 40, 50, 60, 70)
10 30 40 50 60 70
keyword parameter (키워드 파라미터)
-
**가 붙은 경우에는 키워드 파라미터로 인식
-
즉 함수 호출 시, 파리미터의 이름과 값을 함께 전달 가능
1
2
3
4
5
def test2(**kwargs): # key word arguments
for key, value in kwargs.items():
print('key:', key, ', value:', value)
test2(a=1, b=2, c=3, d=4, name='gabe')
key: a , value: 1 key: b , value: 2 key: c , value: 3 key: d , value: 4 key: name , value: gabe
가변길이 함수 예시
문자열 포맷 함수
-
여러가지 값과 포맷을 이용하여 문자열을 정의할 수 있는 함수
-
{} placeholder를 문자열 내에 위치 시킨 후, 해당 위치에 format함수로 전달된 값으로 대체하여 문자열 생성
-
포맷 구성은 다음 링크 참조 : https://pyformat.info/
1
2
a = '오늘 온도: {}도, 강수 확률은: {}%'
print(a)
오늘 온도: {}도, 강수 확률은: {}%
1
2
a = '오늘 온도: {}도, 강수 확률은: {}%'.format(30, 60)
print(a)
오늘 온도: 30도, 강수 확률은: 60%
1
2
a = '오늘 온도: {today_temp}도, 강수확률은: {today_prob}% 내일온도: {tomorrow_temp}도'.format(tomorrow_temp=36, today_prob=70, today_temp=39)
print(a)
오늘 온도: 39도, 강수확률은: 70% 내일온도: 36도
함수 사용 예제
1) 주어진 숫자 리스트의 평균을 구하는 함수를 출력하기
1
2
3
a = [ 1, 2, 3]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
c = [1, 2, 3.0, 3.9, 8.7]
1
2
3
4
5
6
7
8
# for문 사용
def mean(nums):
total = 0
for i in nums:
total +=i
return total / len(nums)
1
2
3
print(mean(a))
print(mean(b))
print(mean(c))
2.0 5.5 3.72
1
2
3
# 내장함수 sum 사용
def mean(nums):
return sum(nums) / len(nums)
1
2
3
print(mean(a))
print(mean(b))
print(mean(c))
2.0 5.5 3.72
2) 해당 숫자가 소수인지 아닌지 판별하기
-
소수 : 1과 자기 자신으로만 나눠지는 수
-
양의 정수 1개를 입력받으면 boolean (소수 = True, 합성수 = Flase) 로 출력
-
관례적으로 python에서 boolean 형태를 출력하는 리스트를 표현할때는 ‘is’를 쓴다.
-
2 ~ 주어진수 까지 모든 수로 나누었을때 1번이라도 나눈 몫이 0이 된다면 그 수는 소수가 아니다.
1
2
3
4
5
6
7
def is_prime(num):
for i in range(2, num): # 나눌 수의 리스트 생성하여 for문의 input으로 사용
# 입력된 값을 나누었을때 몫이 0이되면 합성수
if num % i == 0:
return False
# for 문을 돌면서 한번도 if조건을 만족하지 않았다 = 소수
return True
1
2
3
4
print(is_prime(100))
print(is_prime(89))
print(is_prime(17))
print(is_prime(3))
False True True True
2부터 해당 숫자사이에 소수가 몇개인지 출력하는 함수를 구하기
-
양의 정수 1개를 입력받으면, 2~ 해당 숫자 사이의 소수가 몇개인지 출력
-
2 ~ 해당 숫자를 loop로 돌면서 소수를 판단해서 count한뒤 return
1
2
3
4
5
6
def num_prime(num):
count = 0
for i in range(2, num+1):
if is_prime(i): # 위에서 만든 함수 사용 #is_prime이 True라면
count +=1
return count
1
2
3
4
print(num_prime(100))
print(num_prime(89))
print(num_prime(7))
print(num_prime(5))
25 24 4 3
댓글남기기