함수 [Function]

일종의 기능의 단위로써 프로그램 내에서 반복해 사용할 코드 조각을 함수로 정의한것

 

필요할 때마다 함수 이름을 호출하는 것만으로 해당 코드를 실행 가능하다.

• 코드 재사용성 증가: 동일한 기능을 하는 코드를 여러 번 작성할 필요 없이, 한 번 정의한 함수를 반복 호출 가능

• 코드 가독성 향상: 함수 이름에 해당 기능을 잘 나타내면, 코드 전체의 가독성이 높아짐

• 유지 보수성 개선: 함수로 묶인 코드는 한 곳에서만 수정하면 되므로 유지 보수가 용이


함수의 정의

def 함수이름(매개변수1, 매개변수2, ...):
    # 함수가 수행할 문장들
    # ...
    return 반환값

 

매개변수(Parameters)와 인자(Arguments)의 차이

def add(a, b):  # a, b는 매개변수(parameter)
    return a + b

result = add(3, 5)  # 3과 5는 인자(argument)
print(result)  # 출력: 8

 

매개변수(Parameter):

함수를 정의할 때 함수가 외부로부터 값을 전달받기 위해 미리 선언해 두는 일종의 이름(변수) 이다.

→ 함수 정의 시 사용하는 변수 이름

• 함수 내부에서 사용될 값의 자리(그릇) 역할

• 아직 실제 값은 들어오지 않은 상태

 

 

 

인자(Argument):

함수를 호출할 때 매개변수에 실제로 전달하는 값이다.

→ 함수 호출 시 실제로 넘기는 값

• 함수 실행 시 매개변수에 대입되는 실제 데이터

• 호출 순간에 결정된다

 

반환값(Return Value)

함수가 내부에서 계산하거나 처리한 결과를 함수 밖(호출한 위치)으로 전달하는 값을 의미한다.

값을 호출한 곳으로 되돌려준다

함수 실행을 즉시 종료한다

즉, return이 실행되는 순간 함수는 끝나며, 그 아래에 작성된 코드는 실행되지 않는다.

 

반환값이 필요한 경우

함수의 실행 결과를 다른 변수에 저장하거나, 다음 계산에 사용해야 할 때는 반드시 반환값이 필요하다.

계산 결과를 재사용해야 할 때

함수의 결과를 조건문, 반복문, 다른 함수의 입력으로 사용해야 할 때

프로그램의 흐름을 값으로 제어해야 할 때

 

반환값이 필요하지 않은 경우

함수가 어떤 작업을 수행하는 것 자체가 목적일 때는 반환값이 없어도 된다.

화면에 출력만 하는 함수

로그를 남기거나 메시지를 보여주는 함수

파일 저장, 데이터 전송 등 부수 효과가 목적일 때

 

⚠️반환값이 없는 것이 아니라 None을 반환한다⚠️

return이 없는 함수도 아무것도 반환하지 않는 것이 아닌 항상 None이라는 값을 반환한다는 것이다.

즉, 파이썬의 모든 함수는 반환값을 가진다.
다만 우리가 그 값을 의도적으로 사용하느냐, 무시하느냐의 차이일 뿐이다.

 

사용예시

# 반환값이 없는 경우
def greet(name):
    print("Hello,", name)
    # return 문이 없으므로 None 반환

greet("Alice")  # "Hello, Alice"를 출력하고 반환값은 None


# 반환값이 하나인 경우
def square(x):
    return x * x

result = square(4)
print(result)  # 16


# 반환값이 여러개인 경우
def divide_and_remainder(a, b):
    quotient = a // b  # 몫
    remainder = a % b  # 나머지
    return quotient, remainder

q, r = divide_and_remainder(10, 3)
print("몫:", q)   # 몫: 3
print("나머지:", r) # 나머지: 1

 

 


다양한 매개변수 전달 방식

함수에서는 매개변수를 다루는 다양한 방법이 있다.

 

1. 기본 매개변수(Default Parameter): 매개변수에 기본값을 설정할 수 있다.

def greet(name, message="Hello"):
    print(message, name)

greet("Alice")        # "Hello Alice" - message에 기본값 사용
greet("Bob", "Hi")     # "Hi Bob"

 

 

2. 키워드 인자(Keyword Arguments): 함수 호출 시 매개변수 이름을 명시하여 인자를 전달할 수 있다.

def introduce(name, age):
    print("이름:", name)
    print("나이:", age)

introduce(name="Charlie", age=25)
introduce(age=30, name="Diana")  # 순서를 바꿔도 명시적이라 오류 없음

 


