초보자를 위한 파이썬 300제 00. 파이썬 문법 리뷰 01) 유튜브 01. 파이썬 시작하기 001 ~ 010 02. 파이썬 변수 011 ~ 020 03. 파이썬 문자열 021 ~ 030 031 ~ 040 041 ~ 050 04. 파이썬 리스트 051 ~ 060 061 ~ 070 05. 파이썬 튜플 071 ~ 080 06. 파이썬 딕셔너리 081 ~ 090 091 ~ 100 07. 파이썬 분기문 101 ~ 110 111 ~ 120 121 ~ 130 08. 파이썬 반복문 131 ~ 140 141 ~ 150 151 ~ 160 161 ~ 170 171 ~ 180 181 ~ 190 191 ~ 200 09. 파이썬 함수 201 ~ 210 211~ 220 221 ~ 230 231 ~ 240 10. 파이썬 모듈 241 ~ 250 11. 파이썬 클래스 251 ~ 260 261 ~ 270 271 ~ 280 281 ~ 290 12. 파일 입출력과 예외처리 291 ~ 300 Show 안녕하세요 시벅이 입니다! 요즘 위탁 대량 등록이라는 재미있는 프로젝트를 하고 있습니다! 말 그대로 대량 등록이라 수만 가지 상품을 판매하고 있는데요! 여기서 가장 중요한 것은 판매하는 상품의 정보를 정확히 관리하고 최신 정보로 업데이트해주는 것이 매우 매우 중요합니다! (재고나 가격 업데이트가 안되면 추후 이거로 인한 손해/CS 가 몰려오기 때문입니다...) 수만 가지 상품의 제고를 파이썬으로 관리하다 보니 for문을 통해 위에서부터 하나하나 확인하고 있습니다. 이런 방식은 상품이 많아질수록 엄청난 시간 소요한다는 단점을 갖고 있습니다. 그래서! 이것을 해결하기 위한 파이썬의 어마어마한 무기 threading!파이썬 threading 모듈threading을 사람으로 비유해서 이야기하면 일처리를 한 명이 하고 있던 것을 두 명 세명 나눠서 한다고 생각하면 됩니다! 하지만 이 모듈을 사용할 때 주의할 점은 각 thread끼리 전역 변수를 공유하니 둘이 꼬이면 값이 다르게 나오는 경우가 안되게 프로그램을 잘 구성하셔야 합니다! 아래는 재고 관리 프로그램을 간단히 나타낸 스크립트입니다.
첫 firstStockPrice 는 위탁 도매사이트 10개의 상품 재고와 가격 변동을 파악하는 함수입니다. 각 위탁 도매사이트 아이템이 여러 개다 보니 하나 돌리는데도 시간이 2시간 정도 걸리더라고요! secondStockPrice는 나머지 10개 위탁 도매사이트 상품 재고 가격 변동을 파악하는 함수입니다. 원래 두개를 한 번에 돌릴 땐 3시간 넘게 걸렸는데 두 개를 나눠놓으니 1시간 30분 정도 걸리네요! 이렇게 시간을 줄여 더 효율적인 것에 투자하니 기분이 아주 좋습니다 ㅎㅎ 프로그래밍이란 게 참 매력적이고 재미있는 것 같습니다. 코드 몇 개만 바꿔서 사람의 시간을 1시간 30분이나 벌어주다니... 이상 재고 프로그램을 효율적으로 바꿔주는 threading에 대한 리뷰 마치겠습니다! 글 내용이 도움되셨다면 구독 또는 좋아요 부탁드립니다~ 더 많은 정보와 리뷰를 원하시면 여기로! 모바일은 여기로! 프로젝트 개요
What's in my Refrigerator는 냉장고 속 식재료 데이터를 관리하는 프로그램입니다. Heap 자료구조와 파이썬을 이용하여 구현하였습니다. 2020-2 데이터사이언스와 컴퓨팅2 (안용학 교수님)2020년도 2학기에 안용학 교수님의 데이터사이언스와 컴퓨팅2 (알고리즘) 수업을 들으면서 한학기 동안 수행한 팀 프로젝트입니다. 한학기 동안 배운 자료구조를 하나 선정하여 데이터 관리 프로그램을 제작하는 프로젝트입니다. What's in my RefrigeratorWhat's in my Refrigerator 는 냉장고 속 식재료 데이터를 관리하는 프로그램입니다. What's in my Refrigerator의 기능
Heap을 자료구조로 사용한 이유
class 다이어그램주요 기능
보다 자세한 사항은 링크에 첨부된 파일들(제안서, 발표 자료, 소스코드 등)을 참고해주시면 감사하겠습니다 :) class Refrigeratorsource code
데이터 관리에 사용한 자료 구조인 힙을 구현한 파일입니다. 소스 코드 보기: 더보기
데이터 관리 프로그램의 CRUD를 처리하는 기능과 냉장고 속 식재료 데이터를 저장하는 텍스트 파일에서 데이터를 읽어오고, 변경되거나 추가된 데이터를 써서 저장하는 기능을 가지고 있는 가장 핵심이 되는 클래스입니다. 파일을 읽고 쓰기위한 메소드는 File_manage.py 파일에 따로 만들어 두고, 파일에서 필요한 정보를 읽고, 쓸때 임포트해서 사용했습니다. 데이터 파일에 각 아이템의 포맷은 "type, item_name, date, stock" 입니다. ex) ingredient,당근,2021-01-03,3
File_manager에 정의된 read_file 메소드로 데이터 파일을 open해서 데이터를 readlines()로 읽어온 데이터를 반환받습니다.
반환받은 각 데이터 라인들이 하나의 item이라고 생각하시면 됩니다. 그리고 ','을 기준으로 split을 하여 type, name, use_by_date,stock에 저장합니다. 그리고 각 아이템들의 type에 따라 ingredient면 Ingredient 타입 배열에, dish면 Dish 타입 배열에 name, use_by_date, stock 값을 append해 줍니다.
수정 또는 추가되는 아이템들의 name, use_by_date, stock 값을 각각 받아 data 배열에 저장해 두고, 그 배열의 각 아이템들을 type, name, use_sy_date, stock 형식에 맞게 변환한 후, content 라는 배열에 append합니다.
contents는 File_manager에 구현된 write_file 메소드로 전달됩니다. 기존 데이터 파일을 open하고, contents 배열에 저장된 아이템들을 write해줍니다. File_manager.py 소스 코드 보기: 더보기
다음 주요 기능 CRUD 코드에 대한 설명입니다.
새로운 식재료 정보를 인자로 받아 추가하는 메소드입니다. 전달받은 인자들로 Food 중 ingredient 타입의 오브젝트를 만들어 아이템을 유효기간 날짜 순으로 정렬하면서 삽입하는 메소드로 전달합니다.
새로운 식재료 객체를 전달받은 힙 자료구조는 전체 아이템 개수를 나타내는 last 변수를 1 증가시키고, 아이템 객체들의 배열인 data에 새로운 객체를 append하고, 정렬을 위해 Heap의 upHeap_by_date 메소드을 호출합니다.
아이템 전체 개수를 i 인자로 받은 upHeap_by_date는 현재 힙 자료구조가 빈 상태였다면 새로 추가된 객체가 루트일 수 있습니다. 이 경우 정렬할 필요가 없으므로 그냥 return 해줍니다. 그리고 유효기간의 날짜에 따라 재귀적으로 정렬을 수행하며 힙 속성을 복구해 줍니다.
저장되어 있는 식재료 데이터 전체를 보여주는 메소드입니다. data 배열 처음부터 끝까지 프린트해줍니다. cnt는 보여줄 때 인덱스로 사용하기 위해 사용했습니다.
ingredient_read_all 메소드가 단순히 data 배열에 저장된 순서대로 아이템을 나열하는 메소드라면 이 메소드는 use_by_date를 기준으로 정렬된 순서로 item을 보여주는 메소드입니다. 위와 마찬가지로 data의 처음부터 끝까지 출력하는데 이때 get_sorted_by_date()를 먼저 호출해줍니다.
** copy.deepcopy는 파이썬 내장 모듈인 copy을 임포트해서 사용하는 메소드로 원본 배열의 주소 값을 복사해서 참조하는 것이 아니라 원본 배열 객체 자체를 복사하는 것입니다. 이를 통해 Heap 클래스 객체 자체를 복사해서 result에 저장하고, 복사된 객체에 저장된 모든 노드를 for loop을 돌게하여 downHeap을 수행시킵니다.
downHeap을 수행할 현재 노드를 인자로 전달받습니다. 이 값에 왼쪽 자식 노드가 없다면 이 노드가 루트노드임을 의미하기 때문에 재귀를 끝냅니다. 오른쪽 자식 노드가 있다면 use_by_date을 비교해서 왼쪽 자식노드와 오른쪽 자식노드 중 그 값이 큰 값을 greater에 저장하고, 현재 노드와 greater 중 현재 노드가 더 크거나 같다면 힙 속성을 만족하는 것이므로 downHeap을 끝냅니다. 또는 자식이 더 큰 경우에는 그 값이 상위로 올라가야 하기 때문에 현재노드와 greater 노드의 위치를 스왑하고 바꾼 위치를 다시 재귀 함수 인자로 전달하여 downHeap을 수행합니다. 즉, 힙 속성을 만족하면 멈출 수 있는 재귀함수 입니다.
데이터의 인덱스 값으로 접근하여 해당 아이템에 새로운 이름을 지정하는 메소드입니다. Food 클래스의 setter 메소드인 update_name을 사용합니다.
데이터의 인덱스로 접근해 use_by_date 값을 수정하는 메소드입니다. 이 값이 정렬 key이기 때문에 이 값을 수정하면 힙 속성 복구를 위해 upHeap 과 downHeap을 수행해야 합니다.
재고수를 업데이트하는 메소드로 이 역시 Food 클래스 메소드를 사용합니다.
주어진 인덱스 값의 데이터를 제거하는 메소드입니다. 값을 제거한 후 힙 속성 복구를 위한 작업이 필요하기 때문에 힙 클래스의 메소드를 호출합니다.
삭제하려고 하는 데이터의 인덱스가 현재 데이터에 저장된 아이디 보다 큰 경우, None을 반환합니다. 일단 제거하려는 아이템 인덱스와 객체 배열의 가장 마지막에 저장된 아이템 인덱스를 swap_elemet에 전달해 스왑합니다. 그러면 last에 제거하려는 값이 저장되기 때문에 이 값을 배열에서 pop하고 그 값은 반환하기 위해 removed 변수에 따로 저장해둡니다. 그리고 배열 전체 개수를 나타내는 변수 last를 1 감소 시킵니다. 그런 뒤, 힙 속성을 복구시키기 위해 추가된 아이템 노드를 기준으로 upHeap과 downHeap을 수행하고, removed 값을 반환합니다. 다음은 추가 기능에 대한 설명입니다.
저장된 아이템 중 유통기한이 지난 아이템을 보여주는 메소드입니다. 모든 아이템들의 use_by_date 를 오늘 날짜와 비교하여 지난 아이템들을 result라는 변수에 저장해서 보여줍니다.
유통기한이 임박한 식재료를 알려주기 위한 메소드입니다. ingredient_passed_date 메소드와 유사하나 그 값을 오늘 날짜와 비교하여 0 보다 크거나 같은 값을 저장해 반환합니다. 다음은 가지고 있는 식재료를 이용하여 만들 수 있는 요리를 알려주는 기능을 위한 메소드에 대한 소개입니다.
Recipe_book 클래스 객체를 이용합니다. Recipe_book 객체는 recipe 객체 배열을 가지고 있습니다. 이 배열은 recipe 객체는 "요리명/식재료1, 식재료,2.." 와 같은 포맷입니다. ex) 치즈감자전/감자,치즈 Recipe_book에 저장된 recipe 객체 배열 중 하나를 인자로 전달 받은 make_dish 메소드는 이 recipe에 필요한 레시피 중 하나라도 냉장고에 있는 식재료가 아닌 경우 만들 수 없으므로 false를 반환합니다. 이렇게 check_condition을 통과한 뒤, 냉장고에 저장된 모든 아이템에 중 recipe에 사용될 식재료는 사용했으므로 제고 수를 줄이고, 재고수가 더 이상 없는 경우도 만들 수 없으므로 false를 반환합니다. Refrigerator.py소스 코드 보기 : 더보기
프로젝트 리뷰구현을 위해 힙 자료 구조에 대해 정확하게 공부할 수 있는 좋은 기회였습니다. 또한 프로젝트 구현 전, 제안서를 작성하면서 관련 다이어그램을 그려볼 수 있었습니다. 또한 파이썬 코딩 실력이 뛰어나신 팀원 분과 협업을 통해 개발을 하면서 파이썬 코드에 대해서도 많이 배우고, 새로운 모듈 등에 대해서도 공부할 수 있었습니다. 소스 코드 및 관련 문서DSC2_팀프로젝트_박준석, 김승윤.zip 0.98MB |