-
[CHAPTER 6] 함수Deep Learning/인공지능 입문 코딩 2021. 5. 22. 19:57728x90
프로그램은 기능이 다양해질수록 점점 더 커지고 복잡해진다.
따라서 프로그램을 이해하기 쉽고 관리하기 쉽도록 작은 조각으로 나눠야 할 필요가 있다.
그 방법들 중 하나가 함수(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.5return 키워드를 통해 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)) 55start, 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
가장 작은 수: 5n-각형을 그리는 프로그램
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