728x90
반응형

매개변수

 

### 위치 매개변수를 사용하는 함수

def function1(a, b) :
    print(a, b)

function1(1, 2)
1 2

 

### 기본값(default) 정의 매개변수를 사용하는 함수

 

▶ 기본값이 2번째 매개변수로 오는 경우

def function2(a, b=3) :
    print(a, b)

function2(1)
1 3

 

 매개변수에 모두 기본값을 설정한 경우

def function2(a=5, b=3) :
    print(a, b)

function2()
5 3

 

 기본값이 1번째 매개변수로 오는 경우 > 오류발생!

def function2(a=5, b) :
    print(a, b)

function2(1)
 Cell In[12], line 1
    def function2(a=5, b) :
                       ^
SyntaxError: non-default argument follows default argument

 

### 키워드 정의 방식

def function3(a, b) :
    print(a, b)
function3(a=3, b=5)
function3(a=6, b=4)
3 5
4 6

 

### 가변형 매개변수를 사용한 함수1
- 전달할 값이 몇개 인지 모를때 사용하는 방식
- 튜플타입으로 반환

def function4(*args) :
    print(args)
function4(1, 2, 3)
function4(1, 2, 3, 6, 9)
(1, 2, 3)
(1, 2, 3, 6, 9)

 

### 가변 키워드 매개변수를 사용한 함수 2
- 전달할 값이 몇개 인지 모를때 사용하는 방식
- ** 뒤에 변수 이름은 아무거나 상관없음. 그러나 대부부 args 사용
- 딕셔너리 타입으로 반환

def function5(**args) :
    print(args)
function5(a=1, b=2, c=3)
function5(a=1, b=2, c=3, d=6, e=9)

dic = {"a" : 33, "b" : 55}
function5(a=33, b=55) #딕셔너리를 넘기면 a=33, b=55의 형태로 변환되어 처리됨
function5(**dic)
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3, 'd': 6, 'e': 9}
{'a': 33, 'b': 55}
{'a': 33, 'b': 55}
728x90
반응형
728x90
반응형

주제 :  도서 입고/대출/반납 관리를 위한 키오스크 파이썬 프로그램 실습

 

1. 주요내용 : 실습1에서  작성한 도서 관리 프로그램에 데코레이터를 적용하기

 

데코레이터 추가한 코드

