7. [파이썬] ν•¨μˆ˜ κΈ°μ΄ˆμ™€ λ§€κ°œλ³€μˆ˜

2026. 3. 7. 01:40Β·Python & SQL/Python Basics
πŸ’‘ λ³Έ ν¬μŠ€νŒ…μ€ μˆ˜μ—… λ‚΄μš©, ꡐ재, ChatGPTλ₯Ό μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•œ ν•™μŠ΅ κΈ°λ‘μž…λ‹ˆλ‹€.
κΈ€κ³Ό κ·Έλ¦Ό λ“± λͺ¨λ“  μ½˜ν…μΈ μ˜ 정리 및 μž‘μ„±μ€ λ³Έ λΈ”λ‘œκ·Έμ—μ„œ 직접 μ œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

Python κΈ°μ΄ˆλΆ€ν„° Streamlit 데이터 μ‹œκ°ν™”κΉŒμ§€ μ •λ¦¬ν•˜λŠ” ν•™μŠ΅ κΈ°λ‘μž…λ‹ˆλ‹€.

이 글은 '7. [파이썬] ν•¨μˆ˜ κΈ°μ΄ˆμ™€ λ§€κ°œλ³€μˆ˜' μž…λ‹ˆλ‹€.

 

 

ν•¨μˆ˜λŠ” νŒŒμ΄μ¬μ„ λ°°μš°λ©΄μ„œ μ²˜μŒμ—λŠ” "μ½”λ“œλ₯Ό λ¬ΆλŠ” 문법" μ •λ„λ‘œ λ³΄μ΄μ§€λ§Œ, 쑰금만 μ§€λ‚˜λ©΄ ν”„λ‘œκ·Έλž¨μ„ ꡬ쑰적으둜 μ„€κ³„ν•˜λŠ” 핡심 λ„κ΅¬λΌλŠ” 것을 μ•Œκ²Œ λœλ‹€.

같은 μž‘μ—…μ„ λ°˜λ³΅ν•΄μ„œ μž‘μ„±ν•˜μ§€ μ•Šκ²Œ ν•΄μ£Όκ³ , μž…λ ₯κ³Ό 좜λ ₯을 λΆ„λ¦¬ν•΄μ„œ μƒκ°ν•˜κ²Œ λ§Œλ“€λ©°, 이후 객체지ν–₯μ΄λ‚˜ λͺ¨λ“ˆν™”λ‘œ λ„˜μ–΄κ°ˆ λ•Œλ„ κ°€μž₯ μ€‘μš”ν•œ κΈ°μ΄ˆκ°€ λœλ‹€.

 

이번 κΈ€μ—μ„œλŠ” ν•¨μˆ˜μ˜ μ •μ˜μ™€ 호좜, λ§€κ°œλ³€μˆ˜μ™€ 인자, μœ„μΉ˜ μΈμžμ™€ ν‚€μ›Œλ“œ 인자, κΈ°λ³Έκ°’, λ°˜ν™˜κ°’, κ°€λ³€ 인자, μ–ΈνŒ¨ν‚Ή, 객체 μ°Έμ‘° 방식, νƒ€μž… νžŒνŠΈκΉŒμ§€ μˆœμ„œλŒ€λ‘œ 정리해보렀고 ν•œλ‹€.

 

 

ν•¨μˆ˜λž€ 무엇인가

ν•¨μˆ˜(function)λŠ” 'νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ½”λ“œμ˜ 묢음'이닀.

ν•œ 번 μ •μ˜ν•΄λ‘λ©΄ ν•„μš”ν•  λ•Œλ§ˆλ‹€ λ‹€μ‹œ ν˜ΈμΆœν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

μ•„μ£Ό 기본적인 ν˜•νƒœλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

def show_welcome():
    print("파이썬 ν•™μŠ΅μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.")

show_welcome()
show_welcome()   # μ—¬λŸ¬λ²ˆ ν˜ΈμΆœν•˜λŠ” 것이 맀우 μš©μ΄ν•˜λ‹€.

 

μ‹€ν–‰ κ²°κ³Ό

파이썬 ν•™μŠ΅μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.
파이썬 ν•™μŠ΅μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 흐름은 두 단계이닀.

  • def 둜 ν•¨μˆ˜λ₯Ό μ •μ˜(define)ν•œλ‹€.
  • ν•¨μˆ˜ 이름 뒀에 () λ₯Ό λΆ™μ—¬ ν˜ΈμΆœν•œλ‹€.

즉, ν•¨μˆ˜λŠ” λ§Œλ“€μ–΄λ‘κΈ°λ§Œ ν•΄μ„œλŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ³ , μ‹€μ œλ‘œ ν˜ΈμΆœν•΄μ•Ό λ™μž‘ν•œλ‹€.

 

 

ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

ν•¨μˆ˜μ˜ κ°€μž₯ 큰 μž₯점은 λ°˜λ³΅μ„ 쀄이고, 의미λ₯Ό λΆ„λ¦¬ν•΄μ€€λ‹€λŠ” 점이닀.

 

