본 내용의 출처는 파이썬 코딩도장파이썬 300제에 있으며, 추가한 내용이 있을 수 있습니다.

파이썬 코딩 도장

Unit 33. 클로저 사용하기

변수의 사용 범위 알아보기


🔎 변수의 사용 범위

x = 10    # 전역 변수
 
def foo():
    global x   # 전역 변수 x를 사용하겠다고 설정
    y = 10     # foo의 지역 변수


함수 안에서 함수 만들기


🔎 함수 안에서 함수 사용하기

def 함수이름1():
    코드
    def 함수이름2():
        코드
def A():
    x = 10        # A의 지역 변수 x
    def B():
        nonlocal x    # 현재 함수에서 바깥쪽에 있는 지역 변수를 사용
        x = 20        # A의 지역 변수 x에 20 할당


클로저 사용하기


🔎 클로저

  • 함수를 둘러싼 환경(지역 변수, 코드 등)을 계속 유지하다 함수 호출 시 다시 꺼내서 사용하는 함수
  • 지역 변수와 코드를 묶어서 사용하고 싶을 때 활용
  • 클로저에 속한 지역 변수는 바깥에서 직접 접근할 수 없기 때문에 데이터를 숨기고자 할 때 활용
def calc():    # calc 함수 안에 mul_add 함수를 만듦
    a = 3
    b = 5
    def mul_add(x):
        return a * x + b    # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산
    return mul_add          # mul_add 함수를 반환
 
c = calc()    # c에 저장된 함수가 클로저
print(c(1), c(2), c(3), c(4), c(5))    # 8 11 14 17 20
  • 람다 표현식
def calc():
    a = 3
    b = 5
    return lambda x: a * x + b    # 람다 표현식을 반환
  • 람다 vs 클로저
    • 람다: 이름이 없는 익명 함수
    • 클로저: 함수를 둘러싼 환경을 유지했다가 나중에 다시 사용하는 함수


퀴즈




연습문제: 호출 횟수를 세는 함수 만들기


        nonlocal i
        i += 1
        return i
    return count


심사문제: 카운트다운 함수 만들기






Unit 34. 클래스 사용하기

클래스와 메서드 만들기


🔎 클래스

class 클래스이름:        # 클래스 만들기
    def 메서드(self):    # 메서드 만들기
        코드
인스턴스 = 클래스()    # 인스턴스(객체) 만들기
인스턴스.메서드()      # 인스턴스로 메서드 호출


속성 사용하기


🔎 클래스의 속성

  • __init__ 메서드 안에서 self.속성에 값을 할당
  • 인스턴스 속성에 접근 시 -> 메서드 안에서 self 뒤에 .(점)을 붙여서 접근하거나, 인스턴스 뒤에 .을 붙여서 접근
class 클래스이름:
    def __init__(self):
        self.속성 =# 인스턴스 속성 만들기
 
    def 메서드(self):
        self.속성           # self 뒤에 .을 붙여서 인스턴스 속성에 접근
 
인스턴스 = 클래스()         # 인스턴스(객체) 만들기
인스턴스.속성               # 인스턴스 속성에 접근
class 클래스이름:
    속성 =# 클래스 속성 만들기
 
    def 메서드(self):
        self.속성           # self 뒤에 .을 붙여서 클래스 속성에 접근
        클래스.속성         # 클래스 뒤에 .을 붙여서 클래스 속성에 접근
 
클래스.속성    # 클래스 속성에 접근

비공개 속성 사용하기


🔎 비공개 속성

class 클래스이름:
    __속성 =# 비공개 클래스 속성
 
    def __init__(self):
        self.__속성 =# 비공개 인스턴스 속성


퀴즈




연습문제: 게임 캐릭터 클래스 만들기


class Knight:
    def __init__(self, health, mana, armor):
        self.health = health
        self.mana = mana
        self.armor = armor
 
    def slash(self):
        print('베기')


심사문제: 게임 캐릭터 클래스 만들기






