본문 바로가기

Python

(14)
Python 연산자 오버로딩을 위한 스페셜 메서드 정리 연산자 오버로딩이란? 연산자 오버로딩(Operator overloading)이란, 사용자 정의 클래스에서 기존에 정의된 연산자(+, -, *, / 등)의 동작을 재정의하는 것을 말한다. 이를 통해 사용자 정의 데이터 타입에 대해 연산자를 사용하여 직관적으로 작업할 수 있다. class Number: def __init__(self, value): self.value = value def __str__(self): return str(self.value) def __add__(self, other): if isinstance(other, Number): return Number(self.value + other.value) if isinstance(other, (int, float, bool)): retu..
Python 클로져 함수(Closure Function) Python 언어의 특징 Python은 동적 언어이기 때문에 클래스에서 정보의 은닉을 지원하지 않는다. 사용자가 만약 클래스나 객체 변수에 접근하여 프로그램에 잘못된 동작이 일어날 수 있다. 다른 언어는 private, public 등의 키워드를 제공하여 이런 가능성을 원천 차단해버리지만 Python은 가능성을 열어두고 잘못된 동작이 일어날 시 이를 사용자의 책임으로 전가한다. Python처럼 클래스 정보의 은닉을 지원하지 않는 언어에서 정보의 은닉을 사용하고 싶을 때 사용할 수 있는 것이 클로져 함수(Closure Function)다. 클로져 함수(Closure Function) 클로져 함수의 필요성을 다음과 같이 정리할 수 있겠다. 1. 클래스 없이 객체를 만들고 싶을 때 2. 정보를 은닉하고 싶을 ..
Python 패킹(packing) 언패킹(unpacking) 총정리 리스트 언패킹 li = [1, 2, 3, 4] a, b, c, d = li 스타를 활용한 리스트 언패킹 li = [1, 2, 3, 4] a, *b, c= li # a = 1, b = [2, 3], c = 4 튜플 언패킹 tu = (1, 2, 3, 4) a, b, c, d = tu 함수 인자 언패킹(딕셔너리 언패킹) def my_function(a, b, c, d): print(a, b, c, d) di = dict(a=1, b=2, c=3, d=4) # * : key unpacking # ** : value unpacking my_function(*di) # a b c d my_function(**di) # 1 2 3 4 * 주의 : **를 사용하여 value unpacking 시 함수의 매개변수 이름과..
Python 제너레이터(Generator) 제너레이터(Generator)란? 제너레이터란, 반복 가능한 객체(iterable)를 만드는데 사용되는 함수다. 제너레이터를 만들기 위해서는 yield 키워드를 사용한다. 제너레이터를 만드는 방법에는 크게 2가지가 있다. 제너레이터 함수를 이용한 방법 제너레이터 표현식을 이용한 방법 제너레이터 함수 def generator(): print("hello, 1") yield 1 print("hello, 2") yield 2 print("hello, 3") yield 3 제너레이터를 정의하기 위해서는 위와 같이 함수에 yield 키워드를 사용하면 된다. yield 키워드 다음에 오는 값을 반환한다. gen = generator() print(gen) >> 제너레이터 객체를 만들려면 함수를 호출하면 된다. ge..
Python 연결 리스트(Linked List) 연결 리스트(Linked List)는 데이터 요소들을 순서대로 저장하는 자료구조다. 연결리스트는 위 그림처럼 노드로 이루어져 있다. 각 노는 데이터와 다음 노드를 가리키는 포인터(Pointer)로 이루어져 있다. 이 포인터는 다음 노드의 위치를 가리키므로, 데이터 요소들이 메모리에 연속적으로 저장되지 않아도 된다. 앞서 배운 클래스를 통해 파이썬으로 노드와 연결리스트를 구현해보자. class LinkedList: def __init__(self): self.head = None pass def insert_head(self, data): new_node = LinkedList.Node(data, self.head) self.head = new_node pass class Node: def __init__..
Python 싱글턴 패턴(Singleton Pattern), 반복자 패턴(Iterator Pattern), 데코레이터 패턴(Decorator Pattern) 디자인 패턴이란? 디자인 패턴이란, 소프트웨어 개발에서 반복적으로 발생하는 문제에 대한 해결책을 제공하는 일종의 템플릿이다. 이러한 패턴들은 개발자들이 공통된 문제를 해결하기 위해 검증된 방법을 활용할 수 있도록 도와준다. 디자인 패턴은 특정한 상황에서 특정한 목적을 달성하기 위해 소프트웨어 디자인을 조직화하고 구조화하는 방법을 제시한다. * 디자인 패턴의 장점 디자인 패턴을 사용하면 유지보수가 용이하고, 코드 가독성, 코드 재사용성, 확장성이 향상되는 등 다양한 장점이 있다. * 디자인 패턴의 종류 싱글턴 패턴(Singleton Pattern), 멀티턴 패턴(Multiton Pattern), 반복자 패턴(Iterator Pattern), 팩토리 패턴(Factory Pattern) 등 다양한 디자인 패턴..
Python 스페셜 메서드 len, getitem, iter, str, repr, new 스페셜 메서드(Special Method)란? 스페셜 메서드란, 더블 언더스코어(__)로 시작하고 끝나는 메서드 Dunder Method(double underscore method)라고도 불린다. 특별한 기능을 수행하며, Python 인터프리터에 의해 특정한 시점 또는 상황에서 자동으로 호출된다. 클래스의 특정 동작을 커스터마이즈할 수 있게 해준다. 이제 대표적인 스페셜 메서드와 예제 코드를 설명한다. __len__ __len__() 메서드는 객체 속성에 대해 그 길이를 반환하는 스페셜 메서드다. class Sentence: def __init__(self, sentence): self.sentence = sentence def __len__(self): return len(sentence) s = S..
Python 클래스, 객체 객체 지향 프로그래밍(Object-oriented Programming) * 클래스의 필요성 클래스는 객체 지향 프로그래밍의 핵심이 되는 부분이다. 우선, 클래스를 사용하지 않게 되면 어떠한 단점이 있는지 살펴보자. 중복 코드의 제거 → 함수로 해결 가능 데이터 간의 관련성 명시 → 컬렉션(리스트, 딕셔너리 등)으로 해결 가능 위 2가지 단점 모두 함수와 컬렉션으로 극복할 수 있다. 하지만 함수와 데이터 컬렉션 사이의 관련성을 명시하기 위해서는 클래스가 반드시 필요하다. 클래스는 데이터와 함수를 하나로 묶을 수 있도록 한다. * 클래스와 객체 클래스는 붕어빵틀, 객체는 붕어빵이라고 생각하면 이해가 쉽다. Python 클래스 선언 방법 class MyBlog: count = 0 # 클래스 속성. 객체의 수..
Python 함수 선언 방법, 변수 지역성 함수 선언 Python 함수 선언 방법은 다음과 같다. def my_function(): print("Hello from my_function()") ↑ 인자를 받지 않는 함수 def my_function(arg1, arg2): print(arg1, arg2) ↑ Positional Argument. 2개의 인자를 받는 함수 def my_function(*args): print(type(args)) print("The first argument is", args[0]) my_function("A", "B", "C") >> >> A ↑ Positional Argument Packing. 여러 인자를 받는 함수. 여기서 args는 tuple 타입으로 들어온다. def my_function(a, b, c, *..
Python 이터러블(iterable)과 반복자(iterator) 이터러블 오브젝트(Iterable Object)란, 순회 가능한 객체를 뜻하며, 반복자(iterator)를 꺼낼 수 있다. 리스트, 튜플, 문자열 등 모두 반복 가능한 객체(iterable object)다. 반복자(iterator)는 이터러블 오브젝트의 모든 요소를 차례대로 순회할 때 사용되는 객체다. 반복자는 iter() 함수를 통해 생성할 수 있다. numbers = "0123456789" # 문자열 컨테이너 itr = iter(numbers) print(itr) >> String 반복자가 생성된 것을 볼 수 있다. 컨테이너를 순회하기 위해서는 next() 함수를 사용하면 된다. print(next(itr)) print(next(itr)) print(next(itr)) print(next(itr)) ..