[파이썬] 클래스(class)에 관하여 쉽게 정리

평소에 클래스에 대해 재정리를 하고 싶은 생각이 들어서 글을 씀.

참고 사이트

내 정리

  • 클래스는 과자 틀, 그걸로 인해 만들어진 과자는 객체 ( a= FourCal()에서 a는 객체 )
  • 생성자는 객체에 초깃값을 넣어줄때 사용함( a=FourCals(4, 2) 이런식으로 씀 )
  • 클래스 상속 : 이미 있는 클래스를 복사해서 고치기 위함
  • 메서드 오버라이딩 : 그안에 있는 메서드(def)를 바꾸고 싶을때 ex)0으로 나누기
  • 클래스 변수 : 독립적이지않다(객체변수는 독립), ( ex) Family.lastname = “박” 이렇게 클래스이름.클래스변수를 바꾸면 lastname이 다바뀜)

Continue reading

[파이썬]노트, 노트북 만들기

파이썬 강좌_CS50_K-MOOC(가천대)유튜브 의 과제 중 노트와 노트북을 만들어 보겠습니다.

class라는 것을 처음 배워서 약간 어렵긴했지만 강의를 반복해서 듣고 나서 이해를 함. 아래 코드처럼 클래스를 이용해서 def들을 정의 해주면 됨.

class Note(object):
    def __init__(self, content=None):
        self.content = content
# 컨텐츠의 기본값을 넣어서 굳이 안넣어줘도 되는 편안함이 있다.
    def write_content(self, content):
        self.content = content

    def remove_all(self):
        self.content = ""

    def __str__(self):
        return self.content
#출력

class NoteBook(object):
    def __init__(self, title):
        self.title = title
        self.page_number = 1
        self.notes = {}
# 노트라는 오브젝트를 넣어라
    def add_note(self, note, page=0):
        if self.page_number < 300:
            if page == 0:
                self.notes[self.page_number] = note
                # 딕트 타입이니깐 {1 : a } 이렇게 나온다
                self.page_number += 1
            else:
                self.notes = {page : note}
                self.page_number += 1
        else:
            print("Page가 모두 채워졌습니다.")

    def remove_note(self, page_number):
        if page_number in self.notes.keys():
            # key에 있다면
            return self.notes.pop(page_number)
            # 찢는다.
        else:
            print("해당 페이지는 존재하지 않습니다.")

    def get_number_of_pages(self):
        return len(self.notes.keys())
    #전체 페이지의 수

이렇게 클래스를 정해준다음 실제로 돌아가는지 테스트를 해보자.

from note_module import NoteBook
from note_module import Note

quote_book = NoteBook("The Quote Book")

new_note = Note()
new_note.write_content("Don't cry because it's over smile because it happened. -Dr. Seuss")

quote_book.add_note(new_note)

print(quote_book.get_number_of_pages())

quote_book.add_note(Note("Hello, World"))
quote_book.add_note(Note("Hello, World"))
quote_book.add_note(Note("Hello, World"))
quote_book.add_note(Note("Hello, World"))
quote_book.add_note(Note("Hello, World"))

print(quote_book.get_number_of_pages())

my_note = quote_book.remove_note(1)
print(my_note)

print(quote_book.get_number_of_pages())

이렇게 해보면 노트북과 노트를 이용해 추가도 해보고 삭제도 해보고 노트의 갯수도 찍어볼 수 있다.

Continue reading

[파이썬]베이스볼 게임 만들기

파이썬 강좌_CS50_K-MOOC(가천대) 의 과제 중 하나였던 베이스볼 게임을 만들어 보도록 하겠습니다.

랜덤한 3자리 정수를 만든다.

import random
def get_random_number():
    # Helper Function - 지우지 말 것
    # 100부터 999까지 수를 램덤하게 반환함
    return random.randrange(100, 1000)

정수인지를 체킹할때 사용할 함수를 만든다.