### 기능을 수행할 클래스(모듈 or 라이브러리) 정의
class LibraryKiosk :
    ### 클래스 생성자 정의
    # self = 클래스의 모든 변수에 접근할 수 있도록 하는 것. 
    def __init__(self) :
        ### 도서 목록을 저장할 딕셔너리 변수 생성
        # - 도서번호, 도서제목, 도서재고수량 정보 담기
        self.books = {}
        print("클래스 생성")
        
    #--------------------------------------------------------------
    
    ### 도서입고 데코레이터 함수 정의하기|
    def add_book_decorator(func) :
        def wrapper(self, book_id, title, quantity):
            ### 입고할 도서번호가 존재하는지 확인
            # - 존재한다면 수량만 증가시키기
            func(self, book_id, title, quantity)
        return wrapper

    ### 도서대출 데코레이터 함수 정의하기
    def borrow_book_decorator(func):
        def wrapper(self, book_id, title, quantity):
            ### 대출하고자 하는 도서번호에 해당하는 재고수량 확인
            if (book_id in self.books) and (self.books[book_id]['quantity']) > 0 :
                self.books[book_id]['quantity'] -= 1
                print("대출이 완료되었습니다.")
                print(f"도서번호 : {book_id} / 제목 : {self.books[book_id]['title']} / 남은재고수량 : {self.books[book_id]['quantity']}")
            else:
                print("도서가 존재하지 않거나, 대출할 재고가 없습니다.")
        return wrapper

    ### 반납기능 데코레이터 함수 정의하기
    def return_book_decorator(func) :
        def wrapper(self, book_id, title, quantity):
            # - 반납할 도서번호가 도서목록에 있는지 확인
            if book_id in self.books :
                self.books[book_id]["quantity"] += 1
                print(f"도서번호 : {book_id} / 제목 : {self.books[book_id]['title']} / 남은재고수량 : {self.books[book_id]['quantity']}")
                
            # - 해당 도서가 목록에 없다
            else:
                print("해당 도서가 존재하지 않습니다.")
        return wrapper
            
    #--------------------------------------------------------------
    
    ### 도서입고 기능 정의하기
    @add_book_decorator
    def add_book(self, book_id, title, quantity) :
        ### 입고할 도서번호가 존재하는지 확인
        # - 존재한다면 수량만 증가시키기
        if book_id in self.books : # 여기서 books는 key값만 list로 가져옴
            # self.books[book_id]["quantity"] = self.books[book_id]["quantity"] + quantity
            self.books[book_id]["quantity"] += quantity
        # - 존재하지 않는다면
        else :
            # {book_id : {"tilte" : tilte, "quantity" : quantity} }
            # {"001" : {"tilte" : "파이썬 기초", "quantity" : 4} }
            self.books[book_id] = {"title" : title, "quantity" : quantity}
        print(f"도서번호 : {book_id} / 제목 : {title} / 입고수량 : {quantity} 입고성공:)")

    ### 도서 대출 기능 정의하기
    @borrow_book_decorator
    def borrow_book(self, book_id):
        ### 대출하고자 하는 도서번호에 해당하는 재고수량 확인
        if (book_id in self.books) and (self.books[book_id]['quantity']) > 0 :
            self.books[book_id]['quantity'] -= 1
            print("대출이 완료되었습니다.")
            print(f"도서번호 : {book_id} / 제목 : {self.books[book_id]['title']} / 남은재고수량 : {self.books[book_id]['quantity']}")
        else:
            print("도서가 존재하지 않거나, 대출할 재고가 없습니다.")

    ### 반납 기능 정의하기
    @return_book_decorator
    def return_book(self, book_id) :
        # - 반납할 도서번호가 도서목록에 있는지 확인
        if book_id in self.books :
            self.books[book_id]["quantity"] += 1
            print(f"도서번호 : {book_id} / 제목 : {self.books[book_id]['title']} / 남은재고수량 : {self.books[book_id]['quantity']}")
            
        # - 해당 도서가 목록에 없다
        else:
            print("해당 도서가 존재하지 않습니다.")
728x90
반응형
728x90
반응형

<클로저(Closure)>
- 함수 안에 함수를 만들어서 사용하는 방식
- 함수 안에 있는 함수는 바깥쪽 함수에서 참조해서 사용하는 방식으로 접근합니다.
- 함수 안에 함수는 사용이 끝나면 메모리에서 해제되기 때문에 유용하게 사용하면 좋습니다.

 

### 클로저 함수 정의하기

def outer_function(x) :
    print(f"#1 : x = {x}")
    ### 내부 함수 정의 : 실제 실행되는 함수
    def inner_function(y) :
        print(f"#2 : y = {y}")
        s = x + y
        print(f"#3 : s = {s}")
        return s
    print("#4 -------")    
    return inner_function

 

### 클로저 함수 호출하기

- outer만 호출되었기 때문에 inner는 메모리를 받아서 정의만 되고 실행되지 않았다.
- closure_exe는 0x000001DA19EF1800 값을 받은 inner함수 그 자체가 된 것이다.

 - closure_exe는 inner_function 자체를 리턴받은 함수를 의미함

closure_exe = outer_function(10) 

print(closure_exe)
#1 : x = 10
#4 -------
<function outer_function.<locals>.inner_function at 0x000001DA19DE9120>

 

### 내부 함수 호출하기
- 내부 함수는 실행되고 끝나면 소멸된다

result1 = closure_exe(5)
print(result1)
#2 : y = 5
#3 : s = 15
15

 

<클로저를 이용해서 프로그램 만들기>

