TIL

[TIL] 2025.01.09(목) - python 학습

요호유후 2025. 1. 15. 01:35
반응형

금일 학습사항

 1. 함수 기본 
 2. 가변 매개변수
 3. 기본 매개변수
 4. 키워드 매개변수
 5. 함수 리턴
 6. 재귀함수
 7. 조기리턴
 8. 튜플
 9. 람다
 10. 콜백함수
 11. 제너레이터
 12. 타입 어노테이션과 힌트

 

 

각 학습별 상세내용

1. 함수 기본

함수구조

def 함수이름(매개변수1, 매개변수2):
    코드

[설명]
▶ def : define의 약자, 함수를 선언할 때 사용하는 예약어
▶ 파라미터(parameter, 매개변수) : 함수 내부에서 사용되는 변수
▶ 코드 : 함수의 동작을 작성

 

용어정리

▶ 매개변수
   - 함수 호출 시 함수 내부에서 사용될 데이터이다.
   - 함수 호출 시에는 함수 내부에서 필요로하는 특정 데이터들이 있다.

▶ 식별자
   - 파라미터로 전달받은 변수
   - 함수내부에서 데이터로 사용된다.

 

2. 가변 매개변수

구조

def 함수이름(매개변수, *가변매개변수):
    코드

* 가변 매개변수는 전달해야 할 인자의 개수가 명확하지 않을 때 사용한다.

 

가변 매개변수의 주의점

가변 매개변수 뒤에는 일반매개변수가 올 수 없다.

가변 매개변수는 하나만 사용할 수 있다.

* 어디까지가 가변 매개변수인지 알 수 없기 때문이다!

 

예시 (print())

 

3. 기본 매개변수

기본 매개변수란?

 기본적으로 값이 할당되어 있는 매개변수

호출 시 해당 매개변수의 값을 입력하지 않아도 된다.

입력하지 않을 경우 기본적으로 할당된 값으로 설정되고 값을 입력하여 재정의할 수도 있다.

 

구조

def 변수이름(매개변수, 기본매개변수=10):
    코드

* 위 구조와 같이 기본 매개변수는 기본적으로 값이 할당되어있다.
* 함수호출 시 해당 기본 매개변수의 값을 입력하지 않으면 기본값인(10)이 할당된다.

 

기본 매개변수 주의점

기본 매개변수는 꼭 입력 안 해도 된다. 입력이 없을 시 기본옵션으로 설정이 된다.

 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다.

 

예시 (print())

 

4. 키워드 매개변수

키워드 매개변수란?

기본 매개변수, 가변 매개변수, 일반 매개변수를 자유롭게 사용하기 위함이다.

(기본매개변수, 가변매개변수) 순으로 작성하면 → 에러

(가변매개변수, 기본매개변수) 순으로 작성하면 → 실행은 되지만 원하는 출력이 안나옴
    why? 가변 매개변수의 범위를 모르기때문에 기본 매개변수까지 가변 매개변수 취급을 한다.

 

키워드 매개변수 사용 예

def do(x, y = 10):
    pass

do(x = 3, y = 10)
→ 기본 매개변수로 선언된 변수명과 함께 작성해주면 된다.

 

5. 함수 리턴

리턴의 역할

함수에서 계산된 값을 반환 받는것이다.

 일반적으로 함수 제일 마지막 라인에 작성된다.

함수내부에서 동작된 후 return문을 만나면 값을 반환하고 호출했던 곳으로 되돌아간다.

 

구조

def do(a, b):
    return a + b

sum_nums = do(10, 15)

코드 시퀀스)
  1. 위와 같이 do함수 호출 시 매개변수로 (10, 15)을 do함수로 넘겨준다.
  2. do함수가 호출되면서 계산과정이 이루어지고 return을 통해 각 데이터의 합을 반환한다.
  3. 그리고 호출되었던 위치로 되돌아 간다.
  4. 반환받은 값을 sum_nums 라는 변수명으로 받는다.

 

6. 재귀함수

재귀함수란?

함수 내부에 자신의 함수를 다시 호출하는 함수

 

재귀함수의 장점

반복문(for, while) 대신 사용되기 때문에 코드가 간결해지고 불필요한 변수 사용을 막는다.

 

재귀함수의 단점

1. Stack overflow가 발생할 수 있다. → 꼬리재귀로 문제해결 가능
2. 지속적인 함수 호출로 인해 함수 안에 변수를 계속해서 선언하게 되고
    이로 인해 과도한 메모리 사용과 속도저하를 발생시킬 수 있다. → 메모이제이션(Memoization)으로 문제해결 가능

