Python_기초문법4

Jingi·2024년 1월 17일

Python

목록 보기
4/32
post-thumbnail

1. 함수

  • 특정 작업을 수행하기 위한 재사용 가능한 코드 묶음
  • 함수를 사용하는 이유?
    - 두 수의 합을 구하는 함수를 정의하고 사용함으로써 코드의 중복을 방지
    - 재사용성이 높아지고, 코드의 가독성과 유지보수성 향상

2. 내장 함수

  • 파이썬이 기본적으로 제공하는 함수

  • (별도의 import 없이 바로 사용 가능)

  • 내장 함수를 만드는 예시

    # abs 함수 호출의 반환 값을 result에 할당
    
    result = abs(-1)
    print(result)
  • 함수 호출(function call)
    - 함수를 실행하기 위해 함수의 이름을 사용하여 해당 함수의 코드 블록을 실행하는 것

3. 함수의 구조


참조

  • 함수의 정의

    • 함수 정의는 def 키워드로 시작
    • def 키워드 이후 함수 이름 작성
    • 괄호안에 매개변수를 정의할 수 있음
    • 매개변수(parameter)는 함수에 전달되는 값을 나타냄
  • 함수 body

    • 콜론(:) 다음에 들여쓰기 된 코드 블록
    • 함수가 실행 될 때 수행되는 코드를 정의
    • Docstring은 함수 body 앞에 선택적으로 작성 가능한 함수 설명서
  • 함수 반환 값

    • 함수는 필요한 경우 결과를 반환할 수 있음
    • retrun 키워드 이후에 반환할 값을 명시
    • return 문은 함수의 실행을 종료하고, 결과를 호출 부분으로 반환
  • 함수 호출
    - 함수를 호출하기 위해서는 함수의 이름과 필요한 인자(argument)를 전달해야 함
    - 호출 부분에서 전달된 인자는 함수 정의 시 작성한 매개변수에 대입됨

4. 매개변수와 인자

  • 매개변수(parameter)
    • 함수를 정의 할 때, 함수가 받을 값을 나타내는 변수
  • 인자(argument)
    - 함수를 호출할 때, 실제로 전달되는 값

5. 인자의 종류

  • 위치인자(Positional Arguments)

    • 함수 호출 시 인자의 위치에 따라 전달되는 인자

    • 위치인자는 함수 호출 시 반드시 값을 전달해야 함

      def hi(name, age):
        print(f'안녕, {name}야! 너는 {age}살이구나!')
      
      hi('jingi', 25) # 안녕 jingi야! 너는 25살이구나!
      
  • 기본 인자 값(Default Argument Values)

    • 함수 정의에서 매개변수에 기본 값을 할당하는 것

    • 함수 호출 시 인자를 전달하지 않으면, 기본값이 매개변수에 할당 됨

      def hi(name, age = 50):
        print(f'안녕, {name}야! 너는 {age}살이구나!')
      hi('Ye') # 안녕 Ye야! 너는 50살이구나 !
      hi('jingi', 25) # 안녕 jingi야! 너는 25살이구나!
      
  • 키워드 인자(Keyword Arguments)

    • 함수 호출 시 인자의 이름과 함께 값을 전달하는 인자

    • 매개변수와 인자를 일치시키지 않고, 특정 매개변수에 값을 할당할 수 있음

    • 인자의 순서는 중요하지 않으며, 인자의 이름을 명시하여 전달

    • 단 , 호출 시 키워드 인자는 위치 인자 뒤에 위치해야함

      def hi(name, age):
        print(f'안녕, {name}야! 너는 {age}살이구나!')
      
      hi(name = 'jingi', age = 25) # 안녕 jingi야! 너는 25살이구나!
      hi(age = 25, name = 'jingi') # 안녕 jingi야! 너는 25살이구나!      
  • 임의의 인자 목록(Arbitrary Argument Lists)

    case 1

    • 정해지지 않은 개수의 인자를 처리하는 인자

    • 함수 정의시 매개변수 앞에 '*'를 붙여 사용하며, 여러 개의 인자를 tuple로 처리

      def cal_sum(*args):
        print(args)
        total = sum(args)
        print(f'합계: {total}')
      # (1, 2, 3)
      # 합계 : 6
      
      cal_sum(1, 2, 3)
      

    case 2

    • 정해지지 않은 개수의 키워드 인자를 처리하는 인자

    • 함수 정의 시 매개변수 앞에 '**' 를 붙여 사용하며, 여러 개의 인자를 dictionary로 묶어 처리

      def info(**kargs):
        print(kargs)
      
      info(name='jin', age=25) # ('name' : 'jin', 'age' : 25)
  • 함수 인자 권장 작성순서

    • 위치 ⇒ 기본 ⇒ 가변 ⇒ 키워드
    • 호출 시 인자를 전달하는 과정에서 혼란을 줄일 수 있도록 함
    • 단, 절대적인 규칙은 아니며, 상황에 따라 조정 가능
      def func(pos1, pos2, default_arg='default', *args, **kargs):
        ---
  • Docstring

    • 독스트링은 함수 선언 시, def 바로 다음 줄에서 시작해서 첫 줄에는 함수의 목적을, 다음 단락부터는 세부적인 함수의 동작에 대한 설명이나 인자, 반환 값 그리고 외부에서 처리되어야 하는 예외에 대해서 설명하는 주석을 말한다.

      def function(arg1, arg2) :
        """함수 설명 부분
      
        Args:
            arg1: 매개변수 1 설명
            arg2: 매개변수 2 설명
      
        Returns:
            반환값 설명
      
        """
        return True