- 클로저를 이용해서 누적합 계산하기
- 사용함수명 : outer_function2(), inner_function2(num)
- 사용변수 : total(누적된 값을 저장할 변수)
- total은 바깥 함수에 둬야 함.
- total은 지역변수가 아니므로 안쪽 함수에서 total을 가져오려면 nonlocal 선언을 해줘야 함.

- nonlocal : 클로저 구조에서는 상위 변수를 내부 함수에서 사용 못한다. 따라서 nonlocal을 지정해서 정의하면 외부 영역의 변수 사용 가능해진다. (바깥에 있는 total을 쓴다는 의미)    

def outer_function2() : 
    total = 0
    print(f"#1 : total = {total}")
    def inner_function2(num) :
        nonlocal total
        print(f"#2 : total = {total} / num = {num}")
        total += num
        print(f"#3 : total = {total} / num = {num}")
        return total
    print("#4 -------")   
    return inner_function2

 

### 클로저 함수 호출하기

res_fnc = outer_function2() 
print(res_fnc)
#1 : total = 0
#4 -------
<function outer_function2.<locals>.inner_function2 at 0x000001DA1A479580>

 

### 내부 함수 호출

rs_total = res_fnc(5)
print(rs_total)
#2 : total = 0 / num = 5
#3 : total = 5 / num = 5
5
rs_total = res_fnc(8)
print(rs_total)
#2 : total = 5 / num = 8
#3 : total = 13 / num = 8
13

 

<조건부 클로저 함수 프로그래밍>

 - condition의 값이 true이면 true_case함수 정의,  falsedlaus false_case함수 정의

def outer_function3(condition) :
    def true_case() :
        return "true_case 함수가 호출되었습니다."
    def false_case() :
        return "false_case 함수가 호출되었습니다."

    rs = true_case if condition else false_case 
    
    return rs

 

### 상위 함수 호출하기

rs_function = outer_function3(True)
print(rs_function)

rs_function = outer_function3(False)
print(rs_function)
<function outer_function3.<locals>.true_case at 0x00000231AA761A80>
<function outer_function3.<locals>.false_case at 0x00000231AA762160>

 

### 내부 함수 호출하기

rs_msg = rs_function()
print(rs_msg)
false_case 함수가 호출되었습니다.

 

728x90
반응형
728x90
반응형

<유니코드 프로그램>
- 언어를 표준화 시키는 방법
- 유니코드 국제코드 타입 UTP-8
- 유니코드 변환작업 : 인코딩(암호화), 디코딩(복호화)
- 유니코드(Unicode)는 전 세계의 모든 문자를 표현하기 위한 표준 인코딩 체계
- 유니코드 프로그램 : 언어, 문자, 특수기호 등의 표준화

 

### 문자열 결합하기

string1 = "파이썬(python)"
string2 = " 재미있어요"
string = "!!!"
print(string1 + string2 + string3)
파이썬(python) 재미있어요!!!

 

### 문자열을 UTF-8로 인코딩하기

text = "안녕하세요"
encode_text = text.encode("utf-8")
encode_text
b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94'

 

### 문자열을 UTF-8로 디코딩하기

decode_text = encode_text.decode("utf-8")
decode_text
'안녕하세요'

 

### 간단 실습

- "안녕하세요" 문자열을 for문을 이용해서 각각 출력하기
- 인덱스 번호를 이용하는 방식 사용

 

만들어 본 코드

# 1
hi = list("안녕하세요")
print(hi)
for i in hi :
    print(i)

# 2
text = "안녕하세요"
for i in range(len(text)):
    print(f"{text[i]}")

 

결과

#1
['안', '녕', '하', '세', '요']






#2





강사님 코드

# 1
###for문 - 값을 이용해서 추출하는 방식
for v in decode_text : 
    print(v)

# 2
### for문 -인덱스 번호를 비용해서 추출하는 방식
for i in range(0, len(decode_text), 1) :
    print(decode_text[i])

 

결과

# 1






# 2




 

### 눈 모양 유니코드 만들기

# 1
char = "\u2603"
print(char)

# 2
# for문을 이용하지 말고, 눈사람 5개 출력해주세요
print(char * 5)
# 1


