ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CHAPTER 6] 함수
    Deep Learning/인공지능 입문 코딩 2021. 5. 22. 19:57
    728x90

    프로그램은 기능이 다양해질수록 점점 더 커지고 복잡해진다.

    따라서 프로그램을 이해하기 쉽고 관리하기 쉽도록 작은 조각으로 나눠야 할 필요가 있다.

    그 방법들 중 하나가 함수(function)이다.

     

    과일을 갈아서 음료를 만드는 기능을 가진 함수에

    사과와 레몬을 각각 입력해주면 사과 주스, 레몬 주스가 나올 것이다.

     


    함수의 사용법

    정의

    먼저 함수를 정의해야 한다.

    def 키워드를 사용하여 정의한다.

    def 뒤에는 함수의 이름이 오고() 안에는 입력값이 온다.

    아래 함수의 이름은 print_adress, 입력값은 없다.

    >>> def print_adress():
    	print('경상북도')
    	print('울릉군 울릉읍')
    	print('독도리')

    호출

    함수의 이름으로 호출을 한다. 입력값은 없게 정의했으므로 () 안에는 아무것도 써주지 않는다.

    >>> print_adress()
    경상북도
    울릉군 울릉읍
    독도리

    함수 외부에서 함수 안으로 값을 전달할 수 있는데 이 값을 인자라고한다.

    입력 값이 있는 함수

    name을 인자로 입력받고

    이름과 주소를 

    저번 장에서 배운 f-string을 이용하여 print를 해주고 있다.

    >>> def print_address(name):
    	print(f"이름: {name}")
    	print(f"서울 특별시 파이썬 빌딩 7층")
        
    >>> print_address('홍길동')
    이름: 홍길동
    주소: 서울 특별시 파이썬 빌딩 7층

    입력이 있으면 출력도 있을 것이다.

    출력 값이 있는 함수

    함수로부터 되돌아오는 값을 반환 값(return value)이라고 한다.

    위에서 본 함수들은 반환 값이 없는 함수들이다.

    반환 값이 있는 함수를 살펴보자.

     

    다음은 원의 넓이를 계산해 주는 함수이다.

    >>> def calculate_area(radius):
    	area = 3.14 * radius ** 2
    	return area
        
    >>> circle_area = calculate_area(5.0)
    >>> circle_area
    78.5

    return 키워드를 통해 area를 반환해 주도록 정의했다.calculate_area라는 함수는 radius를 입력받고 원의 넓이를 계산해 area에 저장하고

    calculate_area(5.0)을 통해 반지름이 5인 원의 넓이를 계산해준 다음

    그 값을 circle_area에 저장하고 값을 확인해 보고 있다.

     

    여러 개의 입력

    위에서는 하나의 입력, 하나의 출력을 해주는 함수들만을 살펴봤다.

    함수는 여러 개의 값을 입력해 줄 수도 있고 여러개의 값을 출력해 줄 수도 있다.

    먼저 입력이 여러 개인 경우를 보자.

     

    두 개의 값을 입력받는 get_sum함수이다.

    >>> def get_sum(start, end):
    	s = 0
    	for i in range(start, end+1):
    		s += i
    	return s
    
    >>> print(get_sum(1,10))
    55

    start, end 값은 각각  1과 10이 된다.get_sum(1, 10)이라고 호출하면

    이때, 1과 10은 인자, start와 end는 매개변수라고 한다.

    순서대로 적용되는 것이다.

    여러 개의 출력

    여러 개의 값을 반환해주는 함수를 살펴보자

     

    num1과 num2 두 수를 입력받고 사칙 연산의 결과들을 반환해준다.

    >>> def calculate(num1, num2):
    	add = num1 + num2
    	sub = num1 - num2
    	mul = num1 * num2
    	div = num1 / num2
    	return add, sub, mul, div
    
    >>> calculate(6,3)
    (9, 3, 18, 2.0)

     

    이때 반환되는 값은 튜플(tuple) 자료형인데 이에 관해서는 다음 장에서 다룰 예정이다.

    이 값들을 따로따로 저장하고 싶다면 아래와 같이 한다.

    >>> t1, t2, t3, t4 = calculate(6,3)
    print(f'add : {t1}')
    print(f'sub : {t2}')
    print(f'mul : {t3}')
    print(f'div : {t4}')
    add : 9
    sub : 3
    mul : 18
    div : 2.0

    변수의 범위

    변수의 종류에는 두 가지가 있다.

    변수에 접근할 수 있는 범위를 기준으로 나눈다.

    • 전역 변수 : 프로그램 어디에서나 접근이 가능하다.
    • 지역 변수 : 함수 내에서만 접근이 가능하다.

    지역 변수와 전역 변수

    함수 외부에서 counter = 100 (전역 변수)

    함수 내부에서 counter = 200 (지역변수)를 선언하였다.

    >>> def print_counter():
    	counter = 200
    	print(f'counter = {counter}')
    
    >>> counter = 100

     

    함수 내부에서 출력

    >>> print_counter() # 함수 내부에서 출력
    counter = 200

    즉, 200이 100을 가린다.함수 내부의 counter는 함수 외부의 counter를 가린다고 생각하면 쉽게 생각할 수 있다.

    그래서 함수 내부의 counter, 200이 출력된다.

     

    함수 외부에서 출력

    >>> print(f'counter = {counter}') # 함수 외부에서 출력
    counter = 100

    그래서 함수 외부의 counter, 100이 출력된다.함수를 빠져나왔을 때는 가리고 있던 200이 사리지게 되고 100이 보이게된다.

    global

    만약 함수 내부에서 전역변수를 선언하고 싶다면 global 키워드를 사용하면 된다.

    >>> def print_counter():
    	global counter
    	counter = 200
    	print(f'counter = {counter}')
    	
    >>> counter = 100
    
    >>> print_counter()
    counter = 200
    >>> print(f'counter = {counter}')
    counter = 200

    하지만 전역변수를 많이 사용할 경우 프로그램에서 어느 부분에서 오류가 발생하였는가를 추척하는 것이 매우어렵다.

    따라서 전역 변수의 사용은 최소로 하자.

     


    키워드 인자와 디폴트 인자

    햄버거를 주문받는 order함수가 있다.

    햄버거 갯수, 피클과 양파의 포함여부를 3개의 인자로 받는다.

     def order(num, pickle, onion):
    	print(f'햄버거 {num}개 - 피클:{pickle}, 양파:{onion}')

    만약 order함수에 햄버거 갯수만 인자로 전달하면

    >>> order(3)
    Traceback (most recent call last):
      File "<pyshell#72>", line 1, in <module>
        order(3)
    TypeError: order() missing 2 required positional arguments: 'pickle' and 'onion'

    에러 메시지가 출력된다.

    이러한 상황을 방지하고자 하는 것이 디폴트 인자이다.

    디폴트 인자(default argument)

    함수의 매개변수는 기본 값을 가질 수 있다.

    기본 값은 아래와 같이 지정할 수 있다.

    >>> def order(num, pickle = True, onion = True):
    	print(f'햄버거 {num}개 - 피클:{pickle}, 양파:{onion}')
    

    order함수에 햄버거 갯수만 인자로 전달한다면

    >>> order(3)
    햄버거 3개 - 피클:True, 양파:True

    키워드 인자(keyword argument)

    피클과 양파는 기본값인 True를 가지게 된다.

    인자가 많을 경우 인자의 순서를 외우고 있는 것은 어려운 일이다.

    이러한 혼동을 줄이고 안전한 프로그램을 위해 키워드 인자(keyword argument)를 사용할 수 있다.

     

    >>> def order(num, pickle = True, onion = True):
    	print(f'햄버거 {num}개 - 피클:{pickle}, 양파:{onion}')

     

    키워드 인자를 쓰지 않는 경우는 2번째가 양파인지 3번째가 양파인지 혼란스러울 수 있다.

    >>> order(3,False,True)
    햄버거 3개 - 피클:False, 양파:True

    이러한 경우 키워드 인자를 이용하여 값을 명확하게 전달할 수 있다.

    >>> order(3, onion=True, pickle=False)
    햄버거 3개 - 피클:False, 양파:True

    재귀함수


    재귀함수(recursion)
    란 함수 내부에서 자기 자신을 호출하는 함수이다.

    재귀는 처리 단계를 모두 기술하기 어려운 문제를 직관적이고 간단하게 해결할 수 있다.

     

    아래의 그림을 통해 재귀함수를 이해해보자.

    재귀함수가 실행되면 Recursive 함수의 복사본을 만들어서 복사본이 실행되는 구조로 이해하면 쉽다.

     

    재귀함수를 이용하여 팩토리얼을 계산하는 함수를 작성해보자

    >>> def factorial(n):
    	if n <= 1 :				# 종료 조건이 반드시 필요
    		return 1
    	else:
    		return n * factorial(n-1)	# n * (n-1)! 정의에 따른 구현
    
    >>> print(f'4! = {factorial(4)}')

    실행 과정을 글로 써보았다.

    factorial(4) 에서 else 부분이 실행되고 factorial(3)을 호출

    factorial(3) 에서 else 부분이 실행되고 factorial(2)을 호출

    factorial(2) 에서 else 부분이 실행되고 factorial(1)을 호출

    factorial(1) 에서 if 부분이 실행되고 return 1

    factorial(2) 에서 return 2 * 1

    factorial(3) 에서 return 3 * 2 * 1

    factorial(4) 에서 return 4 * 3 * 2 * 1

     


    모듈

    모듈이란 파이썬 함수나 변수 또는 클래스들을 모아놓은 스크립트 파일이다.

    파이썬 설치와 함계 제공되는 모듈파이썬 표준 라이브러리이라고 한다.

    파이썬 표준라이브러리를 사용하는 방법은 아래와 같다.

     

    파이썬 표준 라이브러리 중 datetime이라는 모듈을 사용하는 방법이다.

    import 키워드를 이용하여 모듈을 가져올 수 있다.

     

    >>> import datetime		# datetiem 모듈 가져오기
    >>> datetime.datetime.now()	# 현재 시간을 나타내는 메소드
    datetime.datetime(2021, 5, 22, 20, 47, 17, 45034)

    나만의 모듈 만들기

    # filename: my_func.py
    def mf_print(msg, n = 1):
        print(msg * n)
    # filename: main.py
    import my_func			#모듈 불러오기
    my_func.mf_print('hello', 3)	# my_func모듈의 mf_print() 함수 호출
    hellohellohello

    모듈이름.함수이름() 형태로 모듈에 있는 함수를 호출할 수 있다.

     

    as 키워드를 이용하여 별명을 붙일 수도 있다.

    import my_func as mf
    mf.mf_print('hello', 3)
    hellohellohello

     

    from 모듈명 import 함수명 으로 특정 함수를 바로 import 할 수 있다.

    from my_func import mf_print
    mf_print('hello', 3)
    hellohellohello

     

    *은 모든 함수를 import 하라는 뜻이다.

    from my_func import *
    mf_print('hello', 3)
    hellohellohello

    지금까지 배운 것들로

     

    세 수중 가장 큰수, 가장 작은 수를 반환해주는 프로그램

    세 수를 입력받고 가장 큰 수를 반환하는 max3 함수

    세 수를 입력받고 가장 작은 수를 반환하는 min3 함수를 작성한다.

    def max3(n1, n2, n3):
        if n1 > n2:
            if n1 > n3:
                return n1
            else:
                return n3
        else:
            if n2 > n3:
                return n2
            else:
                return n3
    
    
    def min3(n1, n2, n3):
        if n1 > n2:
            if n2 > n3:
                return n3
            else:
                return n2
        else:
            if n1 > n3:
                return n3
            else:
                return n1
    
    
    n1, n2, n3 = map(int, input("3 수를 입력하시오 : ").split())
    
    print("가장 큰 수: ", max3(n1, n2, n3))
    print("가장 작은 수: ", min3(n1, n2, n3))
    3 수를 입력하시오 : >? 5 10 30
    가장 큰 수:  30
    가장 작은 수:  5

     

    n-각형을 그리는 프로그램

    n각형을 그리는 함수를 정의하고

    매번 각도를 조금씩 틀어서 그려보도록 하자!

    import turtle 
    t = turtle.Turtle() 
     
    def n_polygon(n, length): 
        for i in range(n): 
            t.forward(length) 
            t.left(360//n)
     
    for i in range(10): 
        t.left(20) 
        n_polygon(6, 100) 

     

    728x90

    'Deep Learning > 인공지능 입문 코딩' 카테고리의 다른 글

    [CHAPTER 8] 딕셔너리와 집합  (0) 2021.05.24
    [CHAPTER 7] 리스트, 튜플  (0) 2021.05.23
    [CHAPTER 5] 반복문  (0) 2021.05.21
    [CHAPTER 4] 조건문  (0) 2021.05.16
    [CHAPTER 3] 연산자  (0) 2021.05.15

    댓글

Designed by Tistory.