Unit 35. 클래스 속성과 정적, 클래스 메서드 사용하기

클래스 속성과 인스턴스 속성 알아보기


🔎 클래스 속성 사용

class 클래스이름:
    속성 =
class Person:
    bag = []
 
    def put_bag(self, stuff):
        self.bag.append(stuff)
 
james = Person()
james.put_bag('책')
 
maria = Person()
maria.put_bag('열쇠')
 
print(james.bag)
print(maria.bag)


# 실행결과
['책', '열쇠']
['책', '열쇠']

🔎 인스턴스 속성 사용하기

class Person:
    def __init__(self):
        self.bag = []
 
    def put_bag(self, stuff):
        self.bag.append(stuff)
 
james = Person()
james.put_bag('책')
 
maria = Person()
maria.put_bag('열쇠')
 
print(james.bag)
print(maria.bag)

# 실행결과
['책']
['열쇠']

🔎 비공개 클래스 속성 사용하기

class 클래스이름:
    __속성 =# 비공개 클래스 속성
class Knight:
    __item_limit = 10    # 비공개 클래스 속성
 
    def print_item_limit(self):
        print(Knight.__item_limit)    # 클래스 안에서만 접근할 수 있음
 
 
x = Knight()
x.print_item_limit()    # 10
 
print(Knight.__item_limit)    # 클래스 바깥에서는 접근할 수 없음


# 실행결과
10
Traceback (most recent call last):
  File "C:\project\class_private_class_attribute_error.py ", line 11, in <module>
    print(Knight.__item_limit)    # 클래스 바깥에서는 접근할 수 없음
AttributeError: type object 'Knight' has no attribute '__item_limit' 


정적 메서드 사용하기 & 클래스 메서드 사용하기


🔎 정적 메서드와 클래스 메서드

  • 정적 메서드와 클래스 메서드는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 메서드
  • 정적 메서드는 메서드 위에 @staticmethod를 붙임 + 매개변수에 self를 지정하지 않음.
class 클래스이름:
    @staticmethod    # 정적 메서드 만들기
    def 메서드(매개변수1, 매개변수2):
        코드
  • 클래스 메서드는 메서드 위에 @classmethod를 붙이며 매개변수에 cls를 지정
    • 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용
class 클래스이름:
    @classmethod    # 클래스 메서드 만들기
    def 메서드(cls, 매개변수1, 매개변수2):
        코드


퀴즈




연습문제: 날짜 클래스 만들기

    @staticmethod
    def is_date_valid(date_string):
        year, month, day = map(int, date_string.split('-'))
        return month <= 12 and day <= 31


심사문제: 시간 클래스 만들기





Unit 36. 클래스 상속 사용하기

사람 클래스로 학생 클래스 만들기


🔎 클래스 상속

  • 물려받은 기능을 유지한채로 다른 기능을 추가할 때 사용
    • 기반 클래스: 기능을 물려주는 클래스
    • 파생 클래스: 상속을 받아 새롭게 만드는 클래스
    • 클래스 만들 때 ( )를 붙이고, 괄호 안에 기반 클래스 이름 넣어줌.
class 기반클래스이름:
    코드
 
class 파생클래스이름(기반클래스이름):    # 기반 클래스를 상속받음
    코드
  • 기반 클래스의 속성에 접근하거나 메서드를 호출 -> super() 뒤에 .를 붙여 사용
  • super(파생클래스, self) 형식으로도 사용 가능
class 기반클래스이름:
    def __init__(self):
        self.속성 =class 파생클래스이름(기반클래스이름):
    def __init__(self):
        super().__init__()              # super()로 기반 클래스의 메서드 호출
        super().속성                    # super()로 기반 클래스의 속성에 접근
        super(파생클래스, self).속성    # super에 파생 클래스와 self를 넣는 형식


상속 관계와 포함 관계 알아보기