# 2
☃☃☃☃☃

 

### 십진수 숫자값을 문자로 변환하기

num = 65
print(num, chr(num))
65 A

 

### 문자열에서 특정 문자의 위치 찾기

string = "안녕하세요!!"

# "하" 라는 문자의 위치(인덱스) 찾기
print(string.index("하"))
2

 

### 문자 치환하기

string = "python 기초 문법"

# "python" 영문 문자열을 찾아서 :"파이썬" 한글명으로 수정하기
print(string.replace("python", "파이썬"))
파이썬 기초 문법
728x90
반응형
728x90
반응형

주제 :  도서 입고/대출/반납 관리를 위한 키오스크 파이썬 프로그램 실습

 

1. 주요내용

- 도서 목록 : 새로운 책이 도서관에 [입고]되었을 때 프로그램 작성
- 도서 대출 : 도서 목록에서 임의 책을 빌리고자 할 때 [대출] 프로그램 작성
- 도서 반납 : 대출한 도서를 [반납]하고자 할 때 프로그램 작성
- 종료하기 : 종료하기에 대한 프로그램 작성
- 도서 입고/대출/반납/종료 중 원하는 것을 선택했을 때 위 내용을 수행합니다.
- 프로그램을 종료하기 전까지는 위 내용은 누구든지 서비스를 받을 수 있도록 반복 실행
- 도서에 대한 확인 값은 자유롭게 정의하여 진행

2. 요구사항
- class 생성하여 처리

 

3. 내가 적어본 코드

class Library():
        def __init__(self):
            self.__library = list()
            
        def start_service(self):
            while True:
                start = input('어떤 서비스를 이용하시겠습니까? ')
                if start == "입고":
                    self.stock()
                elif start == "대출":
                    self.loan()
                elif start == "반납":
                     self.re()
                elif start == "종료":
                    self.end()
      
        def stock(self):
            print('입고정보를 입력해주세요')
            customer = { 'name':'', 'count': 0, 'bookName': ''}
            customer['name'] = input('이름을 입력하세요 : ')
            customer['count'] = int(input('입고 갯수를 입력하세요 : '))
            customer['bookName'] = input('책 제목 : ')
            print(f'입고정보 : {customer}')
            
            self.__library.append(customer)
            
            book_count = customer['count']
            book_name = [customer['bookName'] for customer in self.__library]
            
            if book_count >= 0:        
                print(f'책이 {book_count}권 입고 되었습니다')
                print(f'잔여 책 갯수: {len(self.__library)}')
                print(f'책 목록: {book_name}')
            return self.__library
            
        def loan(self):
            print('대출정보를 입력해주세요')
            customer = { 'name':'', 'count': 0, 'bookName': ''}
            customer['name'] = input('이름을 입력하세요 : ')
            customer['count'] = int(input('대출 갯수를 입력하세요 : '))
            customer['bookName'] = input('책 제목 : ')
            print(f'대출정보 : {customer}')
            
            removed_customers = []
            
            for i in self.__library:
                if i['bookName'] == customer['bookName']:
                    removed_customers.append(i)
        
            for i in removed_customers:
                self.__library.remove(i)
                
            new_book_name = [customer["bookName"] for customer in self.__library]
            book_count = customer['count']
            if book_count > 0:
                print(f'책이 {book_count}권 대출 되었습니다')
                print(f'잔여 책 갯수: {len(self.__library)}')
                print(f'책 목록: {new_book_name}')
            return self.__library
            
        def re(self):
            print('반납정보를 입력해주세요')
            customer = { 'name':'', 'count': '', 'bookName': ''}
            customer['name'] = input('이름을 입력하세요 : ')
            customer['count'] = int(input('반납 갯수를 입력하세요 : '))
            customer['bookName'] = input('책 제목 : ')

            self.__library.append(customer)
            
            book_count = customer['count']
            book_name = [customer['bookName'] for customer in self.__library]
            
            if book_count >= 0:
                print(f'책이 {book_count}권 반납 되었습니다')
                print(f'잔여 책 갯수: {len(self.__library)}')
                print(f'책 목록: {book_name}')
            return self.__library

        def end(self):
            print('종료되었습니다')
            
