오늘의 한 일
- python 강의 6일차
- 파이썬 과제
- 백준 알고리즘 문제 풀이 - 기본 수학2
python 강의 6일차
python 심화
함수 심화
- 인자에 기본값 지정해주기
# 함수를 선언할 때 인자에 기본값을 지정해줄 수 있습니다.
EXPRESSION = {
0: lambda x, y: x + y ,
1: lambda x, y: x - y ,
2: lambda x, y: x * y ,
3: lambda x, y: x / y
}
def calc(num1, num2, option=None): # 인자로 option이 들어오지 않는 경우 기본값 할당
"""
option
- 0: 더하기
- 1: 빼기
- 2: 곱하기
- 3: 나누기
"""
return EXPRESSION[option](num1, num2) if option in EXPRESSION.keys() else False
print(calc(10, 20)) # False
print(calc(10, 20, 0)) # 30
print(calc(10, 20, 1)) # -10
print(calc(10, 20, 2)) # 200
print(calc(10, 20, 3)) # 0.5
- args / kwargs에 대한 이해
args(arguments)와 keyword arguments(kwargs)는 함수에서 인자로 받을 값들의 갯수가
불규칙하거나 많을 때 주로 사용됩니다.
인자로 받을 값이 정해져있지 않기 때문에 함수를 더 동적으로 사용할 수 있습니다.
함수를 선언할 때 args는 앞에 *를 붙여 명시하고, kwargs는 앞에 **를 붙여 명시합니다.
-
- args 활용하기
def add(*args):
# args = (1, 2, 3, 4)
result = 0
for i in args:
result += i
return result
print(add()) # 0
print(add(1, 2, 3)) # 6
print(add(1, 2, 3, 4)) # 10
-
- kwargs 활용하기
def set_profile(**kwargs):
"""
kwargs = {
name: "lee",
gender: "man",
age: 32,
birthday: "01/01",
email: "python@sparta.com"
}
"""
profile = {}
profile["name"] = kwargs.get("name", "-")
profile["gender"] = kwargs.get("gender", "-")
profile["birthday"] = kwargs.get("birthday", "-")
profile["age"] = kwargs.get("age", "-")
profile["phone"] = kwargs.get("phone", "-")
profile["email"] = kwargs.get("email", "-")
return profile
profile = set_profile(
name="lee",
gender="man",
age=32,
birthday="01/01",
email="python@sparta.com",
)
print(profile)
# result print
"""
{
'name': 'lee',
'gender': 'man',
'birthday': '01/01',
'age': 32,
'phone': '-',
'email': 'python@sparta.com'
}
"""
-
- args / kwargs 같이 사용해보기
def print_arguments(a, b, *args, **kwargs):
print(a)
print(b)
print(args)
print(kwargs)
print_arguments(
1, # a
2, # b
3, 4, 5, 6, # args
hello="world", keyword="argument" # kwargs
)
# result print
"""
1
2
(3, 4, 5, 6)
{'hello': 'hello', 'world': 'world'}
"""
패킹과 언패킹
- 패킹과 언패킹이란?
패킹(packing)과 언패킹(unpacking)은 단어의 뜻 그대로 요소들을 묶어주거나 풀어주는
것을 의미합니다.
list 혹은 dictionary의 값을 함수에 입력할 때 주로 사용됩니다.
- list에서의 활용
def add(*args):
result = 0
for i in args:
result += i
return result
numbers = [1, 2, 3, 4] # numbers list를
print(add(*numbers)) # 10 언패킹해서 인자로 만들기
"""아래 코드와 동일
print(add(1, 2, 3, 4))
"""
- dictionary에서의 활용
def set_profile(**kwargs):
profile = {}
profile["name"] = kwargs.get("name", "-")
profile["gender"] = kwargs.get("gender", "-")
profile["birthday"] = kwargs.get("birthday", "-")
profile["age"] = kwargs.get("age", "-")
profile["phone"] = kwargs.get("phone", "-")
profile["email"] = kwargs.get("email", "-")
return profile
user_profile = {
"name": "lee",
"gender": "man",
"age": 32,
"birthday": "01/01",
"email": "python@sparta.com",
}
print(set_profile(**user_profile)) # 딕셔너리 {} 을 언패킹해서 인자로
""" 아래 코드와 동일
profile = set_profile(
name="lee",
gender="man",
age=32,
birthday="01/01",
email="python@sparta.com",
)
"""
# result print
"""
{
'name': 'lee',
'gender': 'man',
'birthday': '01/01',
'age': 32,
'phone': '-',
'email': 'python@sparta.com'
}
"""
객체지향 (일단 알아만 둡시다)
- 객체지향(Object-Oriented Programming)이란??
객체지향이란 객체를 모델링하는 방향으로 코드를 작성하는 것을의미합니다.
영어로는 Object-Oriented Programming이라고 하며 앞자를 따 OOP라고 불려집니다.
파이썬 뿐만이 아닌, 다양한 언어들에서 프로젝트를 개발하며 사용되는
개발 방식 중 하나입니다.
- 객체지향의 특성
- 캡슐화
- 특정 데이터의 액세스를 제한해 데이터가 직접적으로 수정되는 것을 방지하며, 검증 된 데이터만을 사용할 수 있습니다.
- 추상화
- 사용되는 객체의 특성 중, 필요한 부분만 사용하고 필요하지 않은 부분은 제거하는 것을 의미합니다.
- 상속
- 상속은 기존에 작성 된 클래스의 내용을 수정하지 않고 그대로 사용하기 위해 사용되는 방식입니다.
- 클래스를 선언할 때 상속받을 클래스를 지정할 수 있습니다.
- 다형성
- 하나의 객체가 다른 여러 객체로 재구성되는 것을 의미합니다.
- 오버라이드, 오버로드가 다향성을 나타내는 대표적인 예시입니다.
- 캡슐화
- 객체지향의 장/단점
- 장점
- 클래스의 상속을 활용하기 때문에 코드의 재사용성이 높아집니다.
- 데이터를 검증하는 과정이 있기 때문에 신뢰도가 높습니다.
- 모델링을 하기 수월합니다.
- 보안성이 높습니다.
- 단점
- 난이도가 높습니다.
- 코드의 실행 속도가 비교적 느린 편입니다.
- 객체의 역활과 기능을 정의하고 이해해야 하기 때문에 개발 속도가 느려집니다.
- 장점
- 객체지향 예제 코드
import re
# 숫자, 알파벳으로 시작하고 중간에 - 혹은 _가 포함될 수 있으며 숫자, 알파벳으로 끝나야 한다.
# @
# 알파벳, 숫자로 시작해야 하며 . 뒤에 2자의 알파벳이 와야 한다.
email_regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
class Attendance:
count = 0
def attendance(self):
self.count += 1
@property
def attendance_count(self):
return self.count
class Profile(Attendance):
def __init__(self, name, age, email):
self.__name = name # __를 붙여주면 class 내부에서만 사용하겠다는 뜻
self.__age = age
self.__email = email
@property # 읽기 전용 속성
def name(self):
return self.__name
@name.setter # 쓰기 전용 속성
def name(self, name):
if isinstance(name, str) and len(name) >= 2:
print("이름은 2자 이상 문자만 입력 가능합니다.")
else:
self.__name = name
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if isinstance(age, int):
self.__age = age
else:
print("나이에는 숫자만 입력 가능합니다.")
@property
def email(self):
return self.__email
@email.setter
def email(self, email):
if re.fullmatch(email_regex, email):
self.__email = email
else:
print("유효하지 않은 이메일입니다.")
def attendance(self): # override
super().attendance() # 부모 메소드 사용하기
self.count += 1
def __str__(self):
return f"{self.__name} / {self.__age}"
def __repr__(self):
return f"{self.__name}"
※ 정규표현식(regex) - 이메일, 전화번호 등의 형식이 맞는지 걸러내기 위해 사용. 참고 - https://hamait.tistory.com/342
※ 데코레이터(@) - 일단 있다고 알아만 둡시다
파이썬 과제
아직 혼자서 만드는 코드는 뭔가 깔끔하지가 않은 느낌.
패킹과 언패킹 부분도 감이 잘 잡히지 않는다 으악
백준 알고리즘 문제풀이 - 기본 수학2
기본적으로 소수를 찾는 함수를 구상해서 사용하는 문제들로 구성되어 있었다.
소수를 찾는데에는 크게 두가지 방법이 있었는데
에라토스테네스의 체 - 가장 작은 소수의 배수부터 체로 걸러냄
2에서부터 특정 수의 제곱근까지 반복문을 돌려서 1과 자기 자신 외에 몫이 나눠 떨어지는 수가 있는지 확인
거기에 이제 기본적인 코드를 짜고서 시간초과에 걸리는 경우가 생겨 난이도가 급상승하는것 같다 ㅠㅠ