6. 함수와 Scope

  • Python의 범위(Scope)

  • 함수는 코드 내부에 local scope를 생성하며, 그 외의 공간인 global scope로 구분

  • scope

    • global scope : 코드 어디에서든 참조할 수 있는 공간
    • local scope : 함수가 만든 scope (함수 내부에서만 참조 가능)
  • variable

    • golbal variable : global scope에 정의된 변수
    • local varuable : local scope에 정의된 변수
  • scope 예시

    • num은 local scope에 존재하기 떄문에 global에서 사용할 수 없음

    • 이는 변수의 수명주기와 연관이 있음

      def func():
        num = 20
        print('local', num) # local 20
      
      func()
      
      print('global', num) # NameError: name 'num' is not defined
      
  • 변수 수명 주기(lifecycle)

    • 변수의 수명 주기는 변수가 선언되는 위치와 스코프에 따라 결정됨
    1. built in scope
      • 파이썬이 실행된 이후부터 영원히 유지
    2. global scope
      • 모듈이 호출된 시점 이후 혹은 인터프리터가 끝날 때까지 유지
    3. local scope
      • 함수가 호출될 때 생성되고, 함수가 종료될 때까지 유지
  • 'global' 키워드

    • 변수의 스코프를 전역 범위로 지정하기 위해 사용

    • 일반적으로 함수 내에서 전역 변수를 수정하려는 경우에 사용

      num = 0 # 전역변수
      def increment():
        gobal num # num을 전역변수로
        num += 1
      
      print(num) # 0
      increment()
      print(num) # 1
      
    • 주의사항

      # Case 1 : global 키워드 선언 전에 접근시
      num = 0
      def increment():
        # SynatxError: name 'num' is used prior to global declaration
        print(num)
        global num
        num += 1
        # Case 2 : 매개 변수에 global 사용불가       
        num = 0
      
        def increment(num):
          # "num" is assigned before global declarartion
          global num
          num += 1
      
    • global 키워드는 가급적 사용하지 않는 것을 권장

    • 함수로 값을 바꾸고자 한다면 항상 인자로 넘기고 함수의 반환 값을 사용하는 것을 권장


7. 재귀함수

  • 함수 내부에서 자기 자신을 호출하는 함수

  • 재귀 함수 특징

    • 특정 알고리즘 식을 표현할 때 변수의 사용이 줄어들며, 코드의 가독성이 높아짐

    • 1개 이상의 base case(종료되는 상황)가 존재하고, 수렴하도록 작성

    • 예시

      def factorial(n):
        # 종료 조건 : n이 0이면 1반환
        if n == 0:
          return 1
        return n * factorial(n - 1)
      
      # 팩토리얼 계산 예시
      result = factorial(5)
      print(result) # 120

    중요

    1. 종료조건을 명확히
    2. 반복되는 호출이 종료조건을 향하도록

