본문 바로가기
프로그래밍 언어/파이썬

7.함수

by Jinger 2023. 2. 27.

서론

    프로그래밍 언어에서 함수와 수학의 함수는 비슷하다. 하나의 목적을 위해 수행되는 코드를 묶어 사용하는 것이다. 이해하기 쉽게 튀김기에 어느 음식을 넣든 행동하는 것은 똑같지만, 나오는 음식이 다른 것과 같다. 함수는 기본적으로 반복적인 코드를 피하기 위해 사용된다. 그 결과 가독성이 좋아지고, 코드 길이가 간결해지며, 유지 관리가 쉬워지는 장점들이 있다. 


함수 정의

    여태까지는 파이썬에 기본 내장되어 있던 함수들을 사용해 왔다. 이제부터는 그것들을 이용하여 직접 함수를 만들 수 있다. 함수 정의하는 방법은 주로 def키워드를 사용하지만 아래와 같은 형식들이 여러 개 존재한다.

def 함수명():
(블록) 코드
def 함수명(매개변수, 매개변수=디폴트값,...):
   코드
def 함수명():
   코드
   return 리턴값
def 함수명(*매개변수):    #가변 매개변수
   코드
def 함수명(**매개변수):   #키워드 변수
   코드

     처음 보는 용어와 키워드가 있지만, 이는 아래 글을 계속 읽으며 알아가자. 가장 처음 볼 함수 선언 형태는 매개변수도 리턴값도 없는 형태이다.

매개변수

    매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미한다. 함수 선언 시 "()"괄호 안에 적으면 함수 내부에서 선언이 된다.

디폴트

    디폴트는 함수에 인자를 넣지 않는 경우, 대신 사용되는 인자이다. 이때 주의할 상황으로는 일반 인자와 디폴트 매개변수가 섞어서 사용할 때는 디폴트 매개변수는 일반 인자 다음에 정의해야 합니다. 디폴트 매개변수를 앞에 정의하면 컴파일러가 일반 매개변수와 디폴트 매개변수를 구분할 수 없기 때문입니다. 아래 예시에서 "n=3"은 지워도 되지만, "value="OMG""는 지우면 안 된다.

    또한 매개변수에 직접 인수를 넣을 수 있다. 하지만, 순서가 섞인 상태로 직접 대입 시 하나라도 빠지면 작동이 되지 않는다. 즉, 아래 예시에서 "test(c=3, a=1,2)"는 실행이 되지 않는다.

return

    return은 해당 함수에서 반환되어야 해주는 키워드이다. 리턴값도 결괏값, 출력값, 반환 값 다양하게 불린다. 아래 예시에서 result대신 return키워드 뒤에 바로 "a+b"를 넣어도 되지만, "result = a+b"는 넣으면 안 된다. 초보자들에게 종종 보이는 실수이다.

    그리고 반환이 된다면 그 이후로 함수를 실행시킬 필요가 없기에 return키워드 위치에서 멈춘다.

가변 매개변수

    가변 매개변수는 매개변수의 개수가 달라질 수 있을 때 혹은 매개변수의 개수를 모를 때 사용한다. 매개변수 앞에 "*"별을 붙이면 된다.(튜플로 인식) 만약 비가변 매개변수와 가변 매개변수가 혼합하여 사용된다면, 가변 매개변수가 비가면 매개변수보다 뒤에 위치해야 한다. 또한 여러 개의 가변 매개변수를 사용할 수 없다.(둘 다 컴퓨터가 구분을 할 수 없다)

키워드 변수

    키워드 변수는 매개변수 앞에 "**"별 두 개를 붙여 키워드와 인자 둘 다 입력할 수 있게 해 준다.(딕셔너리로 인식)


재귀함수

  재귀함수란 함수가 자기 자신을 호출하는 함수를 의미한다. 이때 반복문과 마찬가지로 무한 재귀를 조심해야 한다. 대표적인 재귀함수는 팩토리얼 재귀함수가 있다. 

반복문과 비교

   하지만 팩토리얼은 반복문으로도 충분히 만들 수 있다.

    이렇듯 재귀함수는 반복문과 비슷하다. 그럼 반복문과 재귀함수를 비교해 보자.

반복문(Iteration) 재귀함수(Recursion)
일련의 명령을 반복적으로 특정 조건에 도달 할 때까지 반복적으로 실행할 수 있다 함수 자기자신을 호출 한다
무한반복이 발생할 때 무한 루프는 CPU 사이클을 반복적으로 사용 무한 재귀는 스택 오버플로우를 일으킴
스택 메모리를 사용하지 않음, 메모리 힙을 사용 스택 메모리는 함수가 호출 될 때마다 새 로컬 변수와 매개 변수 집합을 저장하는데 사용
빠른 실행 느린 실행
코드 길이를 더 길게 만들고 변수가 많아 가독성이 떨어짐 코드 길이와 변수가 적어 가독성이 높아짐


    재귀함수와 반복문 와 비교해 보면 알고리즘을 작성하는 데 있어 반복문이 더 좋아 보인다. 그럼에도 재귀함수를 사용하는 경우가 있다.
1. 알고리즘 자체가 재귀적인 표현이 자연스러운 경우
2. 변수 사용을 줄일 수 있다.

꼬리재귀

    재귀 호출은 자기 자신을 호출한 뒤 결과를 기다리면서 생기는 콜스택 부하로 인한 메모리낭비를 극복한 개념 꼬리 재귀가 존재한다. 꼬리 재귀는 재귀 호출이 끝나는 시점에서 아무 일도 하지 않고 바로 결과 반환하도록 하여 함수의 상태 유지 및 추가 연산을 하지 않기에 스택오버플로우를 해결할 수 있다.


