본문 바로가기
교육/SK네트웍스 Family AI 캠프

[플레이데이터 SK네트웍스 Family AI캠프 14기] 2주차 회고

by shining park 2025. 4. 20.

Class Daily Log

 

Python > 위치 전용 positional-only vs 키워드 전용 keyword-only⭐

  • / 앞은 위치 전용으로만 호출 가능
  • * 뒤는 키워드 전용으로만 호출 가능
def test10(name, /, greeting='hi~'):
    print(name, greeting)

test10('gildong')
# positional-only
# test10(name='gildong') # TypeError: test10() got some positional-only arguments passed as keyword arguments: 'name'

def test11(a, *, b, c):
    print(a, b, c)

# test11(10, 20, 30) # TypeError: test11() takes 1 positional argument but 3 were given
test11(10, b=20, c=30)
test11(10, c=30, b=20)

 

⭐Python > reduce⭐

  • iterable 객체의 요소에 대한 연산결과를 단일값으로 반환합계, 최대/최소값 등의 연산의 적합
  • from functools import reduce
  • reduce(function, iterable, initial_value) -> Any
  • 함수는 3개의 인자를 받는다.
    • 1. 누적 연산값
    • 2. 현재 요소
    • 3. 초기값 (선택)
from functools import reduce

# 최고점수 학생 출력
students = [
    { 'name' : '이순신', 'score' : 80},
    { 'name' : '윤봉길', 'score' : 75},
    { 'name' : '논개', 'score' : 99},
    { 'name' : '강감찬', 'score' : 91},
]

# ⭐
highest_student = reduce(lambda student, c_student: student if student['score'] > c_student['score'] else c_student, students)

def my_func(max, current):
    print(f'max: {max}, current: {current}')
    return max if max['score'] > current['score'] else current

highest_student = reduce(my_func, students)
highest_student

 

⭐Python > 다형성 Polymorphism > 추상클래스 Abstract Class⭐

  • 자식클래스에서 반드시 구현해야 할 추상메소드를 가진 부모클래스 (인터페이스)
  • 추상메소드는 자식클래스에서 반드시 구현해야 할 의무를 가진다.
  • 추상클래스는 직접 객체화 할 수 없다.
  • from abc import ABC, abstractmethod
  • abc.ABC클래스를 상속하면 추상 클래스를 선언할 수 있다.
  • @abstractmethod 데코레이터로 추상메소드를 선언할 수 있다.
from abc import ABC, abstractmethod

# 부모 클래스
class Product(ABC):
    def __init__(self, code: str, name: str, price: int):
        self.__code = code
        self.__name = name
        self.__price = price

    @abstractmethod
    def get_tax(self):
        return self.__price * 0.1

    def get_price(self):
        return self.__price

    def __str__(self):
        return f'code={self.__code}, name={self.__name}, price={self.__price}'

# 자식 클래스
class TV(Product):
    def __init__(self, code: str, name: str, price: int, size: int):
        super().__init__(code, name, price)
        self.__size = size

    def get_tax(self):
        return self.get_price() * 0.1

    def __str__(self):
        return f'TV({super().__str__()}, size={self.__size})'
        
        
# 추상클래스는 객체화할 수 없다.
# product = Product('123', 'zzz', 100)
# TypeError: Can't instantiate abstract class Product without an implementation for abstract method 'get_tax'

# get_tax 라는 추상메소드를 구현하지 않으면...
# TypeError: Can't instantiate abstract class TV without an implementation for abstract method 'get_tax'

tv = TV('samsaung-tv-123', '삼성 와이드8k TV', 10_000_000, 100)
print(tv)
print(tv.get_tax())

tv2 = TV('xiaomi-tv-123', '샤오미 TV', 5_000_000, 100)
print(tv2)
print(tv2.get_tax())

 

SQL

  • 산술연산자
  • 와일드카드 % _
  • limit 절
  • lpad/rpad(문자열, 길이, 패딩문자)
  • 정규표현식 (문자열 검색 특화 표현식)
# sql 산술연산자
# - from 생략하면, 가상테이블(1행)에서 조회를 수행
select
    6 + 4,
    6 - 4,
    6 * 4,
    6 / 4, -- 나누기
#     6 // 4, -- 몫
    6 div 4, -- ⭐몫
    6 % 4, -- 나머지
    6 mod 4; -- ⭐나머지
-- 조회된 결과를 결과집합이라고 함.


# ⭐문자열 패턴 연산자 like
# - ⭐와일드카드 % _ 를 사용해 문자열 특정 패턴을 검사
# - % 0개 이상의 문자
# - _ 딱 1개 문자

select
    *
from
    tbl_menu
where
#     menu_name like '%밥'; -- 밥으로 끝나는 메뉴명
    -- 마늘이 들어가는 메뉴명
#         menu_name like '%마늘%';
# menu_name like '%쥬스';
menu_name like '___쥬스'; -- 세글자 + 쥬스


# limit 절
# - 결과집합에 offset(건너뛰기), 행수를 제한하는 구문
# - limit [offset] row_count (offset 기본값 0)
# - top-n 분석, 페이징처리에 활용

select
    *
from
    tbl_menu
order by
    menu_price desc
limit
#     0, 10;
#     10; -- 상위 10건
10, 10; -- ⭐10개 건너뛰고, 다음 10건


# ⭐lpad/rpad(문자열, 길이, 패딩문자)
# - 임의 문자를 채워서 특정 길이의 문자열 반환
select lpad('hello', 10 , '@'), rpad('hello', 10 , '@');


# ⭐정규표현식 (문자열 검색 특화 표현식)
select
    regexp_replace('123,456원', '[^0-9]', ''), # 123456 -- 숫자가 아닌 것 지워라
    regexp_instr('$123,456', '[0-9]'), # 2 -- 숫자는 몇번째 있습니까
    regexp_substr('제 키는 188cm 입니다.', '[0-9]+'); # 188 -- 숫자만 뽑아 내라(여러개 숫자이므로 +)

 

 

Keep

      • 교육 후에 그 날 배운 내용 복습을 가장 먼저 한 것
      • 지각, 조퇴, 결석이 없던 것
      • 실습과제의 기본적인 부분만 진행하지 않고, 오류처리와 예외처리에 대해 고민하고 추가해 본 것
      •  Type Hint 사용하려고 노력한 것
      • 자격증 일정을 알아보고 스터디를 모집하는 등 준비를 시작한 것

Problem

      • 강사님께서도 언급하셨던 부분인 이미 알고 있는 부분은 본인 공부를 해서 그 시간을 잘 활용하기! 이 부분을 잘 못하고 있는 것 같다...
      • SQL 기초 수업 시간에 SQLD 문제를 풀거나 프로그래머스 SQL 고득점 Kit를 풀어서 시간활용을 할 것
      • 지난 일요일 저녁부터 몸살감기 기운에 이번주 초반인 월, 화까지도 컨디션이 안좋았던 것

Try

      • 자격증 팀 스터디 진행 방식을 정하고 시작할 것
      • 경기도 청년면접수당과 국민취업제도 1유형 구직촉진수당 중복 수혜 가능한지 알아볼 것
      • Streamlit Document(https://docs.streamlit.io/develop/api-reference)를 보며 간단한 Python Toy Project를 시도해 볼 것 + 배포까지
      • 주말에 컨디션 관리를 잘해서 평일 공부와 운동에 영향이 없도록 할 것
      • 평일에도 운동을 꾸준히 할 것