def is_digit(user_input_number):
    # '''
    # Input:
    #   - user_input_number : 문자열 값
    # Output:
    #   - user_input_number가 정수로 변환 가능할 경우는 True,
    #     그렇지 않을 경우는 False
    # Examples:
    #   >>> import baseball_game as bg
    #   >>> bg.is_digit("551")
    #   True
    #   >>> bg.is_digit("103943")
    #   True
    #   >>> bg.is_digit("472")
    #   True
    #   >>> bg.is_digit("1032.203")
    #   False
    #   >>> bg.is_digit("abc")
    #   False
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당

    result = user_input_number.isdigit()

    # ==================================
    return result

3자리 숫자이면 True를 출력한다.

def is_between_100_and_999(user_input_number):
    # '''
    # Input:
    #   - user_input_number : 문자열 값
    #                         입력된 값은 숫자형태의 문자열 값임이 보장된다.
    # Output:
    #   - user_input_number가 정수로 변환하여 100이상 1000미만일 경우 True,
    #     그렇지 않을 경우는 False
    # Examples:
    #   >>> import baseball_game as bg
    #   >>> bg.is_between_100_and_999("551")
    #   True
    #   >>> bg.is_between_100_and_999("103943")
    #   False
    #   >>> bg.is_between_100_and_999("472")
    #   True
    #   >>> bg.is_between_100_and_999("0")
    #   False
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당
    result = False
    if len(user_input_number) == 3:
        result = True


    # ==================================
    return result

중복되는 수가 있으면 True를 출력하게 한다.

def is_duplicated_number(three_digit):
    # '''
    # Input:
    #   - three_digit : 문자열로 된 세자리 양의 정수 값
    #                   문자열로 된 세자리 양의 정수값의 입력이 보장된다.
    # Output:
    #   - three_digit 정수로 변환하였을 경우 중복되는 수가 있으면 True,
    #     그렇지 않을 경우는 False
    #   ex) 117 - True, 123 - False, 103 - False, 113 - True
    # Examples:
    #   >>> import baseball_game as bg
    #   >>> bg.is_duplicated_number("551")
    #   True
    #   >>> bg.is_duplicated_number("402")
    #   False
    #   >>> bg.is_duplicated_number("472")
    #   False
    #   >>> bg.is_duplicated_number("100")
    #   True
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당

    result = False
    if three_digit[0] == three_digit[1] or three_digit[1] == three_digit[2] or three_digit[0] == three_digit[2]:
        result = True

    # ==================================
    return result

지금까지 했던 내용을 조합하여 1) 숫자형 문자열이며, 2) 100이상 1000미만이며, 3) 중복되는 숫자가 없을 경우 True를 출력해준다.

def is_validated_number(user_input_number):
    # '''
    # Input:
    #   - user_input_number : 문자열 값
    # Output:
    #   - user_input_number 값이 아래 조건이면 True, 그렇지 않으면 False를 반환
    #        1) 숫자형 문자열이며, 2) 100이상 1000미만이며, 3) 중복되는 숫자가 없을 경우
    # Examples:
    #   >>> import baseball_game as bg
    #   >>> bg.is_validated_number("amvd")
    #   False
    #   >>> bg.is_validated_number("402")
    #   True
    #   >>> bg.is_validated_number("472")
    #   True
    #   >>> bg.is_validated_number("100")
    #   False
    #   >>> bg.is_validated_number("1000")
    #   False
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당

    result = False
    if is_digit(user_input_number) is True and is_between_100_and_999(user_input_number) is True and is_duplicated_number(user_input_number) is False:
        result = True
    # ==================================
    return result

중복이 없는 3자리 정수를 랜덤하게 출력한다.

def get_not_duplicated_three_digit_number():
    # '''
    # Input:
    #   - None : 입력값이 없음
    # Output:
    #   - 중복되는 숫자가 없는 3자리 정수값을 램덤하게 생성하여 반환함
    #     정수값으로 문자열이 아님
    # Examples:
    #   >>> import baseball_game as bg
    #   >>> bg.get_not_duplicated_three_digit_number()
    #   125
    #   >>> bg.get_not_duplicated_three_digit_number()
    #   634
    #   >>> bg.get_not_duplicated_three_digit_number()
    #   583
    #   >>> bg.get_not_duplicated_three_digit_number()
    #   381
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당
    # get_random_number() 함수를 사용하여 random number 생성

    result = None

    while True:
        result = str(get_random_number())
        if is_duplicated_number(result) is False:
            result
            break
    # ==================================
    result = int(result)
    return result