람다

    람다를 통해 이름이 없는 함수를 만들 수 있다. 람다 사용 방법은 “lambda 매개변수 : 결과”의 형식을 가진다.

Map

    map(함수,리스트) 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성해주는 함수

Filter

    filter(함수, 리스트) 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성해 주는 함수


지역변수와 전역변수

  지역 변수(local variable)란 함수 내에서 선언된 변수를 의미한다. 전역 변수(global variable)란 함수 외부에서 선언된 변수를 의미한다. 해당 변수가 사용되는 목적에 따라 구분해서 사용할 필요가 있다.

    함수 외부에서 선언된 전역 변수는 함수 외부에서는 당연히 접근할 수 있으며, 모든 함수에서 global 키워드로 재선언하면 접근할 수 있게 된다. 주의해야 할 점으로 아래와 같이 "global a = 1" 이렇게 바로 쓸 수 없고 반드시 "global a" 선언을 하고 그다음에 변수의 값을 넣어줄 수 있다.


    반대로 지역 변수를 불러오고 싶을 때는 "nonlocal"를 사용한다.


패킹과 언패킹(Packing&Unpacking)

    패킹은 인자로 받은 여러 개의 값을 하나의 객체로 합쳐서 받을 수 있도록 한다. 앞에 함수 부분을 보면 인자에 패킹을 사용하여 매개변수(*한 개를 매개변수 앞에 붙임)를 자유롭게 받을 수 있다.(가변 매개변수(튜플로 변환)와 가변 키워드 변수(딕셔너리로 변환)가 이에 해당한다.)

    패킹과 반대되는 개념인 언패킹은 여러 개의 객체를 포함하고 있는 하나의 객체를 풀어주는 역할을 한다. 함수에서 언패킹을 할 때는, 매개변수에서 "*"을 붙이는 게 아니라 인자 앞에 "*"을 붙여서 사용한다.


데코레이터(Decorator)

    파이썬에서 데코레이터란 원래 함수에 또 다른 특별한 기능을 넣은 기능을 말한다. "@데코레이터함수"로 함수(메서드) 선언 바로 전에 사용한다. 

 이를 사용하면 어느정도 비슷한 함수를 여러 개를 쉽게 만들 수 있다.


주섬주섬

  만약 파이썬으로 면접을 보게 된다면, 기초적이거나 자연스럽게 쓰고 있는 데 언패킹과 패킹에 대한 설명 혹은 재귀와 반복문의 차이에 대해 물어볼 것이다. 이에 설명을 하기 위해 컴퓨터 시스템 구조에 대해 알아야 하는 데 이에 간략한 설명은 참고에 써놓겠다.

참고

  • 팩토리얼은 "n!"으로 쓰고 n부터 1까지의 곱을 의미하는 수학 개념이다.
  • 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다. 즉, 프로그램이 실행되려면 반드시 메모리에 저장되어 있어야 한다.
  • 메모리의 힙(heap) 영역은 사용자가 직접 관리해야만 하는 메모리 영역이다.
  • 메모리 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
스택과 힙의 장단점
스택
매우 빠른 액세스 변수는 전역 적으로 액세스 할 수 있습니다.
변수를 명시 적으로 할당 해제 할 필요가 없습니다. 메모리 크기 제한 없음
공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않습니다. (상대적으로) 느린 액세스
지역 변수 만 효율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당 된 후 시간이 지남에 따라 메모리가 조각화되어 해제 될 수 있습니다.
스택 크기 제한 (OS에 따라 다름) 메모리를 관리해야합니다 (변수를 할당하고 해제하는 책임이 있습니다)
변수의 크기를 조정할 수 없습니다.  
  • 콜스택이란 컴퓨터 프로그램에서 현재 실행 중인 서브루틴에 관한 정보를 저장하는 스택 자료구조이다. 또한 실행 스택(execution stack), 제어 스택 (control stack), 런 타임 스택 (run-time) 스택 혹은 기계 스택 (machine stack)이라고도 하며, 그냥 줄여서 스택 (the stack)이라고도 한다.
  • 스택 오버플로우(SOF) Stack 영역의 메모리가 지정된 범위를 넘어갈 때 발생한다. 만약 한 함수에서 너무 큰 지역 변수를 선언하거나 함수를 재귀적으로 무한정 호출하게 되면 stack overflow가 발생할 수 있다.
  • Cpu(중앙처리장치) 컴퓨터의 두뇌로 메모리에 저장된 명령어를 읽어 들이고, 읽어 들인 명령어를 해석하고, 실행하는 부품이다.
  • Cpu 사이클 명령어를 꺼내와 실행하기 위한 연속적인 동작 과정이다.
 

5.반복문

서론 컴퓨터가 잘하는 것 중에 하나가 귀찮은 반복 작업을 잘한다는 것이다. 그 과정의 기초가 이 반복문이다. 복잡한 일을 분류하는 반복 작업을 원한다면 저번 시간에 배운 조건문과 결합하여

jinger.tistory.com

 

6.시퀀스

서론 시퀀스(squence)란 문자열과 같이 연속적으로 이어진 자료형을 말한다. 우리가 데이터를 저장할 때 주로 이 시퀀스 자료를 이용해 관리를 하기에 중요하다. 시퀀스에 리스트, 딕셔너리, 튜플,

jinger.tistory.com

반응형

'프로그래밍 언어 > 파이썬' 카테고리의 다른 글

9.클래스  (0) 2023.03.07
8.모듈  (0) 2023.03.02
6.시퀀스  (0) 2023.02.21
5.반복문  (0) 2023.02.20
4.조건문  (0) 2023.02.20

댓글