if __name__ == '__main__':
    a = library()
    a.start_service()

 

3 -1. 코드 실행결과

 

4. 강사님 코드

- class와 main함수 따로 작성

### 기능을 수행할 클래스(모듈 or 라이브러리) 정의
class LibraryKiosk :
    ### 클래스 생성자 정의
    # self = 클래스의 모든 변수에 접근할 수 있도록 하는 것. 
    def __init__(self) :
        ### 도서 목록을 저장할 딕셔너리 변수 생성
        # - 도서번호, 도서제목, 도서재고수량 정보 담기
        self.books = {}
        print("클래스 생성")

    ### 도서입고 기능 정의하기|
    def add_book(self, book_id, title, quantity) :
        ### 입고할 도서번호가 존재하는지 확인
        # - 존재한다면 수량만 증가시키기
        if book_id in self.books : # 여기서 books는 key값만 list로 가져옴
            # self.books[book_id]["quantity"] = self.books[book_id]["quantity"] + quantity
            self.books[book_id]["quantity"] += quantity
        # - 존재하지 않는다면
        else :
            # {book_id : {"tilte" : tilte, "quantity" : quantity} }
            # {"001" : {"tilte" : "파이썬 기초", "quantity" : 4} }
            self.books[book_id] = {"title" : title, "quantity" : quantity}
        print(f"도서번호 : {book_id} / 제목 : {title} / 입고수량 : {quantity} 입고성공:)")

        # 여기서 books는 key값만 list로 가져옴
        # 딕셔너리가 이미 만들어져있고 추가하기만 하면 됨
        # self.books[book_id] 이 형태는 key를 줄테니 값(딕셔너리)을 달라!
                     # self.books[book_id]["quantity"] 불러온 딕셔너리에서 또 값을 불러옴
        # self.books[book_id] = {"tilte" : tilte, "quantity" : quantity} 그 값에 제목과 수량을 넣는다.

    ### 도서 대출 기능 정의하기
    def borrow_book(self, book_id):
        ### 대출하고자 하는 도서번호에 해당하는 재고수량 확인
        if (book_id in self.books) and (self.books[book_id]['quantity']) > 0 :
            self.books[book_id]['quantity'] -= 1
            print("대출이 완료되었습니다.")
            print(f"도서번호 : {book_id} / 제목 : {self.books[book_id]['title']} / 남은재고수량 : {self.books[book_id]['quantity']}")
        else:
            print("도서가 존재하지 않거나, 대출할 재고가 없습니다.")

    ### 반납 기능 정의하기
    def return_book(self, book_id) :
        # - 반납할 도서번호가 도서목록에 있는지 확인
        if book_id in self.books :
            self.books[book_id]["quantity"] += 1
            print(f"도서번호 : {book_id} / 제목 : {self.books[book_id]['title']} / 남은재고수량 : {self.books[book_id]['quantity']}")
            
        # - 해당 도서가 목록에 없다
        else:
            print("해당 도서가 존재하지 않습니다.")
### 2. 최초에 실행할 기능(함수)
def main() :
    ### 클래스 생성하기
    # - 최초 한번 : 프로그램이 종료되면 클래스는 소멸(메모리 공간 삭제)됩니다.
    kiosk = LibraryKiosk()
    print(kiosk)
    
    #print("main 함수 호출")
    ### 3. 메뉴 선택 보여주기
    while True :
        print("<도서 키오스크 메뉴>")
        print("1. 도서 입고")
        print("2. 도서 대출")
        print("3. 도서 반납")
        print("4. 종료")

        choice = input("원하는 번호(1~4)를 선택하세요 : ")

        if choice == "1" :
            # print("입고 선택")
            book_id = input("도서 번호를 입력해 주세요 : ")
            title = input("도서 제목를 입력해 주세요 : ")
            quantity = int(input("입고할 권수를 입력해 주세요 : "))
            # print(f"{book_id} / {title} / {quantity}")

            # - 클래스 내부의 입고 기능 호출하기
            kiosk.add_book(book_id, title, quantity)
            
        elif choice == "2" :
            # print("대출 선택")
            book_id = input("대출할 도서번호를 입력해주세요 : ")

            ### 클래스 내부의 대출 기능 호출하기
            kiosk.borrow_book(book_id)
            
        elif choice == "3" :
            # print("반납 선택")
            book_id = input("반납할 도서번호를 입력해주세요 : ")

            ### 클래스 내부의 반납 기능 호출하기
            kiosk.return_book(book_id)
            
        elif choice == "4" :
            print("종료 선택")
            break
        else :
            print("다시 선택해주세요")
