ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python
    PYTHON 2022. 3. 1. 20:48
    '''
    * 사용자 정의 모듈

    - 하나의 모듈 파일에 너무 많은 코드가 들어있다면
    편집이 힘들어지고, 코드를 유지, 보수하는 데 어려움이 발생합니다.

    - 관리 편의상 비슷한 기능들을 가진 코드를 여러 개의 모듈에
    나누어서 작성하는 것이 좋습니다.
    '''

    import calculator as cal

    print(f'1인치: {cal.inch}cm')
    print('1~10까지의 누적합: ', cal.calc_sum(10))

    n1, n2 = map(int, input('정수 2개 입력: ').split())
    print(f'{n1} + {n2} = {cal.add(n1, n2)}')
     
    '''
    * 표준 모듈 time

    - time모듈은 시간 관련 기능들을 제공합니다.

    - 대표적인 함수는 time()인데, 이 함수는 현재 시간을
    1970년 1월 1일 자정을 기준으로 현재까지 경과한
    시간을 초단위로 표현한 유닉스 시간을 반환합니다.
    '''

    import time
    print(time.time())

    # time 함수를 이용한 프로그램 속도 측정 테스트
    start = time.time()

    sum = 0
    for n in range(500000):
        sum += n

    end = time.time()

    print(f'프로젝트 실행 속도: {end - start:0.4f}초')

    '''
    time 모듈의 sleep() 함수는 cpu를 지정한 시간만큼 잠재워
    아무것도 하지 않고 시간을 끌게 합니다.
    '''

    print("재밌는 문제~!")
    time.sleep(3)
    print("뭘까요 ㅇㅅㅇ?")
    time.sleep(13)
     
     
    '''
    * 표준 모듈 random

    - 프로그램이 무작위 동작을 하게 하려면 난수값(랜덤값)이 필요합니다.

    - 랜덤값을 난수라고 부르며, 난수를 쉽게 발생시킬수 있는
    함수를 제공하는 모듈이 random 모듈입니다.

    - random 모듈의 random() 함수는 0.0이상 1.0미만의
    실수 난수값을 발생시킵니다.
    '''
    import random as r
    rn = r.random()
    print('랜덤값', rn)

    '''
    - 정수 난수는 randint() 함수를 사용합니다.
    - randint()는 인수로 시작 범위와 끝 범위를 지정하는데
    끝 범위도 난수값에 포함되는 특징이 있습니다. (미만이 아닙니다.)
    '''

    pets = ['멍멍이', '야옹이', '짹짹이', '호랑이', '코끼리']
    idx = r.randint(0, 4)
    print('애완동물: ', pets[idx])

    # choice() 함수는 리스트 내부의 임의의 요소를 랜덤으로 선택하여 리턴합니다.
    print('애완동물: ', r.choice(pets))

    # shuffle() 함수는 리스트의 요소를 무작위로 섞습니다
    print(pets)
    r.shuffle(pets)
    print(pets)

    # sample() 함수는 리스트의 항목 중 n개를 무작위로 추출하여 새로운 리스트로 만들어서 리턴합니다.
    # 중복값은 자동으로 배제시키며, 원본 리스트는 변하지 않습니다.
    print('-' * 30)
    s_list = r.sample(pets,2)
    print(s_list)
    print(pets)

    # sample 함수를 활용한 로또번호 6개 뽑기 (중복 제거)
    lotto_nums = list(range(1, 46))
    lotto = r.sample(lotto_nums, 6)
    lotto.sort()
    print(lotto)

     


    '''
    * 예외 처리

    - 프로그램은 실행 중에 사용자와 끊임없는 상호 작용을 합니다.
    (입력 | 출력, 선언 | 호출, 요청 | 응답.....)

    - 프로그램의 사용자는 예측 불가의 행동을 할 수도 있으며
    잘못된 사용으로 인해 에러를 유발할 수도 있습니다.

    - 에러의 종류에는 심각한 에러(Serious Error)와
    덜 심각한 에러 (Mild Error)가 있습니다.

    - 심각한 에러는 개발자가 해결할 수 없는 에러(천재지변, 시스템 상 문제)
    등을 말합니다.
    Mild Error는 문법 오류나 오타 등 해결이 가능한 에러들을 말하며
    이를 예외(Exception)라고 칭합니다.

    - 아무리 프로그램을 정교하게 구성해도, 예외 발생 시 프로그램의
    비정상 종료를 막을 수가 없기 때문에 예외 처리 문법을 통해
    프로그램의 비정상 종료를 막아야 합니다.

    - 예외처리 키워드는 try와 except를 사용합니다.

    - try에는 예외 발생 가능성이 있는 코드를 작성합니다.
    except에는 try에서 예외가 발생했을 때 실행할 코드를 작성합니다.

    - try 내부에서 예외가 발생했다면 즉시 try의 실행을 중지하고
    except의 코드가 실행되면서 프로그램의 비정상 종료를 방지합니다.
    '''

    try:
        n1 = int(input('정수1: '))
        n2 = int(input('정수2: '))

        print(f'입력한 정수: {n1}, {n2}')

        result = n1 / n2
        print(f'{n1} / {n2} = {result}')

    except:
        print('0을 입력하지 마세요!')

    print('프로그램 정상 종료합니다.')
     


    '''
    * 다중 예외 처리

    - 하나의 try 블록에서 여러 상황의 예외를 예외별로 다르게
    처리하고 싶다면 다중 예외처리를 사용합니다.

    - 다중 예외처리를 할 때는 except 뒤에 발생하는 예외의
    이름을 적어줍니다.

    # 자주 발생하는 예외의 이름
    1. NameError: 정의되지 않은 변수나 함수, 클래스를
    사용할 때 발생합니다.

    2. ValueError: 주로 형 변환시 발생하며, 내부 값의 형태가
    잘못되었을 때 발생합니다.

    3. ZeroDivisionError: 숫자를 0으로 나누었을 때 발생합니다.

    4. IndexError, KeyError: 존재하지 않는 인덱스나 키를 사용하여
    시퀀스, 딕셔너리를 조회했을 때 발생합니다.

    5. TypeError: 연산 수행 시 피연산자의 데이터 타입이 올바르지
    않을 경우 발생합니다.
    '''
    # NameError
    # print(apple)
    # insert(10)

    # ValueError
    # int('3.14')

    # Index, KeyError
    s = 'hello'
    # print(s[6])
    d = {}
    # print(d['멍멍이']) (x)

    # TypeError
    # print(10 ** '메롱')

    s = input('정수')

    try:
        point = int(s) #ValueError 가능성
        print(150 / point) #ZeroDivisionError 가능성
        print(s[point]) # indexError 가능성


    except ValueError:
        print('정수로만 입력하세요.')
    except ZeroDivisionError:
        print('0으로 나눌 수 없습니다.')
    except IndexError:
        print('인덱스 범위를 벗어났어요')

    '''
    finally 키워드는 예외 발생 여부와 상관없이
     항상 실행해야 하는 코드가 있을 경우 사용하는 예외 처리 방식입니다.
    '''
    pets = ['거북이', '강아지', '고양이']

    for n in range(4):
        try:
            print(pets[n], '키우고 싶다~')
        except:
            print('애완동물의 정보가 없습니다.')
        finally:
            print('아무튼 출력되는 문장입니다.')
            print('-' * 30)



    '''
    * 예외 일부러 발생시키기

    - 프로그래밍을 진행하다 보면 일부러 예외를 발생시켜서
    코드의 흐름을 전환해야 하는 경우가 발생합니다.

    - 파이썬은 raise라는 명령을 사용해서 오류를 강제로 발생시킬
    수 있습니다.
    '''
    def calc_sum(end):
        if end <= 0:
            raise ValueError

        total = 0
        for n in range(end + 1):
            total += n
        return total


    try:
        result = calc_sum(100)
        print(result)

        result2 = calc_sum(-120)
        print(result2)
    except:
        print('매개값은 양수로 주세요!')
     

    '''
    * 파일 입/출력

    - 프로그램이 생성한 정보를 좀 더 오래 저장할 때는
    파일에 기억해야 합니다.

    - 메모리는 속도는 빠르지만 전원이 끊어지면 정보를 잃어버릴 수
    있기 때문에, 하드디스크에 저장해야 데이터를 오래 보관할 수
    있습니다.

    - 파일은 정보를 저장하는 기본 단위이며
    문서, 이미지, 멀티미디어 자료도 모두 파일 형태로 보관할 수
    있습니다.

    - 파이썬에서는 파일 입/출력을 할 때
    open()이라는 함수를 사용합니다.
    ex) open('파일 경로', 모드)

    - 파일 경로는 입/출력 대상의 파일 경로입니다.
    디렉터리 경로를 포함시킵니다.

    - 모드는 읽기, 쓰기, 추가 등 무엇을 할 지
    결정하는 인수입니다.

    - 모드의 종류
    1. r: 파일을 읽어들입니다. 읽어들일 파일이 없으면
    예외가 발생합니다.

    2. w: 파일에 데이터를 저장합니다.
    파일이 이미 존재한다면 덮어씁니다.

    3. a: 파일에 데이터를 추가합니다. (이미 존재하는 파일에)
    파일이 존재하지 않는다면 새롭게 생성도 해 줍니다.
    '''

    try:
        # 파일 저장 기능 (write, append)
        file_path = 'C:/test/test.txt'

        # 파일 입출력을 실행하는 내장 함수 open()
        # 반환값으로 파일 입출력을 담당하는 객체를 리턴합니다.
        # 첫번째 인수로 파일 경로를, 두번째 인수로는 모드를 설정합니다.

        f = open(file_path, 'a')
        text = '\n n 모드는 새 파일을 생성하여 원하는 텍스트 문서를 작성할 때 사용합니다. 덮어씁니다.. a 모드는 이어서 작성..'

        # 파일을 저장할 때는 f.write() 메서드를 사용합니다.
        # 저장할 데이터를 인수로 전달합니다.

        f.write(text)
        print('파일 저장 완료합니다.')

    except:
        print('파일 저장에 실패했습니다.')

    finally:
        # 파일 입출력은 하드디스크 자원을 사용하는 코드이므로
        # 반드시 사용 후 그 자원을 해체하여 메모리 누수를 방지합니다.
        f.close()


    '''
    * 사용자의 입력을 파일(xxx.txt)에 저장하는 프로그램을 작성하세요.
    (단, 프로그램을 다시 실행하더라도 파일명이 동일하다면
    기존 작성한 내용을 그대로 유지하고
    새로 입력된 내용이 추가되어야 합니다.
    파일명도 마지막에 입력받아서 생성하세요.)
    '''
    print('저장할 내용을 입력(\'그만\'이라고 입력 시 종료됩니다.)')
    user_input = ''
    while True:
        temp = input('> ')
        if temp == '그만':
            break
        user_input += temp + '\n'

    f_name = input('파일명을 입력: ')
    f_path = f'C:/test/{f_name}.txt'

    try:
        f = open(f_path, 'a')
        f.write(user_input)
        print('파일 저장에 성공했습니다.')

    except:
        print('파일 저장에 실패하였습니다.')

    finally:
        f.close()
     

    '''
    * 파일 읽기 기능 (read)

    - 파일로부터 데이터를 읽어들일 때는 분량에 따라
    적당한 메서드를 선택해서 사용합니다.

    1. read(): 파일 전체를 통째로 읽어서 리턴
    2. readline(): 파일 데이터를 한 줄씩 읽어서 리턴
    3. readlines(): 파일 전체를 읽어서 한 줄씩 분리한 후에
    리스트에 담아서 리턴.
    '''
    file_path = 'C:/test/hint.txt'

    '''
    try:
        f = open(file_path, 'r')
        text = f.read()
        print(text)
    except:
        print('파일 로드 실패!')
    finally:
        f.close()
    '''

    # readline() 메서드는 자동으로 \n을 기준으로 하여
    # 데이터를 줄 단위로 읽어들이기 때문에 메모리 부담을 좀 더
    # 줄일 수 있습니다.

    '''
    try:
        f = open(file_path, 'r')
        while True:
            text = f.readline()
            if '파일' in text:
                print(text)
            if len(text) == 0:
                break

    except:
        print('파일 로드 실패!')
    finally:
        f.close()
    '''

    # readlines()는 파일 데이터를 한 줄씩 읽어서
    # 리스트에 담아서 리턴하기 때문에 읽은 데이터를
    # 리스트 문법을 사용해서 처리할 수 있습니다.
    try:
        f = open(file_path, 'r')

        text = f.readlines()
        # print(text)
        text.reverse()
        for t in text:
            print(t)

    except:
        print('파일 로드 실패!')
    finally:
        f.close()


    '''
    * points.txt 파일의 숫자값을 모두 읽어서
    총합과 평균을 구한 뒤
    총점, 평균값을 result.txt라는 파일에
    쓰는 프로그램을 작성해 보세요.
    '''
    import traceback as trace

    try:
        f = open('C:/test/points/txt', 'r')
        numlist = f.read().split()
    except:
        print('파일 로드에 실패했습니다.')
        print(trace.format_exc()) # java의 e.printStackTrace()
    finally:
        f.close()
       
    sum = 0
    for num in numlist:
        score = int(num)
        sum += score

    avg = sum / len(numlist)

    try:
        f = open('C:/test/result.txt', 'w')
        data = f'총점: {sum}점, 평균: {avg:0.2f}점'
        f.write(data)
        print('파일 저장이 완료되었습니다.')
    except:
        print('파일 저장에 실패했습니다.')
        print(trace.format_exc())
    finally:
        f.close()

       
     
    def add (n1, n2):
        return n1 + n2

    def sub (n1, n2):
        return n1 - n2

    def calc_sum(end):
        sum = 0
        for n in range(end + 1):
            sum += n
        return sum

    def info():
        print('모듈 임포트 연습합니다.')

    inch = 2.54
    yard = 0.91
    lb = 0.45

    '''
    - 배포의 목적으로 만든 모듈이라면
    테스트 코드를 작성해서 다른 사용자들에게
    모듈 사용법을 간단히 공개해 주면 좋겠죠?

    처음부터 import를 목적으로 설계된 모듈의 테스트 코드 작성 시에는
    다음과 같은 문법 하에서 테스트를 실행합니다.

    ex) if __name__ == '__main__':
            test code...

    - __name__ 이라는 숨겨진 변수 (내장 변수)에는
    현재 실행중인 모듈의 이름이 저장되게 되는데,
    현재 모듈에서 실행할 때는 이름이 main으로 저장됩니다.
    다른 모듈에서 실행할 때는 이름이 모듈 이름으로 저장됩니다.
    '''
    if __name__ == '__main__':
        print('__name__의 값:', __name__)

    #test code
    print('1~100까지의 누적합: ', calc_sum(100))
    info()
    print(sub(100, 15))
    print('테스트 코드입니다.')




    '''
    * 예외 일부러 발생시키기

    - 프로그래밍을 진행하다 보면 일부러 예외를 발생시켜서
    코드의 흐름을 전환해야 하는 경우가 발생합니다.

    - 파이썬은 raise라는 명령을 사용해서 오류를 강제로 발생시킬
    수 있습니다.
    '''
    def calc_sum(end):
        if end <= 0:
            raise ValueError

        total = 0
        for n in range(end + 1):
            total += n
        return total


    try:
        result = calc_sum(100)
        print(result)

        result2 = calc_sum(-120)
        print(result2)
    except:
        print('매개값은 양수로 주세요!')




    'PYTHON' 카테고리의 다른 글

    project html/css  (0) 2022.03.11
    python  (0) 2022.03.04
    python  (0) 2022.02.25
    python  (0) 2022.02.25
    python  (0) 2022.02.23
Designed by Tistory.