읽어가면서 strike인 경우 하나씩 늘리고 ball인 경우 하나씩 늘린다.

def get_strikes_or_ball(user_input_number, random_number):
    # '''
    # Input:
    #   - user_input_number : 문자열값으로 사용자가 입력하는 세자리 정수
    #   - random_number : 문자열값으로 컴퓨터가 자동으로 생성된 숫자
    # Output:
    #   - [strikes, ball] : 규칙에 따라 정수형 값인 strikes와 ball이 반환됨
    #   변환 규칙은 아래와 같음
    #   - 사용자가 입력한 숫자와 컴퓨터가 생성한 숫자의
    #     한 숫자와 자릿수가 모두 일치하면 1 Strike
    #   - 자릿수는 다르나 입력한 한 숫자가 존재하면 1 Ball
    #   - 세자리 숫자를 정확히 입력하면 3 Strike
    # Examples:
    #   >>> import baseball_game as bg
    #   >>> bg.get_strikes_or_ball("123", "472")
    #   [0, 1]
    #   >>> bg.get_strikes_or_ball("547", "472")
    #   [0, 2]
    #   >>> bg.get_strikes_or_ball("247", "472")
    #   [0, 3]
    #   >>> bg.get_strikes_or_ball("742", "472")
    #   [1, 2]
    #   >>> bg.get_strikes_or_ball("472", "472")
    #   [3, 0]
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당

    strike = 0
    ball = 0
    for i in range(0, len(user_input_number)):
        if user_input_number[i] in random_number[i]:
            strike += 1
        elif user_input_number[i] in random_number:
            ball += 1
    result = [strike, ball]
    # ==================================
    return result

Yes의 다른 표현도 포함해준다.

def is_yes(one_more_input):
    # '''
    # Input:
    #   - one_more_input : 문자열값으로 사용자가 입력하는 문자
    # Output:
    #   - 입력한 값이 대소문자 구분없이 "Y" 또는 "YES"일 경우 True,
    #     그렇지 않을 경우 False를 반환함
    # Examples:
    #   >>> import baseball_game as bg
    # >>> bg.is_yes("Y")
    # True
    # >>> bg.is_yes("y")
    # True
    # >>> bg.is_yes("Yes")
    # True
    # >>> bg.is_yes("YES")
    # True
    # >>> bg.is_yes("abc")
    # False
    # >>> bg.is_yes("213")
    # False
    # >>> bg.is_yes("4562")
    # False
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당

    result = False
    upper_input = one_more_input.upper()
    if upper_input == "Y" or upper_input == "YES":
        result = True
    # ==================================
    return result

No의 다른 표현도 포함해준다.

def is_no(one_more_input):
    # '''
    # Input:
    #   - one_more_input : 문자열값으로 사용자가 입력하는 문자
    # Output:
    #   - 입력한 값이 대소문자 구분없이 "N" 또는 "NO"일 경우 True,
    #     그렇지 않을 경우 False를 반환함
    # Examples:
    #   >>> import baseball_game as bg
    # >>> bg.is_no("Y")
    # False
    # >>> bg.is_no("b")
    # False
    # >>> bg.is_no("n")
    # True
    # >>> bg.is_no("NO")
    # True
    # >>> bg.is_no("nO")
    # True
    # >>> bg.is_no("1234")
    # False
    # >>> bg.is_no("yes")
    # False
    # '''
    # ===Modify codes below=============
    # 조건에 따라 변환되어야 할 결과를 result 변수에 할당

    result = False
    one_more_input = one_more_input.upper()
    if one_more_input == "NO" or one_more_input == "N":
        result = True
    # ==================================
    return result