### 1. 최초 코드 시작
if __name__ == "__main__":
    ### 최초에 실행할 기능(함수) 호출
    main()

 

4 -1. 코드 실행 결과

728x90
반응형
728x90
반응형

문자열 메소드

- lower() : 소문자로 변환된 새 문자열을 반환한다.

- upper() : 대문자로 변환된 새 문자열을 반환한다.

     >> lower() 및 upper() 메소드는 대소문자를 구분하지 않고 비교할 때 아주 유용하다. 다음 코드에서는 문자열이 먼저 소문자로 변환되기 때문에, 사용자가 yes, Yes, YES중에서 어떤 것을 입력하더라도 올바르게 동작한다.

print('계속 진행하시겠습니까?')
response = input()
if response.lower() == 'yes':
    print('계속')
else:
    print('나가기')

- startswith(n) : 문자열 n으로 시작되는 문자열이면 True가 반환된다.

- endswith(n) : 문자열 n으로 종료되는 문자열이면 True가 반환된다.  

- split()

     > 주어진 분리자를 이용하여 문자열을 토큰들의 리스트로 반환한다.

     > 여러 줄로 이루어진 문자열을 한줄씩 분리하는데도 사용된다.

- list() : 문자열을 문자로 분해한다.


- join()

     > 문자열 리스트를 전달받아 접착제 문자를 중간에 넣어서 문자열을 결합한다.

     > 전화번호에서 '.'  문자 대신에 '-' 문자를 사용하고 싶으면 다음과 같은 코드 사용

'-'.join('010.1234.5678'.split('.'))

     > 문자들을 모아서 다시 문자열로 만들때 사용


     > split()와 join()을 함께 사용하면 문자열 중에서 필요 없는 공백을 제거할 수 있다.

- strip() : 시작이나 끝에 공백 문자가 없는 새 문자열을 반환한다.

- ord() : 문자의 코드값을 가져온다.

- chr() : ord()의 반대기능을 수행한다. 숫자 값 n을 전달하면, n에 해당하는 문자를 반환한다.

- len() :  문자열의 길이를 반환한다.

- find()

     > 문자열 안에서 특정 단어를 찾아서 인덱스를 반환한다. 찾지 못했을 경우에는 -1을 반환한다.

     > s.find()는 역순으로 문자열 안에서 단어를 검색한다.

- count() : 문자열 중에서 단어가 등장하는 횟수를 반환한다.

- replace() : 문자열에서 하나의 단어를 다른 단어로 교체할 때 사용한다.

 

문자열 검사 메소드

- isupper() :  문자열이 대문자로만 구성되는 경우 True를 반환한다.

- islower() :  문자열이 소문자로만 구성되는 경우 True를 반환한다.

- isalpha() : 문자열이 영문자로만 구성되는 경우 True를 반환한다.

- isalnum() : 문자열이 영문자와 숫자로만 구성되는 경우 True를 반환한다.

- isdecimal() : 문자열이 숫자로만 구성되는 경우 True를 반환한다.

- isspace() : 문자열이 공백, 탭 및 줄바꿈 문자인 경우 True를 반환한다.


정규식

- regular expression : 패턴을 이용해서 문자열을 찾거나 바꾸는 기능

- 문자열 표현 수


- 수량 한정자

 

728x90
반응형

+ Recent posts