8. 유용한 함수

  • map(function, iterable)

    • 순회 가능한 데이터구조(iterable)의 모든 요소에 함수를 적용하고, 그 결과를 map object로 반환

      numbers = [1, 2, 3]
      result = map(str, numbers)
      
      print(result)
      print(list(result)) ['1', '2', '3']
      
  • zip(*iterables)

    • 임의의 iterable을 모아 튜플을 원소로 하는 zip object로 반환

    • *iterables로 되어있는 것을 통해 여러개의 가변인자를 받을 수 있다는 것을 알 수 있다.

      girls = ['jin', 'gi']
      boys = ['peter', 'jay']
      pair = zip(girls, boys)
      
      print(pair) # <zip object at 0x000001C76DE58700>
      print(list(pair)) # [('jin', 'peter'),('gi', 'jay')]
      
  • lambda 함수

    • 이름 없이 정의되고 사용되는 익명 함수

    • 함수 구조

      lambda 매개변수 : 표현식
    • lambda 키워드

      • 람다 함수를 선언하기 위해 사용되는 키워드
    • 매개변수

      • 함수에 전달되는 매개변수 들
      • 여러 개의 매개변수가 있을 경우 쉼표로 구분
    • 표현식

      • 함수의 실행되는 코드블록으로, 결과값을 반환하는 표현식으로 작성
    • 사용 예시

      # Case 1
      def addition(x, y):
        return x + y
      
      result = addition(3,5)
      print(result) # 8
      
            ↓
      
      addition = lambda x, y : x +y
      result = addition(3, 5)
      print(result) # 8
      
      numbers = [1, 2, 3, 4, 5]
      # Case 2
      def funcx(x):
        return x ** 2
      
      result = list(map(funcx, numbers))
      print(result) # [1, 4, 9, 16, 25]
      
      result2 = list(map(lambda x : x ** 2, numbers))
      print(result2) # [1, 4, 9, 16, 25]

9. Packing

  • 여러 개의 값을 하나의 변수에 묶어서 담는 것

  • 패킹 예시

    # 변수에 담긴 값들은 튜플 형태로 묶임
    packed_values = 1, 2, 3, 4, 5
    print(packed_values) #(1, 2, 3, 4, 5)
  • '*'을 활용한 패킹

    numbers = [1, 2, 3, 4, 5]
    a, *b, c = numbers
    
    print(a) # 1
    print(b) # [2, 3, 4]
    print(c) # 5
    
    # print 함수에서 임의의 가변 인자를 작성할 수 있었던 이유
    # 인자의 개수에 상관없이 튜플 하나로 패킹 되어서 내부에서 처리
    def my_func(*objects):
      print(objects) # (1, 2, 3, 4, 5)
      print(type(objects)) # <class 'tuple'>
    
    my_func(1, 2, 3, 4, 5)
    # (1, 2, 3, 4, 5)
    # <class 'tuple'>

10. Unpacking

  • 패킹된 변수의 값을 개별적인 변수로 분리하여 할당하는 것

  • 예시

    # 튜플이나 리스트 등의 객체의 요소들을 개별 변수에 할당
    packed_values = 1, 2, 3, 4, 5
    a, b, c, d, e = packed_values
    print(a, b, c, d, e) # 1 2 3 4 5
  • '*'을 활용한 언패킹

    names = ['alice', 'jane', 'peter']
    print(*names) # alice jane peter
  • '**'을 활용한 언패킹

    # **는 딕셔너리의 키-값 쌍을 함수의 키워드 인자로 언패킹
    def my_function(x, y, z):
      print(x, y, z)
    
    my_dict = {'x' : 1, 'y' : 2, 'z' : 3}
    my_function(**my_dict) # 1 2 3

11. *, ** 패킹 / 언패킹 연산자 정리

  • '*'

    • 패킹 연산자로 사용될 떄, 여러 개의 인자를 하나의 튜플로 묶는 역할
    • 언패킹 연산자로 사용될 때, 시퀀스나 반복 가능한 객체를 각각의 요소로 언패킹하여 함수의 인자로 전달
  • '**'

    • 언패킹 연산자로 사용될 때, 딕셔너리의 키-값 쌍을 키워드 인자로 언패킹하여 함수의 인자로 전달하는 역할
profile
데이터 분석에서 백엔드까지...

0개의 댓글