스트라이크가 3개 미만일때까지 돌아가는 while문을 짜준다. 그리고 게임이 끝났을때 다시 할지에 대한 반복문을 만들어준다. 여기서 가장 중요한 부분.

def main():
    print("Play Baseball")
    user_input = 999
    EndGame = False
    while EndGame is False:
        strikeAndBalls = [0, 0]
        random_number = str(get_not_duplicated_three_digit_number())
        print("Random Number is : ", random_number)
        # ===Modify codes below=============
        # 위의 코드를 포함하여 자유로운 수정이 가능함
        while strikeAndBalls[0] < 3: #스트라이크가 3개 미만일 때에만
            user_input = input("Input guess number : ")
            if user_input == "0":
                EndGame = True
                break
            elif is_validated_number(user_input):
                strikeAndBalls = get_strikes_or_ball(user_input, random_number)
                print("Strikes : ", strikeAndBalls[0], " , Balls : ", strikeAndBalls[1])
            else:
                print("Wrong Input, Input again")

        while EndGame is False:
            OneMore = input("You win, one more(Y/N) ?")
            if is_no(OneMore):
                EndGame = True
                break
            elif is_yes(OneMore):
                break
            else:
                print("Wrong Input, Input again")
    # ==================================
    print("Thank you for using this program")
    print("End of the Game")


if __name__ == "__main__":
    main()

Continue reading

[파이썬]팩토리얼(Factorial) 계산기 만들기

일단 파이썬 강좌_CS50_K-MOOC(가천대) 의 과제 중 하나였던 팩토리얼 계산기를 만들어 보도록 하겠습니다.

모든 내용은 파이썬 강좌_CS50_K-MOOC(가천대) 링크를 모두 읽었다고 가정하고 써내려가보도록 하겠습니다.

is_positive_number 함수 만들기

아래 코드를 보자.

def is_positive_number(integer_str_value):

    try:
        integer_str_value = int(integer_str_value) # 먼저 숫자형으로 바꾸고 난 후 처리해야 에러를 막을 수 있음
        if int(integer_str_value) == integer_str_value and integer_str_value > 0:
            return True
        else:
            return False
        # ==================================
    except ValueError:
        return False

# x = input("숫자 입력 : ") # 잘돌아가나 체크용
# print(is_positive_number(x))

try, except에 대해서는 몰라도 된다고 하지만 오류 예외 처리 기법으로 알면 될거같다. 더 자세히 알고 싶다면 점프투파이썬을 참조 하도록 하자. 플로우는 int로 변환했을때 그대로 숫자형이 나오고 0보다 크다면 True를, 나머지는 다 Fasle로 하라는 것이다.

get_factorial_value 함수 작성하기

아래 코딩을 보도록 하자.

def get_factorial_value(integer_value):
    factorial = 1
    for i in range(1, integer_value+1):
        factorial = factorial * i
    return factorial

# x = int(input("숫자 입력 : "))
# print(get_factorial_value(x))

팩토리얼을 어떻게 구현할까 고민했다. 결국 factorial 변수를 하나 설정해서 for문으로 1부터 내가 정해준 숫자까지 곱해주는 것을 선택했다.

main 함수 작성하기

이제 마지막인 메인 함수를 작성해보도록 하자.

def main():
    user_input=999
    while(user_input is not 0):
        user_input = input("Input a positive number : ")
        if is_positive_number(user_input) is True:
            user_input = int(user_input)
            real = get_factorial_value(user_input)
            print(real)
        elif is_positive_number(user_input) is False and user_input is '0':
            print("Thank you for using this program")
        else:
            print("Input again, Please")

if __name__ == "__main__":
    main()

딱히 어려운 것은 없었던 것 같다. 중요한 점은 이전에 만든 함수들을 main 함수에 넣어서 작성했다. is_positive_number가 True이면 factorial 값을 나오게 하고 그게 아니라면 끝이나던지 다시한번더 기회를 주는 식으로 만들었다.

다음 시간에는 베이스볼 게임을 만들어 보려 한다. 잘 될진 모르겠지만 화이팅 하자. 아자

Continue reading

Pagination


© 2018. by statssy

Powered by statssy