Docstring (문서 문자열)

 파이썬 함수에서 삼중 따옴표(""")로 작성하고, 함수 사용법과 의도를 기록할 수 있다.

def add(a, b):
    """두 수를 더한 값을 반환하는 함수"""
    return a + b
    
help(add)

 

 

주석과의 차이점?

# 주석은 사람만 보는 메모고,
docstring은 “파이썬도 이해하는 공식 설명서”라 할수있다.

 

Docstring(문서 문자열)은 주석과 달리 파이썬 객체의 속성으로 저장되며 help()로 출력이 가능하다.

 


지역 변수 vs 전역 변수

 

변수의 스코프란? (먼저 짚고 넘어가기)

스코프란, 변수가 어디에서 만들어졌고, 어디까지 접근 가능한지의 범위를 의미한다.

파이썬에서는 변수는 선언된 위치에 따라서 지역변수, 전역 변수로 나눠진다.

 

지역 변수(Local Variable)

함수 안에서 선언된 변수

해당 함수 내부에서만 사용 가능

함수 실행이 메모리에서 제거됨

def my_func():
    x = 5  # 지역 변수
    print(x)

 

지역 변수는 함수가 호출될 때 생성된다.

함수가 종료되면 사라진다.

함수 밖에서는 접근할 수 없다.

즉, 지역 변수는 함수 내부의 임시 작업용 변수라고 이해하면 된다.

 

 

전역 변수(Global Variable)

함수 밖에서 선언된 변수

• 프로그램 전체에서 접근 가능

• 모든 함수에서 읽기 가능

x = 10  # 전역 변수

def my_func():
    print(x)

 

전역 변수는 프로그램 시작과 함께 생성

프로그램이 종료될 때까지 유지

여러 함수에서 공유 가능

전역 변수는 여러 함수가 공통으로 사용하는 값에 적합하다

 

 

지역 변수와 전역 변수의 이름이 같을 때

x = 10  # 전역 변수

def my_func():
    x = 5  # 지역 변수
    print("함수 내부:", x)

my_func()
print("함수 외부:", x)

결과 설명

함수 내부에서는 지역 변수 x가 우선 사용

함수 외부에서는 전역 변수 x가 그대로 유지

즉, 지역 변수가 전역 변수보다 우선순위가 높다

 

함수 안에서 전역 변수를 수정할 수 없는 이유

x = 10

def my_func():
    x = x + 1   # 에러 발생

파이썬은 함수 안에서 값을 할당하는 변수를 지역 변수라고 판단한다.

따라서 x = x+1에서 오른쪽의 x를 지역변수로 인식하나 아직 값이 없어 에러가 발생한다.

즉, 함수 안에서 대입이 발생하면 자동으로 지역 변수로 취급한다.

 

global 키워드

함수 안에서 전역 변수를 사용하겠다고 명시하는 선언이다.

x = 10

def my_func():
    global x
    x = x + 1

my_func()
print(x)

 

global x를 선언하면 함수 내부의 x는 지역 변수가 아닌 전역 변수가 된다.

따라서 함수 안에서 전역 변수의 값을 직접 수정 가능

 

⚠️ 주의사항 ⚠️

전역 변수는 프로그램 전체에 영향을 준다

값이 어디서 바뀌는지 추적하기 어려워진다

코드 유지보수와 디버깅이 어려워질 수 있다

따라서 함수는 값을 반환하고, 전역 변수는 가급적 읽기 전용으로 사용하는 것이 좋다.


모듈

함수, 변수, 클래스 등을 하나의 파이썬 파일(.py)에 모아 둔 코드 단위이다.

즉, 하나의 .py 파일 자체가 하나의 모듈이 된다.

모듈은 import 문을 사용해 다른 파이썬 파일에서 불러와 재사용할 수 있다.

사용예시

# mymodule.py (모듈 예시)
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

PI = 3.14159

add, subtract 함수, PI 변수를 포함한 mymodule이라는 하나의 모듈이 된다

 

 

모듈 호출

모듈을 사용하기 위해서는 import 키워드를 사용한다.

예를 들어, mymodule.py를 같은 디렉토리에 두고 다음과 같이 사용할 수 있다.

모듈 내부의 모든 구성요소를 사용할 수 있음

모듈명.이름 형태로 접근

 이름 충돌 위험이 적음

 

 

# main.py (모듈 사용 예시)
import mymodule

result = mymodule.add(3, 5)
print(result)           # 출력: 8

print(mymodule.PI)      # 출력: 3.14159

이 경우 mymodule 아래에 정의된 함수와 변수를 mymodule.함수명 혹은 mymodule.변수명 형태로 접근할 수 있다

 

특정 함수나 변수만 가져오기

모듈 전체가 아닌 특정 함수나 변수만 가져오고 싶다면 from 구문을 사용할 수 있다.

모듈명을 쓰지 않아도 됨

코드가 간결해짐

 이름 충돌 가능성 있음

 

 

from mymodule import add, PI

print(add(10, 20))  # mymodule.add가 아닌 add로 바로 사용 가능
print(PI)

 

모듈 이름에 별칭(alias) 사용하기

모듈 이름이 길거나 더 짧은 이름으로 사용하고 싶다면 import 모듈명 as 별칭 문법을 사용한다.

또한, from mymodule import add as plus 와 같이 특정 함수에 별칭을 붙일 수도 있다.

import mymodule as mm
print(mm.add(2, 2))  # 별칭 mm로 접근


from mymodule import add as plus
print(plus(3, 4))

 


파이썬 표준 라이브러리(내장 모듈) 사용하기

파이썬은 기본 설치만으로도 다양한 기능을 바로 사용할 수 있도록 표준 라이브러리를 제공한다.
이를 표준 라이브러리(내장 모듈) 라고 하며, 별도의 설치 없이 import만으로 사용 가능하다.

# math 모듈은 수학 관련 함수와 상수를 제공
import math

print(math.sqrt(16))  # 제곱근, 출력: 4.0
print(math.sin(math.pi/2))  # sin(90°) = 1.0

# random 모듈은 난수를 생성하는 기능 제공
import random
print(random.randint(1, 10)) # 1부터 10 사이의 정수 난수

# datetime 모듈은 날짜와 시간을 다루는 기능 제공
from datetime import datetime
now = datetime.now()
print(now) # 현재 날짜와 시간 출력

 

외부 모듈(서드파티 라이브러리) 설치 및 사용하는 법

표준 라이브러리만으로 해결하기 어려운 전문적인 작업을 위해, 다른 개발자들이 만들어 배포한 모듈을 사용할 수 있다.
이를 외부 모듈(서드파티 라이브러리) 라고 한다.

예시로, pandas 라는 데이터 전처리 라이브러리를 설치하고 사용해보자

# 터미널(명령 프롬프트)에서 다음 명령어를 실행:
pip install pandas
# 파이썬 코드에서 사용
import pandas as pd

# 딕셔너리 형태로 데이터 생성
data = {
    "name": ["Alice", "Bob", "Charlie", "David", "Eva"],
    "age": [25, 32, 18, 47, 29],
    "city": ["Seoul", "Busan", "Incheon", "Daegu", "Seoul"],
    "score": [85, 92, 78, 64, 90]
}

# DataFrame 만들기
df = pd.DataFrame(data)

print(df)       # 페이지 소스 출력

이처럼 외부 모듈을 사용하면 파이썬 표준 라이브러리보다 훨씬 폭넓은 기능을 활용할 수 있다.


 

파이썬의 모듈 검색 경로

파이썬에서 import 문을 실행하면, 다음 순서로 모듈을 탐색한다.

  1. 현재 실행 중인 스크립트가 있는 디렉토리
  2. PYTHONPATH 환경 변수에 설정된 경로
  3. site-packages 디렉토리 (외부 라이브러리)
  4. 파이썬 표준 라이브러리 디렉토리

해당 경로에 모듈이 없으면 ModuleNotFoundError가 발생한다.

즉, 모듈이 설치되어 있어도 경로에 없으면 사용할 수 없다는 점이 중요하다.


모듈(Module)과 패키지(Package)

 

모듈은 하나의 파이썬 파일(.py) 이다.

함수, 변수, 클래스 등을 한 파일에 정리한 코드 묶음

기능 단위로 코드를 분리하기 위한 최소 단위

import를 통해 다른 파일에서 재사용 가능

즉, 모듈은 기능 하나를 담당하는 파일 이라고 이해하면 된다.

 

패키지는 여러 개의 모듈을 모아 둔 디렉토리(폴더) 이다.

프로젝트 규모가 커질수록 모듈 수가 증가

모듈을 폴더 구조로 정리해 계층적으로 관리하기 위해 사용

논리적으로 관련된 모듈들을 하나의 묶음으로 관리

패키지는 모듈을 정리하기 위한 상위 개념 이다.

 

패키지의 기본 구조

패키지는 다음과 같은 디렉토리 구조를 가진다.

mypackage/
    __init__.py
    mymodule.py
    utils.py

mypackage : 패키지 이름

__init__.py : 해당 디렉토리를 패키지로 인식하게 하는 파일

mymodule.py, utils.py : 패키지 안에 포함된 모듈들

이 구조에서 mypackage는 하나의 패키지가 되며, 그 안의 모듈들은 패키지명.모듈명 형태로 접근한다.

import mypackage.mymodule
from mypackage import utils

패키지를 사용하면 규모가 커진 프로젝트를 논리적 단위로 더 체계적으로 관리할 수 있다.

 

주의사항

  • 의미 있는 이름 사용
    모듈과 패키지 이름만 보고도 역할이 유추되도록 작성
    축약보다는 의미 중심의 이름이 좋다
  • 최소한의 기능 단위로 분리
    하나의 모듈에 너무 많은 기능을 넣지 않기
    관련된 기능끼리 묶어 관리

 

 

 

 

+ Recent posts