250722 [ Day 12 ] - Python (9)

TaeHyun·2025년 7월 22일

TIL

목록 보기
12/182

시작하며

어제에 이어 오늘도 함수에 대해 공부했다. 내용이 많아서 완벽하게 이해하려면 복습을 철저히 하고, 매개변수와 인자를 활용하는 방법도 다양해서 연습을 많이 해봐야 익숙해질 것 같다.

함수 (Function)


매개변수와 인자

  • 위치 인자 (Positional Arguments)
    • 인자의 순서대로 매개변수에 대응되는 방식 → 가장 일반적이고 기본적인 전달 방법

      def add(a, b):
      	return a + b
      	
      add(10, 20) # 10 = a, 20 = b에 대응

  • 키워드 인자 (Keyword Arguments)
    • 인자의 이름을 명시하여 전달하는 방식

    • 순서와 무관하게 매개변수에 대응 가능 → 인자의 순서를 헷갈릴 때 안전하게 사용

      def introduce(name, age):
      	return(f"")

  • 기본값 인자 (Default Arguments)
    • 기본값 매개변수는 뒤쪽에 위치해야함 (SyntaxError 발생)

      def greet(name, message="안녕하세요!"):
          return(f"{name}{message}")
      
      print(greet("taehyun"))
      print(greet("taehyun", "반갑습니다"))
      # taehyun님 안녕하세요!
      # taehyun님 반갑습니다

  • 위치 가변 인자 (*args)
    • 여러개의 값을 유동적으로 받을 수 있음

    • 값이 튜플 형태로 받아짐

      def add_all(*args):
          return sum(args)
      
      add_all(1,2,3,4,5)
      # 15

  • 키워드 가변 인자 (**kwargs)
    • 여러 키워드 인자를 유동적으로 받을 수 있음

    • 딕셔너리 형태로 값이 입력

      def print_info(**kwargs):
          for key, value in kwargs.items():
              print(f"{key} : {value}")
      
      print_info(name="taehyun", age="27", city="서울", job="student")
      # name : taehyun
      # age : 27
      # city : 서울
      # job : student

여러 가변인자를 한번에 사용 가능
단, 순서가 맞아야 가능
위치인자 → 키워드인자 → *args → **kwargs

  • 객체 참조에 의한 전달
    - 가변 자료형 : 함수 내 변경 → 외부(원본)도 영향
    - 불변 자료형 : 함수 내 변경 → 외부(원본) 영향 없음

메모리 구조

함수의 메모리 구조 = 스택 (Stack) 구조

  • first in last out
def deep_func():
    print("더 안쪽 함수")

def inner_func():
    deep_func()
    print("안쪽 함수")

def outter_func():
    inner_func()
    print("바깥쪽 함수")

outter_func()
# 더 안쪽 함수
# 안쪽 함수
# 바깥쪽 함수

반대되는 구조 = 큐 방식

  • first in first out

변수의 유효 범위 (Scope)

스코프 (Scope) : 어떤 이름 (변수, 함수 등)을 참조할 수 있는 코드의 범위

  • 파이썬 이름 탐색 규칙 : LEGB
    1. Local (지역 스코프 : 함수 내)
    2. Enclosing (내포된 함수의 스코프)
    3. Global (모듈 단위)
    4. Built-in (내장 이름들, len, sum 등)

지역변수와 전역변수

  • 전역변수 : 함수 밖에 선언된 변수
  • 지역변수 : 함수 안에 선언된 변수
x = 100 # 전역 변수

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

def any_func():
    x = 20 # 이름이 같아도 지역이 다르면 다른 변수
    print(x)
# 함수안의 함수의 관점에서 자신이 Local 위의 함수가 Enclosing 그 이후가 Global 그 이후의 python 전체를 built-in

  • 함수에서 전역변수를 사용하는 경우
    • 권장하지 않는 패턴
      x = 10
      
      def my_func():
          global x
          x += 5
          print("지역", x)
      
      my_func()
      print("전역", x)
      # 지역 15
      # 전역 15
    • 권장하지 않는 패턴 2
      x = 10
      
      def func1():
          global x
          x += 10
      
      def func2():
          global x
          x *= 2
      
      func1()
      func2()
      
      print(x)
  • 보통의 경우, 변수의 변경을 시도하는 것은 하나의 경로를 따라서 변경
    • 권장하는 패턴

      x = 10
      
      def my_func(x): # 매개변수는 지역에 존재
          x += 5
          return x
      
      x = my_func(x)
      
      print("전역", x)
      # 전역 15
  • 부수효과(side effect)를 발생시키지 않는 함수(순수 함수)를 위주로 프로그래밍을 하는 것

실습 문제

# 1. 숫자 여러 개의 평균 구하기
def average(*args):
    # 예외처리
    if len(args) == 0:
        return 0
    return sum(args) / len(args)
print(average(10,20,30,40))
# 2. 가장 긴 문자열 찾기

# 방법 1
def max_word(*args):
    answer = ""
    for s in args:
        if len(s) > len(answer):
            answer = s
    return answer

print(max_word("apple", "banana", "watermelon", "orange"))

# 방법 2
def max_word2(*args):
    return max(args, key=len)

print(max_word2("apple", "banana", "watermelon", "orange"))
# 3. 사용자 정보 출력 함수

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key} : {value}")

print_info(name="taehyun", age="27", city="서울")
# 4. 할인 계산기

def items_list(**kwargs):
    for key, value in kwargs.items():
        value *= 0.9
        print(f"{key} : {value}")

items_list(a=10000, b=25000)
current_user = ""

def login(name):
    global current_user

    if current_user == "": # == / is로 사용 가능
        current_user = name
        print(f"{name}님 로그인 성공")
    else:
        print("이미 로그인되어 있습니다.")

def logout():
    global current_user

    current_user = ""
    print("로그아웃되었습니다.")

login("taehyun")
login("taehyun_test")
logout()
login("taehyun_test")
print(current_user)

마치며

함수 파트는 개념 정리도 쉽지 않지만, 문제 풀이에서는 응용력이 많이 요구되어 지금은 더 어렵게 느껴지는 것 같다.
특히 매개변수와 인자를 다루는 부분은 내용도 많고 서로 비슷한 부분도 있어서, 계속 문제를 풀어보며 원리를 이해하려고 노력해야 할 것 같다.
또한, 가변 인자인 *args와 **kwargs도 앞으로 꾸준히 연습해봐야겠다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글