예λ₯Ό λ“€μ–΄ 점수 데이터λ₯Ό 좜λ ₯ν•˜λŠ” μ½”λ“œκ°€ μ—¬λŸ¬ ꡰ데 λ°˜λ³΅λœλ‹€λ©΄, 맀번 print()λ₯Ό 길게 μ“°κΈ° 보닀 ν•¨μˆ˜λ‘œ λ¬ΆλŠ” 편이 훨씬 κΉ”λ”ν•˜λ‹€.

def print_score_report():
    print("ν•™μŠ΅μž 점수 리포트")
    print("-" * 20)
    print("좜λ ₯ μ™„λ£Œ")

print_score_report()

 

μ‹€ν–‰ κ²°κ³Ό

ν•™μŠ΅μž 점수 리포트
--------------------
좜λ ₯ μ™„λ£Œ

 

μ΄λ ‡κ²Œ ν•¨μˆ˜λ‘œ 묢어두면 λ‚˜μ€‘μ— 좜λ ₯ ν˜•μ‹μ„ λ°”κΎΈκ³  싢을 λ•Œλ„ ν•¨μˆ˜ λ‚΄λΆ€λ§Œ μˆ˜μ •ν•˜λ©΄ λœλ‹€.

ν”„λ‘œκ·Έλž¨μ΄ 컀질수둝 이런 κ΅¬μ‘°ν™”μ˜ νš¨κ³ΌλŠ” 훨씬 컀진닀.

 

 

λ§€κ°œλ³€μˆ˜(Parameter)와 인자(Augument)

  • λ§€κ°œλ³€μˆ˜(parameter): ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ„ μ–Έν•˜λŠ” λ³€μˆ˜
  • 인자(argument): ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ‹€μ œλ‘œ μ „λ‹¬ν•˜λŠ” κ°’

예제λ₯Ό 보면 차이가 더 λΆ„λͺ…ν•΄μ§„λ‹€.

def add_values(x, y):
    print(f"x={x}, y={y}")
    return x + y

print(add_values(10, 5))
print(add_values("data", "base"))

 

μ‹€ν–‰ κ²°κ³Ό

x=10, y=5
15
x=data, y=base
database

 

μ—¬κΈ°μ„œ x, y λŠ” λ§€κ°œλ³€μˆ˜μ΄κ³ ,

10, 5, "data", "base" λŠ” μΈμžμ΄λ‹€.

 

파이썬 ν•¨μˆ˜λŠ” 맀우 μœ μ—°ν•΄μ„œ + 연산이 κ°€λŠ₯ν•œ νƒ€μž…λΌλ¦¬λΌλ©΄ 같은 ν•¨μˆ˜μ—μ„œλ„ λ™μž‘ν•  수 μžˆλ‹€.

숫자λ₯Ό μ „λ‹¬ν•˜λ©΄ λ§μ…ˆμ΄ 되고, λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜λ©΄ 이어 뢙이기가 λœλ‹€.

이 점이 파이썬의 μž₯점이기도 ν•˜μ§€λ§Œ, λ™μ‹œμ— νƒ€μž…μ„ μ •ν™•νžˆ μ˜μ‹ν•˜μ§€ μ•ŠμœΌλ©΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όκ°€ λ‚˜μ˜¬ μˆ˜λ„ μžˆλ‹€.

 

 

μœ„μΉ˜ μΈμžμ™€ ν‚€μ›Œλ“œ 인자

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 값을 μ „λ‹¬ν•˜λŠ” 방식은 크게 두 κ°€μ§€ 이닀.

 

첫 λ²ˆμ§ΈλŠ” 'μœ„μΉ˜ 인자(positional argument)' 이닀.

말 κ·ΈλŒ€λ‘œ μž‘μ„±λœ μˆœμ„œλŒ€λ‘œ 값이 λ“€μ–΄κ°„λ‹€.

 

두 λ²ˆμ§ΈλŠ” 'ν‚€μ›Œλ“œ 인자(keyword argument)' 이닀.

λ§€κ°œλ³€μˆ˜ 이름을 직접 μ§€μ •ν•΄μ„œ μ „λ‹¬ν•œλ‹€.

def introduce(name, role):
    print(f"name={name}, role={role}")

introduce("지은", "data engineer")
introduce(role="backend engineer", name="민수")
introduce("ν•˜λ‚˜", role="analyst")

 

μ‹€ν–‰ κ²°κ³Ό

name=지은, role=data engineer
name=민수, role=backend engineer
name=ν•˜λ‚˜, role=analyst

 

μ—¬κΈ°μ„œ μ„Έ 번째 호좜처럼 μœ„μΉ˜μΈμžμ™€ ν‚€μ›Œλ“œ 인자λ₯Ό μ„žμ–΄ μ“Έ μˆ˜λŠ” μžˆμ§€λ§Œ, κ·œμΉ™μ΄ μžˆλ‹€.

항상 μœ„μΉ˜ μΈμžκ°€ λ¨Όμ € 와야 ν•œλ‹€.

 

예λ₯Ό λ“€μ–΄ μ•„λž˜ μ½”λ“œλŠ” 문법 였λ₯˜κ°€ λ‚œλ‹€.

# introduce(name="지은", "data engineer")

 

