출처 https://engineer-mole.tistory.com/190

 

 

Python의 클래스에 대한 이해

다른 언어와 동일하게 python에서도 클래스를 이용하여 보다 편리하게 함수를 다룰 수 있다. 참고로 클래스는 데이터나 처리의 정의 등을 하나로 정리해둔 모형과 같은 것이다. 
클래스를 사용하지 않고 함수 작성한다면 보통 다음과 같이 작성한다.

def some_function(something):
    print(something)

클래스를 이용한다면 기본적으로 다음과 같이 작성하게 된다.

class SomeClass:
    def __init__(self,something):
        self.something = something

    def some_function(self):
        print(self.something)
  • 클래스 구성을 사용하는 메리트는 다음과 같다고 할 수 있다.
  • 글로벌 변수를 없애고, 모든 변수를 어떠한 스코프에 소속시킨다.
  • 몇 번이고 재사용할 수 있다.
  • 코드의 수정을 최소화한다.
  • 함수 실행중에, 함수 자신을 다시 호출하는 처리 등이 가능하게 하다.

 

 

 

클래스와 인스턴스

Python의 클래스에 정의된 데이터나 함수를 사용하기 위해 "인스턴스"를 생성할 필요가 있다.  

인스턴스란, 클래스를 실체화한 것이다. 

하나의 클래스에 대해서 인스턴스는 여러 개 생성하는 것도 가능하므로, 각각의 인스턴스에 각각 다른 데이터를 가지도록 할 수 있다. 
다음의 코드에서 a가 인스턴스가 된다. 

즉, 아까 살펴 본 클래스(SomeClass)의 인스턴스가 a에 할당되어 있다고 할 수 있다.

a = SomeClass("some_value")

인스턴스를 생성하는 것으로, 클래스 내에 기재된 함수를 호출할 수 있다. 

지금까지 살펴 본 코드를 하나의 코드블록으로 작성하면 아래와 같다.

class SomeClass:
    def __init__(self,something):
        self.something = something

    def some_function(self):
        print(self.something)
        
a = SomeClass("some_value")
a.some_function()

#함수에서 print 내장함수를 사용하고 있으므로 some_value가 리턴된다.

 

 

 

클래스와 메소드

클래스 내에 기재되어 있는 함수를 다른 말로 메소드라고 부른다. 

클래스 내에 여러 개의 메소드를 정의하는 것도 물론 가능하다.

class some_class:
    def __init__(self,something):
        self.something = something

    def some_function1(self):#메소드1
        print(self.something)

    def some_function2(self):#메소드2
        return self.something

 

 

 

self의 역할

 지금까지 봤던 클래스 안에 있던 self에 대해 찾아보니  "인스턴스 자신", "그 시점의 자신", "메소드의 임의의 인수"등 다양하게 부르고 있었다. 그러나 클래스의 구성을 취득할 때에 정형의 구문으로써 기억해두면 괜찮은 것 같다.
 

 

__init__의 이해

  self와 나란히 클래스 내에 등장하는 __init__에 대해서는 알아보자. __init__에 대해 간단히 정리하자면, 다음과 같다.

컨스트럭터라고 불리는 초기화를 위한 함수(메소드)
인스턴스화를 실시할 때 반드시 처음에 호출되는 특수한 함수
오브젝트 생성(인스턴스를 생성)과 관련하여 데이터의 초기를 실시하는 함수

 __init__()은 반드시 첫 번째 인수로 self를 지정해야한다. self에는 인스턴스 자체가 전달되어 있다. 이로 인해, 최과 메소드 내에 인스턴스 변수를 작성하거나, 참고하는 것이 가능해진다. 클래스를 생성할 때에 지정한 인수는 초기화 메소드의 2 번째부터 작성해 나가면 된다.

class SomeClass:
    def __init__(self,something):#constructor
        self.something = something

 클래스 구성에서 정보를 유지하기 위한 중요한 구성으므로 빼놓을 수 없는 것이라고 생각하면 좋을 것 같다. 

이 구문에 의해 객체 생성할 때, 정보의 추가 기재를 간단히 할 수 있다.
예를 들어, 여러 개의 정보를 변수로하는 클래스 구문에서의 처리를 실행하고 싶은 경우는 다음과 같이 쓸 수 있다.

class MyStatus:
    def __init__(self,age,name,height,weight):
        self.age = age
        self.name = name
        self.height = height
        self.weight = weight

    def print_name(self):
        print(self.name)

    def print_age(self):
        print(self.age)

    def print_height(self):
        print(self.height)

    def print_weight(self):
        print(self.weight)

a = MyStatus(34,"yamada",170,78)

 

파이썬 배열 초기화 방법

 

비어있는 리스트 초기화

a = [] 
# 또는
a = list()

 

 

리스트를 초기화시킬 때 모든 행이 같은 객체로 인식되기 때문에 아래와 같은 방법을 쓰는 것이 좋다.

 

  • NxM 크기의 2차원 리스트 초기화
a = [[0] * m for _ in range(n)]

 

코드

c = [0 for _ in range(3)]
print(c)

결과

[0, 0, 0]

 

 

만약 2차원 배열에서 가운데 0 만 1로 변경하고 싶을 때,

 

코드

c = [[0]*3 for _ in range(3)]
c[1][1] = 1

print(c)

결과

[[0, 0, 0],
[0, 1, 0],
[0, 0, 0]]

 

 

 

파이썬으로 구현하는 2차원 리스트 90도 회전 함수

외워두면 좋을 것이라 보았음

 

 

