재형이의 성장통 일지
  • 파일 입출력, 함수, 클래스, 예외 처리
    2024년 02월 09일 07시 15분 27초에 업로드 된 글입니다.
    작성자: 재형이
    반응형
     
     
    • 오늘은 설날 공휴일이라 느긋하게 일어나서 작성 중이다
    • 이런 꿀 같은 공휴일을 잘 활용해야 내가 계획하고 있는 것들을 잘 마무리할 수 있을 것이다
    • 아무나 하지 못하는 걸 해야 특별한 삶을 살 수 있다고 믿는다
    • 누구보다 열심히 하자

     

     

     

     

     


     

     

     

     

     

     

    1. 파이썬(Python) 파일 입출력

    • 파일 객체를 만들 때는 open(), 파일 객체를 닫을 때는 close() 함수를 사용한다
    • 파이썬에서는 여러 가지 파일 모드(mode)를 제공한다
      • r: 읽기(read) 모드(파일 읽기)
      • w: 쓰기(write) 모드(파일에 내용을 쓰기)
      • a: 추가(append) 모드(파일의 마지막에 새로운 내용 추가)

    1-1. 파일 출력

    • 파일에 데이터를 쓸 때는 write() 함수를 사용할 수 있다
    • 줄바꿈 기호(\n)을 사용하여, 줄을 변경할 수 있다
    • 여러 줄에 걸쳐서 파일에 데이터를 작성할 수 있다
    f = open("result.txt", "w", encoding='utf8')
    for line in range(1, 6):
        data = f"{line}번째 줄\n"
        f.write(data)
    f.close()

    1-2. 파일 읽기

    • readline() 함수를 이용하면 파일의 데이터를 한 줄씩 읽을 수 있다
    • 각 줄을 출력할 때 기본적으로 마지막 줄에 줄바꿈 기호(\n)도 함께 포함된다
    • strip() 함수를 사용하지 않으면, 두 줄씩 줄바꿈이 수행된다
    f = open("data.txt", "r")
    while True:
        line = f.readline()
        if not line: # 더 읽을 문장이 없다면
            break
        else:
            print(line.strip())
    f.close()

    • 파일의 모든 줄을 한꺼번에 읽을 때는 readlines() 함수를 사용할 수 있다
    • readlines() 함수는 기본적으로 각 줄을 그대로 읽기 때문에 줄바꿈 기호(\n)가 포함된다
    • 줄바꿈 기호를 제거하기 위해 strip()을 사용할 수 있다
    • strip() 함수를 사용하지 않으면, 두 줄씩 줄바꿈이 수행된다
    f = open("result.txt", "r", encoding='utf8')
    lines = f.readlines()
    for i in range(len(lines)):
        line = lines[i].strip()
        print(f"{i}번째 줄의 내용: {line}")
    f.close()

    • read() 함수를 사용하면 파일의 전체 내용을 하나의 문자열로 반환한다
    f = open("result.txt", "r", encoding='utf8')
    data = f.read()
    print(data)
    f.close()

    1-3. 파일 객체 자동으로 열고 닫기

    • 다음의 문법을 활용하여 파일 객체를 자동으로 열고 닫을 수 있다
    • open() 함수와 close() 함수의 기능이 함께 사용된다

    1-3-1. a 모드 사용

    file_name = "result.txt"
    with open(file_name, "a", encoding='utf8') as f:
        f.write("Hello World")

     

    1-3-2. w 모드 사용

    file_name = "result.txt"
    with open(file_name, "w", encoding='utf8') as f:
        f.write("Hello World")

    2. 파이썬(Python) 함수

    • 함수는 def 구문을 이용하여 작성할 수 있다
    • 그리고 tab(들여쓰기, 스페이스 4칸)를 사용해 구분할 수 있다

    2-1. 리스트 내 원소 중에서 가장 큰 값의 인덱스(위치)를 찾아서 반환하는 함수를 작성해 보자

    def find_max_index(arr):
        max_index = 0
        for i in range(len(arr)):
            if arr[max_index] < arr[i]: # 더 큰 값을 찾은 경우
                max_index = i
        return max_index
    
    data = [7, 1, 5, 9, 3, 2, 4]
    max_index = find_max_index(data)
    print(max_index)
    # 3

     

    2-2. 특정한 값을 가지는 원소의 인덱스를 찾는 함수를 작성해 보자

    def find_certain_value(arr, value):
        for i, x in enumerate(arr):
            if x == value:
                return i
        return -1 # 찾지 못한 경우 -1을 반환
    
    print(find_certain_value([3, 5, 7, 9], 2))
    print(find_certain_value([3, 5, 7, 9], 7))
    # -1
    # 2

     

    2-3. 하나의 자연수가 주어졌을 때, 소수인지 아닌지 판별하는 함수를 작성해 보자

    def is_prime_number(x):
        # 1이하인 경우 소수가 아님
        if x <= 1:
            return False
        # 1과 자기 자신 외의 자연수로 나누어 떨어지는 경우 소수가 아님
        for divisor in range(2, x):
            if x % divisor == 0:
                return False
        return True
    
    print(is_prime_number(1))
    print(is_prime_number(2))
    print(is_prime_number(5))
    print(is_prime_number(7))
    print(is_prime_number(9))
    print(is_prime_number(12))
    print(is_prime_number(17))
    # False
    # True
    # True
    # True
    # False
    # False
    # True

    3. 파이썬(Python) 클래스

    • 객체 지향 프로그래밍(OOP, Object-Oriented Programming)이란 프로그래밍을 컴퓨터의 시각이 아닌 인간의 시각으로 이해할 수 있도록 작성하는 것을 말합니다. 여기서 객체(object)란 간단히 이야기하자면 실생활에서 우리가 인식할 수 있는 사물로 설명할 수 있습니다. 이러한 객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍입니다.
    • 이때 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 합니다
    • 그리고 선언된 클래스로부터 생성된 객체를 인스턴스(instance)라고 합니다
    • 상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미합니다
      이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다
    # 사람이라는 부모 클래스
    class Human:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def show_human(self):
            print("===== 인적 사항 =====")
            print(f"이름: {self.name}")
            print(f"나이: {self.age}")
    
    # 선생이라는 자식 클래스
    class Teacher(Human):
        def __init__(self, name, age, teacher_id, subject, salary):
            super().__init__(name, age)
            self.teacher_id = teacher_id
            self.subject = subject
            self.salary = salary
    
        def show_teacher(self):
            print("===== 교직원 카드 =====")
            print(f"교직원 번호: {self.teacher_id}")
            print(f"담당 과목: {self.subject}")
            print(f"월급: {self.salary}")
    
    # 학생이라는 자식 클래스
    class Student(Human):
        def __init__(self, name, age, student_id, grade, score):
            super().__init__(name, age)
            self.student_id = student_id
            self.grade = grade
            self.score = score
    
        def show_student(self):
            print("===== 학생 카드 =====")
            print(f"학생 번호: {self.student_id}")
            print(f"학년: {self.grade}")
            print(f"점수: {self.score}")
    
    # 테스트
    teacher = Teacher("김순자", 40, 1, "사회", 450)
    teacher.show_human()
    teacher.show_teacher()
    
    student = Student("홍길동", 18, 1, 2, 95)
    student.show_human()
    student.show_student()
    
    ===== 인적 사항 =====
    이름: 김순자
    나이: 40
    ===== 교직원 카드 =====
    교직원 번호: 1
    담당 과목: 사회
    월급: 450
    ===== 인적 사항 =====
    이름: 홍길동
    나이: 18
    ===== 학생 카드 =====
    학생 번호: 1
    학년: 2
    점수: 95

    3-1. 클래스 정렬

    • 특정한 기준에 따라서 다수의 인스턴스를 정렬하고 싶을 때가 있다
    • key 속성의 값으로 익명 함수를 넣거나, lt 함수를 이용하여 정렬 기능을 구현할 수 있다

    class Client:
        def __init__(self, id, name, age, gender, point):
            self.id = id
            self.name = name
            self.age = age
            self.gender = gender
            self.point = point
    
        def show(self):
            print("===== 고객 정보 =====")
            print(f"고객 번호: {self.id}")
            print(f"이름: {self.name}")
            print(f"나이: {self.age}")
            print(f"성별: {self.gender}")
            print(f"고객 점수: {self.point}")
    
        def __lt__(self, other):
             return self.point < other.point
    
    client1 = Client(1, "홍길동", 20, "남성", 1200)
    client2 = Client(2, "김순자", 21, "여성", 300)
    client3 = Client(3, "임꺽정", 23, "남성", 700)

     

    3-1-1. 람다함수(익명함수) 사용

    client_list = [client1, client2, client3]
    
    result = sorted(client_list, key=lambda x: x.point, reverse=True)
    for client in result:
        client.show()
        
    ===== 고객 정보 =====
    고객 번호: 1
    이름: 홍길동
    나이: 20
    성별: 남성
    고객 점수: 1200
    ===== 고객 정보 =====
    고객 번호: 3
    이름: 임꺽정
    나이: 23
    성별: 남성
    고객 점수: 700
    ===== 고객 정보 =====
    고객 번호: 2
    이름: 김순자
    나이: 21
    성별: 여성
    고객 점수: 300

     

    3-1-2. lt 함수 사용 (less than)

    # 클래스 선언 시
    #    def __lt__(self, other):
    #         return self.point < other.point
    
    client_list = [client1, client2, client3]
    
    result = sorted(client_list, reverse=True)
    for client in result:
        client.show()
        
    ===== 고객 정보 =====
    고객 번호: 1
    이름: 홍길동
    나이: 20
    성별: 남성
    고객 점수: 1200
    ===== 고객 정보 =====
    고객 번호: 3
    이름: 임꺽정
    나이: 23
    성별: 남성
    고객 점수: 700
    ===== 고객 정보 =====
    고객 번호: 2
    이름: 김순자
    나이: 21
    성별: 여성
    고객 점수: 300

     

    • 실제로 딥러닝 분야에서 TensorFlow와 PyTorch 프레임워크를 사용할 때는 다양한 클래스를 상속 받아 사용할 수 있다
    • 따라서, 다양한 딥러닝 모델을 정의하고 학습을 진행하기 위해 클래스(class)에 대한 개념 숙지가 필수적이다
    • 다양한 기능이 라이브러리 형태(클래스 형태)로 제공되기 때문에, 상속을 받아 사용하는 것이 일반적이다

    4. 파이썬(Python) 예외 처리

    • 예외(exception)란, 코드 실행 도중에 발생하는 오류(error)로 이해할 수 있다
    • 기본적으로 예외가 발생하면, 프로그램 실행이 중단된다
    • 예외 처리란, 프로그램의 예외를 처리하는 것을 말한다
    • 예외가 발생하더라도, 프로그램이 종료되지 않도록 처리할 수 있다
    • 예외 처리의 기본적인 형태는 다음과 같다
    try:
        기본적으로 실행할 코드
    except 예외명:
        예외가 발생했을 때 실행할 코드

    4-1. 각 에러코드에 따른 예외 처리하기

    data_list = [1, 2, 3, 4, 5]
    index = 5;
    x = 0;
    # index = 5 일 때는 list index out of range 에러 발생
    # x = 0 일 때는 division by zero 에러 발생
    
    try:
        data = data_list[index]
        result = data / x
        print(result)
    except IndexError as e:
        print("배열의 크기를 벗어난 인덱스에 접근할 수 없습니다.")
        print("[오류 메시지]")
        print(e)
    except ZeroDivisionError as e:
        print("0으로 나눌 수 없습니다.")
        print("[오류 메시지]")
        print(e)
    • 딥러닝 프로그램을 작성할 때 다양한 예외가 발생할 수 있다
    • 특히 입력과 출력의 차원(dimension)이 일치하지 않아서 딥러닝 모델 연산 수행 과정에서 오류가 발생할 수 있다
    • 존재하지 않거나, 잘못된 데이터를 불러오려고 할 때 오류가 발생할 수 있다

     

     

     

     


     

     

     

    반응형
    댓글