프로그래밍 언어발행일 2025. 12. 29.원본 https://blog.naver.com/jword_/224127046464 ↗

Python 알아두면 좋은 개념들

Python 알아두면 좋은 개념들 — #Python #파이썬 #파이썬이터러블 map map은 Iterable 요소들을 function을 적용한 결과를 반환하는 Ite...

#Languages#Naver Blog

#Python #파이썬 #파이썬이터러블

​

map

javascript 코드 예제
                                    map(function, iterable, ... )

map은 Iterable 요소들을 function을 적용한 결과를 반환하는 Iterator이다.

  • 여러개 iterable 참조 가능
  • 한번만 처리한다.

​

iterable

  • \_\_iter\_\_() 메서드를 구현하여 반복 가능한 객체이다. f
  • or문에서 사용할 수 있는 모든 객체가 iteraable이다.
  • list, dict, str

​

Iterator

  • \_\_iter\_\_() + \_\_next\_\_() 메서드를 필수로 구현한다.
  • 한번 순회만 가능하다
  • map, filter, generator

Class, Instance, Object

Class: 객체를 만들기 위한 설계도

Instance: Class가 실체화 된 것

Object: 메모리에 존재하는 모든 것(가장 포괄적)

javascript 코드 예제
                                    class Animal:
    def __init__(self, name):
        self.name = name

dog = Animal("dooog")
print(isinstance(dog, Animal))
print(isinstance(dog, object))

print(isinstance([1,2,3,4], object))
print(isinstance(1, object))
print(isinstance("", object))
print(isinstance(None, object))

ALL True

List vs Tuple vs Set

Tuple vs List vs Set

구분ListTupleSet
문법\[1, 2, 3\](1, 2, 3){1, 2, 3}
순서있음있음없음
중복허용허용불허
가변성MutableImmutableMutable
인덱싱가능가능불가

\* 둘다 index 접근이 가능하다.

\* tuple은 수정이 안됨 (immutable)

\* set은 순서 없다: indexing 불가

파이썬 데코레이터

함수를 받아서 함수를 반환하는 함수이다. 기본적으로 함수는 x, y 처럼 파라미터를 넘기는데, 여기서 x, y가 함수인 함수이다.

​

javascript 코드 예제
                                    def ex_deco(parm_func):
    def test():
        print("start parm_func")
        parm_func()
        print("end parm_func")
        return 4
    return test

@ex_deco
def parm_func():
    return print("it is parmater function!!")

print(parm_func())

구조가 조금 난해하다. @ex\_deco로 어떤 메서드를 정의한다는 것은 이 메서드는 ex\_deco function의 파라미터로 쓰겠다는 말과 동일하다. ex\_deco는 메서드를 파라미터로 받은 후 내부에서 또다른 메서드를 정의하여 파라미터 함수를 활용해 새로운 값을 return 할 수 있다.

파이썬 메모리 관리

Python은 자동 메모리 관리를 제공한다. 크게 두 가지 메커니즘을 사용한다.

​

  1. Reference Counting(참조 카운팅)

모든 객체는 자신을 참조하는 횟수를 저장한다.

javascript 코드 예제
                                    import sys
a = [1, 2, 3]
print(sys.getrefcount(a)) # 2 : 처음 a, getrefcount에 전달한 인자 a = 2

b = a # 참조 추가
print(sys.getrefcount(a) # 3

del b # 참조 제거
print(sys.getrefcount(a)) # 2

-> 이렇게 가다가 참조 카운트가 0이되면 즉시 메모리를 해제한다.
a = None # 이렇게 하면 수동으로 즉시 해제
  1. Garbage Collection (가비지 컬렉션)

참조 카운팅으로 해결 못하는 순환 참조를 처리합니다.

javascript 코드 예제
                                    # 순환 참조 문제
a = []
b = []
a.append(b)
b.append(a)

del a, b
# 참조 카운트가 1이지만 접근 불가능
# -> GC가 탐지해서 해제
javascript 코드 예제
                                    import gc

# 수동으로 GC 실행
gc.collect()

# GC 통계 확인
print(gc.get_stats())

# 3. 메모리 풀 (pyMalloc)
작은 객체(512바이트 이하)는 메모리 풀에서 관리
  1. 메모리 관리 법 (객체별 최적화)

Samll Integer Caching (5-256)

javascript 코드 예제
                                    a = 100
b = 100
print(a is b) # True

a = 1000
b = 1000
print(a is b) # False

String Interning

javascript 코드 예제
                                    a = "hello"
b = "hello"
print(a is b)  # True — 같은 객체 재사용

메모리 누수 방지 팁

javascript 코드 예제
                                    1. 순환 참조 피하기
import weakref

class Node:
    def __init__(self):
        self.parent = None

    def set_parent(self, parent):
        self.parent = weakref.ref(parent)  # 약한 참조
javascript 코드 예제
                                    2. 큰 데이터는 generator 사용하기
# 나쁜 예 - 메모리에 전체 로드: 리스트 컴프리헨션 : 전 부 메모리에 로드
data = [x ** 2 for x in range(10000000)]

# 제너레이터 - 하나씩 생성
data = (x ** 2 for x in range(10000000))

import sys

list_data = [x ** 2 for x in range(10000000)]
gen_data = (x ** 2 for x in range(10000000))

print(sys.getsizeof(list_data))  # ~89,000,000 bytes (약 89MB)
print(sys.getsizeof(gen_data))   # 200 bytes 이하

​