* 메모이제이션(Memoization)
   - 반복적인 계산을 할 때 이미 계산된 값을 저장하여 중복 계산을 피하는 것이다.

 

7. 조기리턴

if-else문 vs if-return문

 성능상 큰 차이는 없다.

if-else문보다 if-return문을 사용하면 코드의 스타일이 좀 더 좋아보이고 가독성이 좋다.

    (협업 시 많이 도움이 된다.)

 

조기리턴의 예시

(좌) if-else문 사용, (우) if-return문 사용

 

8 튜플

튜플의 특징

튜플은 요소의 추가, 삭제, 변경을 할 수 없다.

() 소괄호를 사용한다.

괄호 없이 여러 값을 할당 할 수 있다. 예) tuple_nums = 1, 2, 3, 4

요소를 직접 변경할 수는 없지만 교환할 수는 있다. 예) x, y = y, x

 여러개의 값을 리턴할 수 있다.

def tuple_nums():
    return (1, 2)

x, y = tuple_nums()

 

enumerate()

값을 입력하면 (인덱스, 값)의 튜플 형태로 반환한다.

 

divmod()

몫과 나머지를 튜플 형태로 반환한다. → (몫, 나머지)

 

9. 람다

람다 사용 이유?

익명함수 및 일회성의 함수를 사용할 때 활용된다.

 호출된 함수를 찾아보지 않고 바로 확인이 가능하기에 코드를 읽기 쉽다.

 

구조

1. (lambda 매개변수 : 계산식)
2. (lambda 매개변수 : 계산식) (데이터)

 

10. 콜백함수

콜백함수란?

함수의 매개변수로 사용된 함수

매개변수에 콜백함수 입력 시 괄호 없이 함수명만 입력해준다!

def f_callback(fuction):
    for i in range(5):
        function()

def do():
    print("콜백함수가 뭐여?")

f_callback(do) → do함수가 콜백함수

 

대표적인 콜백함수

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

filter() : 리스트의 요소를 함수에 넣고 리턴된 값이 True인 값만을 새로운 리스트로 구성

 

11. 제너레이터

제너레이터란?

이터레이터를 생성하는 객체

* 이터레이터
   - 순서대로 다음값을 리턴할 수 있는 객체
   - 내장 하고 있는 next 메서드를 통해 다음 값을 가져올 수 있다.

함수 안에 yield 키워드를 넣어서 만들 수 있다. 함수 안에 yield 키워드만 있어도 제너레이터로 인식 된다. 

 

동작

1. next() 메서드를 실행해서 제너레이터를 동작 시킴
2. next() 메서드는 yield 키워드를 만날 때가지 코드를 실행시킴
3. yield를 만나면 데이터를 반환하고 함수를 빠져나옴

* 마지막 라인은 항상 yield 키워드가 존재해야 하며 없으면 에러를 발생시키기 때문에 예외처리  필요

 

실행예시

def do():
    print("do1")
    yield 1

    print("do2")
    yield 2

    print("do3")
    yield 3

f = do()
a = next(f) → do1 출력 후 yield1을 만나서 함수 탈출
b = next(f) → do2 출력 후 yield2을 만나서 함수 탈출
c = next(f) → do3 출력 후 yield3을 만나서 함수 탈출

print(a) → 출력 : 1 (yield 뒤 데이터를 반환한다.)

 

12. 타입 어노테이션과 힌트

타입 어노테이션(type annotation)

파이썬 3.5에서 도입된 기능이다.

 데이터 타입을 명시적으로 작성하는 것이다.

파이썬은 일반적으로 데이터 타입을 작성하지 않기에, 할당된 데이터를 통해서 변수 타입을 결정한다. (동적할당 방식)

타입 어노테이션을 사용한다고 해서 변수의 타입이 결정되는 것은 아니다! 주석의 느낌?

    (그래서 잘못된 데이터타입을 입력하더라도 에러가 나진 않음!) → 확인용 확장프로그램 혹은 툴이 있다.

장점)
  - 가독성이 좋다.
  - 타입명이 명시되어있기 때문에 코드분석에 용이하고 에러예방에 좋다.

단점)
  - 코드가 복잡해 보일 수 있다.

 

예시

def add(num:int, num2: int) → 매개변수에 타입명 명시
def add(num:int, num2:int) -> int → 매개변수와 반환값에 타입명 명시

def add(num1: int, num2: int) -> str:
    return num1 + num2

a = add(3.0, 4)
반응형