def rotate_a_matrix_by_90_degree(a):
    n = len(a)  # 행 길이
    m = len(a[0])  # 열 길이
    result = [[0] * n for _ in range(m)]  # 결과 리스트 초기화

    for i in range(n):
        for j in range(m):
            result[j][n - i - 1] = a[i][j]

    return result

표준 라이브러리: 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리

 

https://docs.python.org/ko/3/library/index.html

 

파이썬 표준 라이브러리 — Python 3.10.4 문서

파이썬 표준 라이브러리 파이썬 언어 레퍼런스 는 파이썬 언어의 정확한 문법과 의미를 설명하고 있지만, 이 라이브러리 레퍼런스 설명서는 파이썬과 함께 배포되는 표준 라이브러리를 설명합

docs.python.org

 

파이썬에서 지원하는 표준 라이브러리는 다양하지만, 코딩 테스트를 준비하며 반드시 알아야 하는 라이브러리는 6가지 정도.

 

 

 

내장함수

print( ), input( )과 같은 기본 입출력 기능부터 sorted( ) 와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리

파이썬 프로그램을 작성할 때 없어서는 안되는 필수적인 기능을 포함

# sum() 함수
result = sum([1, 2, 3, 4, 5])

# min() 함수
result = min([1, 2, 3, 4, 5])

# max() 함수
result = max([1, 2, 3, 4, 5])

# eval() 함수: 수식이 문자열 형식으로 들어오면 수식을 계산한 결과를 반환
result = eval("(3 + 5) & 7")

# sorted() 함수
result = sorted([8, 5, 3, 4, 1]) # 오름차순으로 정렬
result = sorted([8, 5, 3, 4, 1], reverse = True) # 내름차순으로 정렬

 

 

 

itertools

파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리.

순열과 조합 라이브러리를 제공

from intertools import permutations

data = ['A', 'B', 'C']
result = list(permutations(data, 3)) # 모든 순열 구하기
from intertools import combinations

data = ['A', 'B', 'C']
result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기
from intertools import product

data = ['A', 'B', 'C']
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용)
from intertools import combinations_with_replacement

data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기(중복 허용)

 

 

 

heapq

힙(Heap) 기능을 제공하는 라이브러리

우선순위 큐 기능을 구현하기 위해 사용됨

  • 힙에 원소를 삽입할 때는 heapq.heappush()
  • 힙에서 원소를 꺼내고자 할 때는 heapq.heappop()

 

힙 정렬을 heapq로 구현하는 예제

import heapq

def heapsort(iterable):
	h = []
    result = []
    
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
    	heapq.heappush(h, value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
    	result.append(heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 7, 8, 2, 4, 6, 8, 0])

 

파이썬에서는 최대 힙 제공 X

-> 원소의 부호를 임시로 변경하는 방식을 사용한다.

 

최대 힙을 구현하여 내림차순 힙 정렬을 구현하는 예시

import heapq

def heapsort(iterable):
	h = []
    result = []
    
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
    	heapq.heappush(h, -value)  # -value로 변경
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
    	result.append(-heapq.heappop(h))  # -heapq로 변경
    return result

result = heapsort([1, 3, 5, 7, 8, 2, 4, 6, 8, 0])

 

 

 

bisect

이진탐색 기능을 제공하는 라이브러리

  • bisect_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
  • bisect_right(a, x): 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
from bisect import bisect_left, bisect_right

# 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수
def count_by_range(a, left_value, right_value):
	right_index = bisect_left(a, right_value)
    left_index = bisect_right(a, left_value)
    return right_index - left_index
    
    
a = [, , , , ] # 리스트 선언

print(count_by_range(a, 4, 4))

 

 

 

collections

덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리

 

  • deque
    • 시간 복잡도는 O(N)
    • 리스트 자료형과 다르게 인덱싱, 슬라이싱 등 기능 사용 X
    • 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용 가능
    • 스택이나 큐의 기능을 모두 포함
      • 첫 번째 원소 제거 popleft()
      • 마지막 원소 제거 pop()
      • 첫 번째 인덱스에 원소 x 삽입 시 appendleft(x)
      • 마지막 인덱스 원소 삽입 시 append(x)
from collections import deque

data = deque([2, 3, 4])
data.appendleft(1)
data.append(5)

print(data)
print(list(data))

결과

deque([1, 2, 3, 4, 5])

[1, 2, 3, 4, 5]

 

 

  •  Counter
    • 등장 횟수를 세는 기능
    • 구체적으로 리스트와 같은 iterable 객체가 주어졌을 때 해당 객체 내부의 원소가 몇 번씩 등장했는지 알려줌
from collections import Counter

counter = Counter(['r', 'g', 'b', 'b'])
print(counter['b'])

 

 

 

math

필수적인 수학적 기능을 제공하는 라이브러리

팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이와 같은 상수 포함

 

import math

print(math.sqrt(7))
print(math.factorial(5))
print(math.gcd(21, 14))

 

 

 


출처: [이것이 취업을 위한 코딩 테스트다 with 파이썬] 서적

'코딩테스트 > Python' 카테고리의 다른 글

Python 배열 초기화 방법  (0) 2022.05.01
Python 2차원 리스트 90도 회전 함수  (0) 2022.05.01
Python 로그 찍기  (0) 2022.04.21
Python 시간과 메모리 측정  (0) 2022.04.21
Python 연산자 '/'와 '//'의 차이  (0) 2022.04.12

print문으로 테스트할 시, 아래 로그 함수 같은 걸 만들어 불러다 쓰면 편하다.

 

logs만 찾아서 주석처리하면 테스트 과정도 보여줄 수 있다. 

 

def logs(x):
print(vname(x) + "번째 로그:" + "x")

+ Recent posts