파이썬 코딩 도장
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 # 람다 표현식을 반환
nonlocal i
i += 1
return i
return count
class 클래스이름: # 클래스 만들기
def 메서드(self): # 메서드 만들기
코드
인스턴스 = 클래스() # 인스턴스(객체) 만들기
인스턴스.메서드() # 인스턴스로 메서드 호출
__init__
메서드 안에서 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('베기')
🔎 클래스 속성 사용
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):
코드
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
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
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
각 요소에 이름을 지정해줄 수 있는 튜플.
자료형 이름과 요소 이름 지정 시 클래스를 생성해줌.
클래스 = 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