즉, ν•¨μˆ˜ ν˜ΈμΆœμ—μ„œ κ°’ 전달 κ·œμΉ™μ΄ ν—·κ°ˆλ¦΄ λ•ŒλŠ” λ‹€μŒμ²˜λŸΌ κΈ°μ–΅ν•˜λ©΄ νŽΈν•˜λ‹€.

  • μˆœμ„œλŒ€λ‘œ λ„£μœΌλ©΄ μœ„μΉ˜ 인자
  • 이름을 μ§€μ •ν•˜λ©΄ ν‚€μ›Œλ“œ 인자
  • μ„žμ„ λ•ŒλŠ” μœ„μΉ˜ μΈμžκ°€ λ¨Όμ €

 

 

기본값이 μžˆλŠ” λ§€κ°œλ³€μˆ˜

ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ— 'κΈ°λ³Έκ°’(default value)'을 쀄 수 μžˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ ν˜ΈμΆœν•  λ•Œ 인자λ₯Ό μƒλž΅ν•΄λ„ ν•¨μˆ˜κ°€ λ™μž‘ν•œλ‹€.

def greet_user(name, message="ν™˜μ˜ν•©λ‹ˆλ‹€"):
    print(f"{name}λ‹˜, {message}!")

greet_user("지은")
greet_user("λ„μœ€", "μ˜€λŠ˜λ„ 쒋은 ν•˜λ£¨ λ³΄λ‚΄μ„Έμš”")

 

μ‹€ν–‰ κ²°κ³Ό

μ§€μ€λ‹˜, ν™˜μ˜ν•©λ‹ˆλ‹€!
λ„μœ€λ‹˜, μ˜€λŠ˜λ„ 쒋은 ν•˜λ£¨ λ³΄λ‚΄μ„Έμš”!

 

기본값은 맀우 자주 쓰인닀.

특히 μ˜΅μ…˜μ΄ λ§Žμ€ ν•¨μˆ˜μ—μ„œ 일뢀 κ°’λ§Œ λ°”κΎΈκ³  λ‚˜λ¨Έμ§€λŠ” κΈ°λ³Έ λ™μž‘μ„ μœ μ§€ν•˜κ³  싢을 λ•Œ μœ μš©ν•˜λ‹€.

 

λ‹€λ§Œ μ€‘μš”ν•œ κ·œμΉ™μ΄ ν•˜λ‚˜ μžˆλ‹€.

기본값이 μžˆλŠ” λ§€κ°œλ³€μˆ˜λŠ” λ°˜λ“œμ‹œ 였λ₯Έμͺ½μ— 와야 ν•œλ‹€.

 

즉, μ•„λž˜μ²˜λŸΌ μ“°λ©΄ μ•ˆ λœλ‹€.

# def wrong_example(message="μ•ˆλ…•", name):
#     print(name, message)

 

이 κ·œμΉ™μ€ λ‚˜μ€‘μ— ν•¨μˆ˜ μ •μ˜λ₯Ό 읽을 λ•Œλ„ μ€‘μš”ν•˜λ‹€.

μ™Όμͺ½μ—λŠ” 보톡 ν•„μˆ˜ μž…λ ₯, 였λ₯Έμͺ½μ—λŠ” 선택 μž…λ ₯이 μ˜¨λ‹€κ³  μ΄ν•΄ν•˜λ©΄ λœλ‹€.

 

 

λ°˜ν™˜κ°’(return)의 의미

ν•¨μˆ˜λŠ” λ‹¨μˆœνžˆ 화면에 좜λ ₯만 ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, κ²°κ³Όλ₯Ό ν˜ΈμΆœν•œ μͺ½μœΌλ‘œ 되돌렀 쀄 수 μžˆλ‹€.

κ·Έλ•Œ μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œκ°€ return 이닀.

def multiply(a, b):
    return a * b

result = multiply(6, 7)
print(result)

 

μ‹€ν–‰ κ²°κ³Ό

42

 

μ—¬κΈ°μ„œ print() 와 return 의 차이λ₯Ό λΆ„λͺ…νžˆ 이해해야 ν•œλ‹€.

  • print() λŠ” 화면에 λ³΄μ—¬μ£ΌλŠ” 것
  • return 은 값을 ν•¨μˆ˜ λ°–μœΌλ‘œ λŒλ €μ£ΌλŠ” 것

즉, ν•¨μˆ˜ κ²°κ³Όλ₯Ό λ‹€λ₯Έ κ³„μ‚°μ—μ„œ λ‹€μ‹œ μ‚¬μš©ν•˜λ €λ©΄ return 이 ν•„μš”ν•˜λ‹€.

 

 

μ—¬λŸ¬ 개의 값을 ν•œ λ²ˆμ— λ°˜ν™˜ν•˜κΈ°

 νŒŒμ΄μ¬μ—μ„œλŠ” λ‚΄λΆ€μ μœΌλ‘œ νŠœν”Œ ν˜•νƒœλ‘œ λ¬Άμ—¬ λ°˜ν™˜λœλ‹€.

def calc_scores(a, b):
    return a + b, a - b, a * b, a / b

all_result = calc_scores(20, 4)
print(all_result)