🔎 상속 관계와 포함 관계

  • 상속
    • 학생과 사람처럼 명확하게 같은 종류
    • 동등한 관계일 때 사용
  • is-a 관계
  • 포함
    • 사람과 사람 목록처럼 동등한 관계가 아니라 포함 관계일 때 사용
    • has-a 관계라고 부릅니다.


기반 클래스의 속성 사용하기 & 메서드 오버라이딩 사용하기


🔎 메서드 오버라이딩

class Person:
    def greeting(self):
        pass
 
class Student(Person):
    def greeting(self):       # 메서드 오버라이딩
        super().greeting()    # super()로 기반 클래스의 메서드 호출
 
james = Student()
james.greeting()     # Student의 greeting 메서드가 호출 됨


다중 상속 사용하기


🔎 다중 상속

class 기반클래스이름1:
    코드
 
class 기반클래스이름2:
    코드
 
class 파생클래스이름(기반클래스이름1, 기반클래스이름2):    # 다중 상속 사용하기
    코드


추상 클래스 사용하기


🔎 추상 클래스

from abc import *
 
class 추상클래스이름(metaclass=ABCMeta):    # 추상 클래스 만들기
    @abstractmethod
    def 메서드이름(self):
        코드


퀴즈




연습문제: 리스트에 기능 추가하기


class AdvancedList(list):
	def replace(self, old, new:
    	while old in self:
        	self[self.index(old)] = new


심사문제: 다중 상속 사용하기

Unit 37. 두 점 사이의 거리 구하기

두 점 사이의 거리 구하기


🔎 클래스로 점 구현

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y
class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
p1 = Point2D(x=30, y=20)    # 점1
p2 = Point2D(x=60, y=50)    # 점2
 
print('p1: {} {}'.format(p1.x, p1.y))    # 30 20
print('p2: {} {}'.format(p2.x, p2.y))    # 60 50
  • 실행결과
p1: 30 20
p2: 60 50


🔎 피타고라스 정리로 두 점 거리 구하기

  • sqrt 함수: 값을 넣으면 해당 값의 제곱근을 구해줌.
import math
 
class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
p1 = Point2D(x=30, y=20)    # 점1
p2 = Point2D(x=60, y=50)    # 점2
 
a = p2.x - p1.x    # 선 a의 길이
b = p2.y - p1.y    # 선 b의 길이
 
c = math.sqrt((a * a) + (b * b))    # (a * a) + (b * b)의 제곱근을 구함
print(c)    # 42.42640687119285
  • 실행결과
42.42640687119285

🔎 namedtuple 사용하기

  • 각 요소에 이름을 지정해줄 수 있는 튜플.

  • 자료형 이름과 요소 이름 지정 시 클래스를 생성해줌.

    • 자료형 이름: 문자열, 요소 이름: 문자열 리스트
    • 클래스 = collections.namedtuple('자료형이름', ['요소이름1', '요소이름2'])
  • 값을 넣어 인스턴스 만들기 가능

    • 인스턴스 = 클래스(값1, 값2)
    • 인스턴스 = 클래스(요소이름1=값1, 요소이름2=값2)
    • 인스턴스.요소이름1
    • 인스턴스[인덱스]
  • 두 점 사이의 거리 구하기 코드 예시

import math
import collections
 
Point2D = collections.namedtuple('Point2D', ['x', 'y'])    # namedtuple로 점 표현
 
p1 = Point2D(x=30, y=20)    # 점1
p2 = Point2D(x=60, y=50)    # 점2
 
a = p1.x - p2.x    # 선 a의 길이
b = p1.y - p2.y    # 선 b의 길이
 
c = math.sqrt((a * a) + (b * b))
print(c)    # 42.42640687119285


연습문제: 사각형의 넓이 구하기


1) width = abs(rect.x2 - rect.x1)
2) height = abs(rect.y2 - rect.y1)
3) area = width * height


심사문제: 두 점 사이의 거리 구하기

profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE&Data Science 개발 기록 노트☘️

0개의 댓글