오늘의 강의
파이썬 문법 심화 1주차 9~14
기억할 것
예외처리
try / except
사용
ValueError
: 숫자로 바꿀 수 없는 것을 숫자로 바꾸려고 함ZeroDivisionError
: 0으로 나눈 경우Exception as 변수
: 정의하지 않은(예상치 못한) 에러가 발생했을 때. 변수 - 에러 내용
(권장하지 않음)
패킹과 언패킹
함수를 만드는데 매개변수의 갯수를 지정하고 싶지 않다면?
list 에서
def add(*args):
*
👉add
함수에 들어가는 모든 인자를 args
안에 넣을 거다!
요런 함수가 있을 때 리스트를
numbers = [1, 2, 3, 4]
라고 한다면,
print(add(*numbers)) # list name : number
## 아래와 같다.
pirnt(add(*[1, 2, 3, 4]))
print(add(1, 2, 3, 4))
이렇게 함수를 실행해서 출력할 수 있다.
dictionary에서
def sample(**kwargs):
kwargs : keyword arguments
sample_dict = {
"key": "value",
"key2": "value2",
"key3" : "value3"
}
요런 dictionary
가 있을 때 마찬가지로
sample(**sample_dict)
이렇게 받아올 수 있당
Class
__init__ : python의 생성자
인스턴스 초기화하기
class A():
def __init__(self, first, second):
self.first = first
self.second = second
상속 inheritance
(강의자료 예시 코드)
class Monster():
def __init__(self, hp):
self.hp = hp
def attack(self, damage):
self.hp -= damage
def status_check(self):
print(f"monster's hp : {self.hp}")
요런 몬스터라는 클래스가 있을 때,
상속을 사용해서 얼음속성, 불속성 몬스터 클래스를 만들 수 있다.
class FireMonster(Monster):
def __init__(self, hp):
self.attribute = "fire"
super().__init__(hp) #부모 class의 init 함수 실행 = self.hp = hp
def status_check(self): # overriding
print(f"fire monster's hp : {self.hp}")
class IceMonster(Monster):
def __init__(self, hp):
self.attribute = "ice"
super().__init__(hp)
def status_check(self):
print(f"ice monster's hp : {self.hp}")
fire_monster = FireMonster(hp=100)
fire_monster.attack(20) # super
fire_monster.status_check() # sub
ice_monster = IceMonster(hp=200)
ice_monster.attack(50) # super
ice_monster.status_check() # sub
다른 사람이 만든 모듈의 계산기 코드를 사용하고 있다고 가정
class Calc:
def _print_zero_division_error(self):
print("can't be division by zero")
def plus(self, num1, num2):
...
def minus(self, num1, num2):
...
def divide(self, num1, num2):
if num2 == 0:
self._print_zero_division_error()
return False
...
def multiply(self, num1, num2):
...
calc = Calc()
calc.divide(5, 0)
# result print
"""
can't be division by zero
"""
만약 이 코드에서 print를 영어가 아닌 한글로 하고 싶을 때 👉 상속으로 코드 수정
class CustomCalc(Calc):
def _print_zero_division_error(self):
print("0으로는 나눌 수 없습니다.")
calc = CustomCalc()
calc.divide(5, 0)
"""
0으로는 나눌 수 없습니다.
"""
class 객체(object) 다루기
sample_list = [1, 2, 3, 4]
sample_dict = {"key": "value"}
print(type(sample_list)) # <class 'list'>
print(type(sample_dict)) # <class 'dict'>
sample_list.sort() # list 클래스의 sort 메소드 사용
객체에서 사용 가능한 메소드들은 함수의 리턴 타입을 확인하는 방법과 동일하게 검색, docstring, 구현 코드 등을 확인하여 찾을 수 있습니다.
정규표현식(regex)
문자열이 특정 패턴과 일치하는지 판단하는 형식 언어
예시 - 이메일 확인
# 안 쓸 때
from pprint import pprint
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
number = "0123456789"
special_char = "-_."
def verify_email(email):
# 이메일에 @가 한개 포함되어 있는지 확인
if email.count("@") != 1:
return False
# @를 기준으로 사용자명과 도메인을 분리
username, domain = email.split("@")
# username이 1자 이상인지 확인
if len(username) < 1:
return False
# 도메인에 한개 이상의 .이 포함되어 있는지 확인
if domain.count(".") < 1:
return False
# username에 알파벳, 숫자, 허용된 특수문자 이외의 문자가 포함되어 있는지 확인
if not all([x in alphabet + number + special_char for x in username]):
return False
# domain에 알파벳, 숫자, 허용된 특수문자 이외의 문자가 포함되어 있는지 확인
if not all([x in alphabet + number + special_char for x in domain]):
return False
# 마지막 .을 기준으로 도메인을 분리
_, last_level_domain = domain.rsplit(".", 1)
# 마지막 레벨의 도메인의 길이가 2~4글자인지 확인
if not 2 <= len(last_level_domain) <= 4:
return False
# 모든 검증이 완료되면 True를 리턴
return True
# 쓸 때
from pprint import pprint
import re
# rstring : backslash(\)를 문자 그대로 표현
# ^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$ : 이메일 검증을 위한 정규표현식 코드
email_regex = re.compile(r"^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$")
def verify_email(email):
return bool(email_regex.fullmatch(email))
r을 쓰는 이유 : \n
, \t
를 개행해라, 탭해라 가 아닌 문자 그대로 \n, \t
로 쓰게 하기 위함
직접 정규표현식을 짜서 쓰는 건 상당히 어렵다. 그래서 이미 만들어진 것을 쓰는 걸 권장함.
파일과 디렉토리 다루기
glob
: 파일과 디렉토리 목록 확인하는 라이브러리 --> glob.glob (파일 경로)
from pprint import pprint
import glob
path = glob.glob("./venv/*") # venv 폴더 내 모든 파일들
pprint(path)
# result output
"""
['./venv\\Include', './venv\\Lib', './venv\\pyvenv.cfg', './venv\\Scripts']
"""
하위 --> 하위 --> 하위 모두 다 보고 싶을 때 recursive
(재귀)
path = glob.glob("./venv/**", recursive=True) # *이 하나라면 작동하지 않음
pprint(path)
path = glob.glob("./venv/**/*.py", recursive=True) : venv
하위의 .py
확장자를 가진 모든 폴더 재귀적 탐색
open
open 함수로 파일 열기
f = open("file.txt", "w", encoding="utf-8")
# w : 쓰기모드 (없으면 새로 생성)
f.write("파이썬 파일 쓰기 테스트!\n")
문자의미
'r'
읽기용으로 엽니다.(기본값)
'w'
쓰기용으로 엽니다, 파일을 먼저 자릅니다.
'x'
독점적인 파일 만들기용으로 엽니다, 이미 존재하는 경우에는 실패합니다.
'a'
open for writing, appending to the end of file if it exists
'b'
바이너리 모드
't'
텍스트 모드 (기본값)
'+'
갱신(읽기 및 쓰기)용으로 엽니다
f.close()
파일 닫기
with open
하면 with가 끝날 때 자동으로 close 👉 close()
필요X
readline
파일을 한 줄 씩 읽어들임
readlines
파일의 모든 내용을 list로 한번에 읽음
ex)
with open("file.txt", "r", encoding="utf-8") as r:
while True:
# readline은 파일을 한 줄 씩 읽어들입니다.
line = r.readline()
# 파일 끝까지 텍스트를 읽어들였다면 반복문을 중지합니다.
if not line:
break
# 텍스트의 줄바꿈 문자 제거
line = line.strip()
print(line)
결과)
파이썬 파일 쓰기 테스트!
파이썬 내용 추가 테스트!
GitHub 댓글