plus_result, minus_result, multiply_result, divide_result = calc_scores(20, 4)
print(plus_result)
print(divide_result)

 

μ‹€ν–‰ κ²°κ³Ό

(24, 16, 80, 5.0)
24
5.0

 

이처럼 μ—¬λŸ¬ 값을 λ°˜ν™˜ν•˜λ©΄, ν•„μš”ν•œ κ°’λ§Œ μ–ΈνŒ¨ν‚Ήν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

'4. [파이썬] νŠœν”Œκ³Ό νŒ¨ν‚Ή/μ–ΈνŒ¨ν‚Ή'을 μ½μ—ˆλ‹€λ©΄ 이 뢀뢄이 μžμ—°μŠ€λŸ½κ²Œ 이어진닀.

 

 

return을 λ§Œλ‚˜λ©΄ ν•¨μˆ˜λŠ” μ¦‰μ‹œ μ’…λ£Œλœλ‹€

def check_number(n):
    if n > 0:
        return "μ–‘μˆ˜"
    print("이 μ½”λ“œλŠ” n > 0일 λ•Œ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
    return "0 λ˜λŠ” 음수"

print(check_number(3))
print(check_number(-1))

 

μ‹€ν–‰ κ²°κ³Ό

μ–‘μˆ˜
이 μ½”λ“œλŠ” n > 0일 λ•Œ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
0 λ˜λŠ” 음수

 

즉, return μ•„λž˜μ— μžˆλŠ” μ½”λ“œκ°€ 항상 μ‹€ν–‰λœλ‹€κ³  μƒκ°ν•˜λ©΄ μ•ˆ λœλ‹€.

쑰건문과 ν•¨κ»˜ 쓰일 λ•ŒλŠ” 흐름을 잘 따라가야 ν•œλ‹€.

 

 

κ°€λ³€ 인자: *args

ν•¨μˆ˜μ— 전달할 인자의 κ°œμˆ˜κ°€ 맀번 λ‹¬λΌμ§ˆ 수 μžˆλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

이럴 λ•Œ μ‚¬μš©ν•˜λŠ” 것이 κ°€λ³€ μΈμžλ‹€.

def collect_numbers(*args):
    print(args)
    print(type(args))

collect_numbers(3)
collect_numbers(3, 6, 9, 12)

 

μ‹€ν–‰ κ²°κ³Ό

(3,)
<class 'tuple'>
(3, 6, 9, 12)
<class 'tuple'>

 

*args λŠ” μ—¬λŸ¬ 개의 μœ„μΉ˜ 인자λ₯Ό 'νŠœν”Œ'둜 λ¬Άμ–΄μ„œ λ°›λŠ”λ‹€.

즉, 인자의 κ°œμˆ˜κ°€ κ³ μ •λ˜μ–΄ μžˆμ§€ μ•Šμ€ ν•¨μˆ˜μ—μ„œ 맀우 μœ μš©ν•˜λ‹€.

 

예λ₯Ό λ“€μ–΄ 평균 계산 ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄ 훨씬 μžμ—°μŠ€λŸ½λ‹€.

def get_average(*numbers):
    if not numbers:
        return 0
    return sum(numbers) / len(numbers)

print(get_average(10, 20, 30))
print(get_average(5, 15, 25, 35, 45))
print(get_average())

 

μ‹€ν–‰ κ²°κ³Ό

20.0
25.0
0

 

κ°€λ³€ μΈμžλŠ” "μž…λ ₯ κ°œμˆ˜κ°€ 맀번 λ‹¬λΌμ§€λŠ” ν•¨μˆ˜"λ₯Ό λ§Œλ“€ λ•Œ 정말 자주 쓰인닀.

 

 

κ°€λ³€ ν‚€μ›Œλ“œ 인자: **kwargs

**kwargs λŠ” μ—¬λŸ¬ 개의 ν‚€μ›Œλ“œ 인자λ₯Ό 'λ”•μ…”λ„ˆλ¦¬'둜 λ¬Άμ–΄μ„œ λ°›λŠ”λ‹€.

def print_profile(**kwargs):
    print(kwargs)
    print(type(kwargs))

print_profile(name="지은", track="python", level="intermediate")

 

μ‹€ν–‰ κ²°κ³Ό

{'name': '지은', 'track': 'python', 'level': 'intermediate'}
<class 'dict'>

 

이 방식은 ν•¨μˆ˜κ°€ λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ λ°›μ•„μ•Ό ν•  λ•Œ μœ μš©ν•˜λ‹€.

예λ₯Ό λ“€μ–΄ μ„€μ •κ°’, μ‚¬μš©μž 정보, ν•„ν„° 쑰건 등을 μœ μ—°ν•˜κ²Œ λ°›κ³  싢을 λ•Œ 자주 μ‚¬μš©λœλ‹€.

 

 

*args 와 **kwargs λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜

λ‘˜μ„ ν•¨κ»˜ μ“°λ©΄ 맀우 μœ μ—°ν•œ ν•¨μˆ˜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

def log_event(*args, **kwargs):
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

log_event("login")
log_event("purchase", "success", user="user01", amount=32000)

 

μ‹€ν–‰ κ²°κ³Ό

args: ('login',)
kwargs: {}
args: ('purchase', 'success')
kwargs: {'user': 'user01', 'amount': 32000}

이런 ν˜•νƒœλŠ” μ§€κΈˆ λ‹¨κ³„μ—μ„œλŠ” 쑰금 μΆ”μƒμ μœΌλ‘œ λ³΄μ΄μ§€λ§Œ,

λ‚˜μ€‘μ— λ°μ½”λ ˆμ΄ν„°λ‚˜ API 처리, λ‘œκΉ… ν•¨μˆ˜, 래퍼 ν•¨μˆ˜λ₯Ό 배울 λ•Œ 맀우 자주 보게 λœλ‹€.

 

 

μ–ΈνŒ¨ν‚ΉμœΌλ‘œ ν•¨μˆ˜μ— κ°’ μ „λ‹¬ν•˜κΈ°

λ¦¬μŠ€νŠΈλ‚˜ λ”•μ…”λ„ˆλ¦¬λ₯Ό ν’€μ–΄μ„œ ν•¨μˆ˜ 인자둜 μ „λ‹¬ν•˜λŠ” 'μ–ΈνŒ¨ν‚Ή(unpacking)'에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

def calculate_total(a, b, c):
    return a + b + c

values = [100, 200, 300]
print(calculate_total(*values))

options = {"a": 7, "b": 8, "c": 9}
print(calculate_total(**options))

 

μ‹€ν–‰ κ²°κ³Ό

600
24

 

μ—¬κΈ°μ„œ 핡심은 이것이닀.

  • *리슀트 : μœ„μΉ˜ 인자둜 ν’€μ–΄μ„œ 전달
  • **λ”•μ…”λ„ˆλ¦¬ : ν‚€μ›Œλ“œ 인자둜 ν’€μ–΄μ„œ 전달

이 κ°œλ…μ€ ν•¨μˆ˜ μ •μ˜μ—μ„œμ˜ *args, **kwargs 와 μ—°κ²°λœλ‹€.

 

μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • ν•¨μˆ˜ μ •μ˜μ—μ„œ *, ** λŠ” μ—¬λŸ¬ 값을 λ°›κΈ° μœ„ν•œ 문법
  • ν•¨μˆ˜ ν˜ΈμΆœμ—μ„œ *, ** λŠ” 묢인 값을 ν’€μ–΄μ£ΌκΈ° μœ„ν•œ 문법

 

 

데이터 전달 방식: 객체 참쑰에 μ˜ν•œ 전달(Call by Object Reference)

Python은 ν”νžˆ "call by value냐, call by reference냐" 같은 질문으둜 μ„€λͺ…λ˜κ³€ ν•˜μ§€λ§Œ,

더 μ •ν™•νžˆλŠ” 객체참쑰(call by object reference, call by sharing) λ°©μ‹μœΌλ‘œ μ΄ν•΄ν•˜λŠ” 편이 μ’‹λ‹€.

 

핡심은 이렇닀.

  • λΆˆλ³€ 객체(int, str, tuple λ“±)λŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ 값을 λ‹€μ‹œ λŒ€μž…ν•΄λ„ 원본이 λ°”λ€Œμ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ 보인닀.
  • κ°€λ³€ 객체(list, dict, set λ“±)λŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ λ‚΄λΆ€λ₯Ό μˆ˜μ •ν•˜λ©΄ 원본도 바뀐닀.

λ¨Όμ € λΆˆλ³€ 객체λ₯Ό 보자.

def change_number(value):
    value = 999

num = 100
change_number(num)
print(num)

 

μ‹€ν–‰ κ²°κ³Ό

100

 

μ΄λ²ˆμ—λŠ” κ°€λ³€ 객체닀.

def update_items(items):
    items.append("streamlit")

topics = ["python", "sql"]
update_items(topics)
print(topics)

 

μ‹€ν–‰ κ²°κ³Ό

['python', 'sql', 'streamlit']

 

 

이 μ°¨μ΄λŠ” 이후에 mutable vs immutable, λ©”λͺ¨λ¦¬ ꡬ쑰, 얕은 볡사/κΉŠμ€ 볡사λ₯Ό 배울 λ•Œ 맀우 μ€‘μš”ν•΄μ§„λ‹€.

 

 

ν•¨μˆ˜ μ•ˆμ—μ„œ 원본을 λ°”κΎΈκ³  μ‹Άμ§€ μ•Šμ„ λ•Œ

κ°€λ³€ 객체λ₯Ό ν•¨μˆ˜μ— λ„˜κΈΈ λ•ŒλŠ” 원본이 λ°”λ€” 수 있기 λ•Œλ¬Έμ— μ£Όμ˜κ°€ ν•„μš”ν•˜λ‹€.

원본 λ³΄ν˜Έκ°€ ν•„μš”ν•˜λ‹€λ©΄ 볡사본을 λ§Œλ“€μ–΄ μ²˜λ¦¬ν•˜λŠ” 방법을 많이 μ“΄λ‹€.

def add_subject_safely(subjects):
    copied = subjects.copy()
    copied.append("docker")
    return copied

original_subjects = ["python", "sql"]
new_subjects = add_subject_safely(original_subjects)

print("원본:", original_subjects)
print("μƒˆ κ²°κ³Ό:", new_subjects)

 

μ‹€ν–‰ κ²°κ³Ό

원본: ['python', 'sql']
μƒˆ κ²°κ³Ό: ['python', 'sql', 'docker']

 

이처럼 ν•¨μˆ˜κ°€ μž…λ ₯ 데이터λ₯Ό λ°”κΎΈλŠ”μ§€, μ•„λ‹ˆλ©΄ μƒˆ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ 성격이 달라진닀.

μ‹€λ¬΄μ—μ„œλŠ” 이런 차이가 버그와 μ§κ²°λ˜λŠ” κ²½μš°κ°€ μž¦λ‹€κ³  ν•œλ‹€.

 

 

νƒ€μž… 힌트(Type Hint)

Python은 동적 타이핑 언어이기 λ•Œλ¬Έμ— λ³€μˆ˜λ‚˜ ν•¨μˆ˜κ°€ νŠΉμ • νƒ€μž…λ§Œ κ°•μ œν•˜λŠ” μ–Έμ–΄λŠ” μ•„λ‹ˆλ‹€.

ν•˜μ§€λ§Œ νƒ€μž… 힌트λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ μ˜λ„λ₯Ό 더 λΆ„λͺ…νžˆ λ“œλŸ¬λ‚Ό 수 있고, μ—λ””ν„°λ‚˜ 정적 뢄석 λ„κ΅¬μ˜ 도움도 받을 수 μžˆλ‹€.

def repeat_message(message: str, count: int) -> str:
    return message * count

result = repeat_message("파이썬", 3)
print(result)

 

μ‹€ν–‰ κ²°κ³Ό

파이썬파이썬파이썬

 

ν•¨μˆ˜ μ •μ˜μ—μ„œ 각각 νƒ€μž… 힌트λ₯Ό μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • λ§€κ°œλ³€μˆ˜ λ’€μ˜ : str, : int
  • ν•¨μˆ˜ μ„ μ–Έ λ’€μ˜ -> str

κΈ°μ–΅ν•΄μ•Ό ν•  점은 νƒ€μž… νžŒνŠΈλŠ” κ°€μ΄λ“œμΌ 뿐, 파이썬 인터프리터가 κ°•μ œν•˜μ§€λŠ” μ•ŠλŠ”λ‹€λŠ” 점이닀.

 

예λ₯Ό λ“€μ–΄ μ•„λž˜ μ½”λ“œλŠ” νžŒνŠΈμ™€ λ‹€λ₯΄κ²Œ 값을 μ „λ‹¬ν–ˆμ§€λ§Œ, 문법 μžμ²΄λ‘œλŠ” 싀행될 수 μžˆλ‹€.

def repeat_message(message: str, count: int) -> str:
    return message * count

print(repeat_message(10, 2))

 

μ‹€ν–‰ κ²°κ³Ό

20

 

μ™œ 이런 κ²°κ³Όκ°€ λ‚˜μ˜¬κΉŒ?

10 * 2 λŠ” νŒŒμ΄μ¬μ—μ„œ κ°€λŠ₯ν•œ 연산이기 λ•Œλ¬Έμ΄λ‹€.

즉, νƒ€μž… νžŒνŠΈλŠ” λ¬Έμ„œλ₯Ό 읽기 μ‰½κ²Œ λ§Œλ“€κ³  λ„κ΅¬μ˜ 도움을 λ°›κ²Œ ν•΄μ£Όμ§€λ§Œ, κ·Έ μžμ²΄κ°€ λŸ°νƒ€μž„ κ°•μ œ κ·œμΉ™μ€ μ•„λ‹ˆλ‹€.

 

 

λ³΅μž‘ν•œ μžλ£Œν˜•μ—λ„ μ“Έ 수 μžˆλŠ” νƒ€μž… 힌트

ν•¨μˆ˜λΏ μ•„λ‹ˆλΌ λ³€μˆ˜μ—λ„ νƒ€μž… 힌트λ₯Ό μ“Έ 수있고, λ¦¬μŠ€νŠΈλ‚˜ λ”•μ…”λ„ˆλ¦¬ 같은 볡합 μžλ£Œν˜•λ„ ν‘œν˜„ν•  수 μžˆλ‹€.

scores: list[int] = [85, 90, 100]
user_info: dict[str, str | int] = {"name": "철수", "age": 36}

print(scores)
print(user_info)

 

μ‹€ν–‰ κ²°κ³Ό

[85, 90, 100]
{'name': '철수', 'age': 36}

 

 

λ§€κ°œλ³€μˆ˜ μž‘μ„±μ˜ μ€‘μš”μ„±

Python ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λŠ” 보톡 λ‹€μŒ μˆœμ„œλ₯Ό 많이 λ”°λ₯Έλ‹€.

쀑급 λ‹¨κ³„λ‘œ 갈수둝 "μ–΄λ–€ 값은 μœ„μΉ˜λ‘œλ§Œ λ°›κ³ , μ–΄λ–€ 값은 μ΄λ¦„μœΌλ‘œλ§Œ λ°›κ²Œ" μ„€κ³„ν•˜λŠ” 것이 μ€‘μš”ν•΄μ§„λ‹€.

아직 λ„ˆλ¬΄ 깊게 λ“€μ–΄κ°ˆ ν•„μš”λŠ” μ—†μ§€λ§Œ, μ•„λž˜ 예제 μ •λ„λŠ” μ•Œμ•„λ‘λ©΄ μ’‹λ‹€.

def create_account(user_id, role="viewer", *, active=True):
    print(f"user_id={user_id}, role={role}, active={active}")

create_account("user01")
create_account("user02", role="editor", active=False)

 

μ‹€ν–‰ κ²°κ³Ό

user_id=user01, role=viewer, active=True
user_id=user02, role=editor, active=False

 

μ—¬κΈ°μ„œ * 뒀에 μ˜€λŠ” active λŠ” ν‚€μ›Œλ“œλ‘œλ§Œ 전달해야 ν•˜λŠ” λ§€κ°œλ³€μˆ˜λ‹€.

이 문법은 라이브러리 ν•¨μˆ˜λ‚˜ ν”„λ ˆμž„μ›Œν¬ μ½”λ“œμ—μ„œλ„ 자주 보인닀.

 

 

싀무 감각으둜 λ³΄λŠ” ν•¨μˆ˜ 섀계

쒋은 ν•¨μˆ˜λŠ” λ‹¨μˆœνžˆ "λ™μž‘ν•˜λŠ” ν•¨μˆ˜"κ°€ μ•„λ‹ˆλΌ, 역할이 λΆ„λͺ…ν•œ ν•¨μˆ˜λ‹€.

예λ₯Ό λ“€μ–΄ μ•„λž˜μ²˜λŸΌ μž‘μ„±ν•˜λ©΄ μ˜λ―Έκ°€ 비ꡐ적 λΆ„λͺ…ν•˜λ‹€.

def calculate_discounted_price(price, discount_rate=0.1):
    return price * (1 - discount_rate)

final_price = calculate_discounted_price(50000)
vip_price = calculate_discounted_price(50000, 0.2)

print(final_price)
print(vip_price)

 

μ‹€ν–‰ κ²°κ³Ό

45000.0
40000.0

 

 

μ‹€μˆ˜ν•˜κΈ° μ‰¬μš΄ 포인트

첫째, λ§€κ°œλ³€μˆ˜μ™€ 인자λ₯Ό ν˜Όλ™ν•˜κΈ° 쉽닀.

ν•¨μˆ˜ μ •μ˜ μͺ½μ— μžˆλŠ” 이름은 λ§€κ°œλ³€μˆ˜(parameter), 호좜 μ‹œ μ‹€μ œλ‘œ μ „λ‹¬ν•˜λŠ” 값은 인자(argument)λ‹€.

 

λ‘˜μ§Έ, print() 와 return 은 λ‹€λ₯΄λ‹€.

print() λŠ” λ³΄μ—¬μ£ΌλŠ” 것이고, return 은 λŒλ €μ£ΌλŠ” 것이닀.

화면에 좜λ ₯만 되고 λ³€μˆ˜μ— μ €μž₯λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ return을 놓쳀을 κ°€λŠ₯성이 크닀.

 

μ…‹μ§Έ, κΈ°λ³Έκ°’ λ§€κ°œλ³€μˆ˜λŠ” 였λ₯Έμͺ½μ— 와야 ν•œλ‹€.

ν•¨μˆ˜ μ •μ˜ μˆœμ„œλ₯Ό 잘λͺ» μ“°λ©΄ 문법 였λ₯˜κ°€ λ‚œλ‹€.

 

λ„·μ§Έ, κ°€λ³€ 객체λ₯Ό ν•¨μˆ˜μ— μ „λ‹¬ν•˜λ©΄ 원본이 λ°”λ€” 수 μžˆλ‹€.

특히 리슀트, λ”•μ…”λ„ˆλ¦¬, μ„ΈνŠΈλŠ” ν•¨μˆ˜ λ‚΄λΆ€ μˆ˜μ •μ΄ 원본에 반영될 수 μžˆμœΌλ‹ˆ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

 

λ‹€μ„―μ§Έ, *args λŠ” νŠœν”Œ, **kwargs λŠ” λ”•μ…”λ„ˆλ¦¬λ‘œ λ°›λŠ”λ‹€.

μ •μ˜μ™€ ν˜ΈμΆœμ—μ„œμ˜ *, ** 역할도 ꡬ뢄해야 ν•œλ‹€.

 

μ—¬μ„―μ§Έ, νƒ€μž… νžŒνŠΈλŠ” κ°•μ œκ°€ μ•„λ‹ˆλΌ μ•ˆλ‚΄λ‹€.

힌트λ₯Ό μ μ—ˆλ‹€κ³  μžλ™μœΌλ‘œ νƒ€μž… 였λ₯˜κ°€ λ§‰νžˆλŠ” 것은 μ•„λ‹ˆλ‹€.

 

 

마무리

ν•¨μˆ˜λŠ” 파이썬 문법 μ€‘μ—μ„œλ„ 정말 μ€‘μš”ν•œ μ „ν™˜μ μ΄λ‹€.

쑰건문과 λ°˜λ³΅λ¬ΈκΉŒμ§€κ°€ "μ½”λ“œλ₯Ό μˆœμ„œλŒ€λ‘œ μž‘μ„±ν•˜λŠ” 단계"μ˜€λ‹€λ©΄, ν•¨μˆ˜λΆ€ν„°λŠ” "κΈ°λŠ₯을 λ‚˜λˆ„κ³  μž¬μ‚¬μš©ν•˜λŠ” 단계"둜 λ„˜μ–΄κ°„λ‹€κ³  λ³Ό 수 μžˆλ‹€.

 

이번 κΈ€μ—μ„œλŠ” ν•¨μˆ˜μ˜ κ°€μž₯ 기본적인 μ •μ˜μ™€ ν˜ΈμΆœμ—μ„œ μ‹œμž‘ν•΄μ„œ, λ§€κ°œλ³€μˆ˜μ™€ 인자, μœ„μΉ˜ μΈμžμ™€ ν‚€μ›Œλ“œ 인자, κΈ°λ³Έκ°’, λ°˜ν™˜κ°’, μ—¬λŸ¬ κ°’ λ°˜ν™˜, κ°€λ³€ 인자, μ–ΈνŒ¨ν‚Ή, 객체 μ°Έμ‘° 방식, νƒ€μž… νžŒνŠΈκΉŒμ§€ ν•¨κ»˜ μ •λ¦¬ν–ˆλ‹€.

 

특히 ν•¨μˆ˜λŠ” 문법을 μ™Έμš°λŠ” 것보닀 μž…λ ₯은 무엇이고, ν•¨μˆ˜κ°€ ν•˜λŠ” 일은 무엇이며, κ²°κ³Όλ₯Ό μ–΄λ–»κ²Œ λŒλ €μ£ΌλŠ”κ°€λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

 

이 흐름에 μ΅μˆ™ν•΄μ§€λ©΄ λ‹€μŒμ— λ‹€λ£° ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°, iterator/generator, 클래슀 λ©”μ†Œλ“œ, λ°μ½”λ ˆμ΄ν„° 같은 μ£Όμ œλ„ 훨씬 μˆ˜μ›”ν•˜κ²Œ 받아듀일 수 μžˆλ‹€.

 

 

'Python & SQL > Python Basics' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

10. [파이썬] mutable vs immutable  (0) 2026.03.07
9. [파이썬] iterator와 generator  (0) 2026.03.07
6. [파이썬] setκ³Ό frozenset  (0) 2026.03.07
5. [파이썬] λ”•μ…”λ„ˆλ¦¬  (0) 2026.03.06
4. [파이썬] νŠœν”Œκ³Ό νŒ¨ν‚Ή/μ–ΈνŒ¨ν‚Ή  (0) 2026.03.06
'Python & SQL/Python Basics' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • 10. [파이썬] mutable vs immutable
  • 9. [파이썬] iterator와 generator
  • 6. [파이썬] setκ³Ό frozenset
  • 5. [파이썬] λ”•μ…”λ„ˆλ¦¬
J. Son
J. Son
Petit à petit l'oiseau fait son nid.
  • J. Son
    Steady Study Log
    J. Son
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (170) N
      • Python & SQL (63)
        • Python Basics (21)
        • Python Problems (23)
        • Python Practice (11)
        • MySQL (1)
        • Git & GitHub (7)
      • ML & DL (7) N
      • Projects (5)
        • Project Portfolio (5)
      • AI Camp (4)
        • Camp Reflection (4)
      • Concept Notes (6)
        • Statistics & Stata (4)
        • Mathematics (2)
      • Archive (84)
        • Java (24)
        • R (1)
        • Languages (49)
        • Miscellaneous (10)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • λ°©λͺ…둝
  • 링크

    • GitHub
    • WikiDocs
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    파이썬 크둀링
    python streamlit
    Le Petit Prince
    λΆˆμ–΄ κ΄€κ³„λŒ€λͺ…사
    GIT
    Stata
    볡합과거
    machine learning
    μ–΄λ¦°μ™•μž ν”„λž‘μŠ€μ–΄
    객체
    λ¨Έμ‹ λŸ¬λ‹
    μ ν”„νˆ¬νŒŒμ΄μ¬ μ—°μŠ΅λ¬Έμ œ
    streamlit
    μ–΄λ¦°μ™•μž λΆˆμ–΄
    파이썬 문제
    μ ν”„νˆ¬νŒŒμ΄μ¬ μ—°μŠ΅λ¬Έμ œ 풀이
    passe compose
    ν”„λ‘œμ νŠΈ 였일러
    MySQL
    파이썬 streamlit
    μžλ°”
    초보자λ₯Ό μœ„ν•œ 파이썬 300제
    Python
    Github
    λΆˆμ–΄ 곡뢀
    ν”„λž‘μŠ€μ–΄ 곡뢀
    python problem
    파이썬
    λ§₯ git
    share.streamlit.io
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.6
J. Son
7. [파이썬] ν•¨μˆ˜ κΈ°μ΄ˆμ™€ λ§€κ°œλ³€μˆ˜
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”