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

댓글남기기