GUI(Graphic User Interface) - tkinter


  • Tcl/Tk 툴킷을 사용하는데 필요한 인터페이스 모듈 (Std library)
import tkinter as tk

root = tk.Tk() # 실행했을 때 나타나는 창 root
label = tk.Label(root, text='Hello World') # root 창에 포함되는 컴포넌트로 label 생성
label.pack() # label 객체를 창에 표시

root.mainloop() # root 창을 event loop에 들어가게 하여 root 창이 종료되지 않고 일을 계속 수행
  • 블로그 프로그램을 만든다고 할 때 사용되는 tkinter component

    • ListBox : 블로그의 목록

    • Label : '제목'이라는 라벨 표시

    • Entry : 제목을 보여주고 입력

    • Text : 내용을 보여주고 입력

    • Button : 블로그 생성, 수정, 삭제

  • ListBox : 블로그의 목록처럼 정해진 순서가 있는 여러개의 데이터를 표시하는 컴포넌트

    from tkinter as tk
    
    root = tk.Tk()
    listbox = tk.Listbox(root)
    listbox.pack()
    
    for i in ['one', 'two', 'three', 'four']:
        listbox.insert(END, i) # 리스트 박스의 마지막 위치에 새로운 데이터 insert
    
    def event_for_listbox(event):
        print("Hello Event")
    
    listbox.bind('<<ListboxSelect>>', event_for_listbox) 
    # click eventbox --> event happen
    
    root.mainloop()
    • ListBox 메서드

      • insert(index, "항목")

        • index 위치에 항목 추가
      • delete(start_index, end_index)

        • start_index 부터 end_index 까지의 항목 삭제
      • size()

        • 항목 개수 반환
      • activate(index)

        • index 위치에 항목 선택
      • curselection()

        • 선택된 항목을 튜플로 반환
      • index(index)

        • index 에 대응하는 위치 획득
      • see(index)

        • index 가 보이도록 리스트 박스의 위치 조정
  • Entry

    • 텍스트를 입력하거나 보여주고자 사용하는 컴포넌트

    • 주로 한 줄로 구성된 문자열을 처리할 때 사용

    • 여러 줄의 문자열을 처리하려면 Text 컴포넌트를 사용한다.

    from tkinter import *
    
    root = Tk()
    entry = Entry(root)
    entry.pack()
    
    entry.insert(0, "Hello python")
    
    root.mainloop()
    • Entry Method

      • insert(index, "문자열")

        • index 위치에 문자열 추가
      • delete(start_index, end_index)

        • start_index부터 end_index까지의 문자열 삭제
      • get()

        • 기입창의 텍스트를 문자열로 반환
      • index(index)

        • index 에 대응하는 위치 획득
      • icursor(index)

        • ndex 앞에 키보드 커서 설정
      • select_adjust(index)

        • index 위치까지의 문자열을 블록처리
      • select_range(start_index, end_index)

        • start_index 부터 end_index 까지 블록처리
  • Text

    • 텍스트를 입력하거나 보여주고자 사용하는 컴포넌트

    • 여러줄을 처리할 때 사용

    from tkinter import *
    
    root = Tk()
    text = Text(root)
    text.pack()
    
    data = '''Life is too short
    You need python'''
    
    text.insert(1.0, data)
    
    root.mainloop()
    • insert 메서드의 첫 번째 매개변수를 보면 1.0이다

    • 소수점 기준 왼쪽은 행, 오른쪽은 열을 뜻한다.

    • 첫번째 행은 1부터 시작한다. (0부터 시작 X)

    • 텍스트에 입력한 내용을 삭제하려만 아래와 같이 하면 됨

      text.delete(1.0, END)
  • Button

    • 버튼을 클릭했을 때 특정 함수를 실행하고자 사용하는 컴포넌트

      from tkinter import *
      
      root = Tk()
      b1 = Button(root, text='테스트')
      b1.pack()
      
      def btn_click(event):
          print("버튼이 클릭되었습니다")
      
      b1.bind('<Button-1>', btn_click)
      
      root.mainloop()
    • 버튼을 클릭했을 때 btn_click() 함수가 실행되도록 이벤트 연결

      button_send = tk.Button(root, text='Send your message', command=handle_button_send)
    • command에 함수명을 입력해 event를 발생시킬 수 있다.

참조) https://wikidocs.net (파이썬 계단밟기)

정규 표현식


정규 표현식이란?


  • 정규 표현식 : 복잡한 문자열을 처리할 때 사용하는 기법

  • 파이썬 말고도 다른 곳에서도 사용함

정규 표현식이 필요한 이유?

  • example : 주민번호 뒷자리 7자리를 *로 변환하기
data = """
park 800905-1049118
kim 700905-1059919
"""

result = []
for line in data.split('\n'):
    word_result = []
    for word in line.split(" "):
        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
            word = word[:6] + "-" + "*******"
        word_result.append(word)
    result.append(" ".join(word_result))
print("\n".join(result))
  • 위 코드를 정규 표현식을 이용해 간략하게 표현할 수 있다.
import re

pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))

정규 표현식의 메타 문자


  • .^$*+?{}[]|()

  • 문자 클래스 []

    • 문자클래스로 만들어진 정규식은 '[] 사이의 문자들과 매치'라는 의미를 갖는다.

    • 정규표현식이 [abc]라면 이 표현식은 a, b, c 중 한 개의 문자와 매치를 뜻한다

    • ex) 정규식이 [abc]라고 할 때

      • "a"는 정규식과 일치하는 문자 a가 있으므로 매치

      • "before"는 정규식과 일치하는 문자 b가 있으므로 매치

      • "dude"는 정규식과 일치하는 문자가 아무것도 없으므로 매치되지 않음

    • 하이픈(-)를 사용하면 범위(From ~ To)를 의미

      • [a-c]는 [abc]와 동일

      • [0-5]는 [012345]와 동일

      • [a-zA-Z] : 알파벳 모두

      • [0-9] : 숫자

    • ^은 not(반대)를 의미

      • [^0-9] : 숫자가 아닌 문자에 매칭
    • 별도의 표기법이 있는 표현식

      • \d : [0-9]

      • \D : [^0-9]

      • \s : whiltespace(space와 tab과 같은 공백을 표현하는 문자)와 매치, [\t\n\r\f\v]와 동일

      • \S : \s의 반대

      • \w : 문자 + 숫자, 언더바_와 매치, [a-zA-Z0-9_]와 동일

      • \W : 공백문자나 특수문자에 매치(\w의 반대)

  • Dot(.)

    • 줄바꿈 문자 \n을 제외한 모든 문자와 매치됨을 의미

    • example) a.b

      • "a + 모든문자 + b"와 같다

      • 즉 a와 b 사이에 어떤 문자가 들어가도 모두 매치된다를 의미

  • [.]

    • .문자가 있어야만 매치됨을 의미

    • example) a[.]b

      • a와 b 사이에 . 문자가 있어야 매치
  • 반복(*)

    • 반복을 의미하는 메타 문자

    • ex) ca*t

      • 문자 바로 앞에 있는 a가 0번 이상 반복되면 매치

      • ct : "a"가 0번 반복되어 매치

      • cat : "a"가 1번 반복되어 매치

      • caaat : "a"가 3번 반복되어 매치

  • 반복(+)

    • 반복을 나타내는 메타 문자

    • * 와 다르게 최소 1번이상 반복될 때 사용

    • ex) ca+t

      • 문자 바로 앞에 있는 a가 1번 이상 반복되면 매치

      • ct : "a"가 0번 반복되어 매치되지 않음

      • cat : "a"가 1번 반복되어 매치

      • caaat : "a"가 3번 반복되어 매치

  • 반복({m, n}, ?)

    • { } 메타 문자를 사용해 반복 횟수를 고정할 수 있다

    • {m, n} : 반복 횟수가 m부터 n까지 매치 할 수 있음

    • m 또는 n은 생략할 수 있음

      • {3, } : 반복 횟수가 3 이상

      • {, 3} : 반복 횟수가 3 이하

      • 생략된 m : 0과 동일

      • 생략된 n : 무한대를 의미

    • ex) ca{2}t

      • a가 2번 반복되면 매치

      • cat : "a"가 1번 반복되어 매치되지 않음

      • caat : "a"가 2번 반복되어 매치

    • ex) ca{2, 5}t

      • a가 2~5번 반복되면 매치

      • cat : "a"가 1번 반복되어 매치되지 않음

      • caat : "a"가 2번 반복되어 매치

      • caaaaat : "a"가 5번 반복되어 매치

    • 반복은 아니지만, {0, 1}을 의미하는 ? 메타문자도 있음

    • ex) ab?c

      • b가 0~1번 사용되면 매치

      • abc : "b"가 1번 사용되어 매치

      • ac : "b"가 0번 사용되어 매치

      • 즉, "b"가 있거나 없거나 둘다 매치 되는 경우

  • *, +, ? 메타 문자 모두 {m,n}으로 나타낼 수 있지만, 이해하기 쉽고 간결하게 메타 문자를 가능하면 사용하자

참조) Do it! 점프 투 파이썬 (박응용 지음), https://wikidocs.net (파이썬 계단밟기)

표준 라이브러리(standard library)(2)


fnmatch


  • Unix-sytle Pattern Matching

  • 유닉스 shell에서 사용되는 rule에 따라 특정 패턴과 일치하는 string을 찾음

  • fnmatch(text, pattern)

    • text가 pattern과 match하는지 Test (T/F)

    • 대소문자 구분하지 않음(case-insensitive)

  • fnmatchcase(text, pattern)

    • fnmatch와 유사하나, 대소문자를 구분함
  • filter(iterable, pattern)

    • 패턴을 만족하는 iterable에 있는 요소들의 list를 반환
  • example

    import fnmatch
    descs = ['My name is Lee and my E-mail is kim@google.com.', 
    'My name is Park and my e-mail address is Park@naver.com.']
    
    print([fnmatch.fnmatch(desc, 'e-mail') for desc in descs]) # [False, False]
    print([fnmatch.fnmatch(desc, '*e-mail*') for desc in descs]) # [True, True]
    print([fnmatch.fnmatchcase(desc, '*e-mail*') for desc in descs]) # [False, True]
    print([fnmatch.fnmatchcase(desc, '*[Ee]-mail*') for desc in descs]) # [True, True]
    
    print(fnmatch.filter(descs, '*e-mail*')) # ['My ... Lee', 'My ... Park']
    print(fnmatch.filter(descs, '*Pa?k*')) # ['My ... Park']
  • [Ee]는 E와 e 중 한 개의 문자와 매치함을 뜻하는데, 이 표현은 정규식 표현 중 한가지임


csv

  • CSV format(comma-separted values)에 표로 나타낸 데이터를 읽고 쓰는 class를 담고있다.

  • reader(file_obj, dialect='exce', **fmtparams)

    • file_obj의 행에 접근할 수 있는 reader object를 return
  • writer(file_obj, dialect='exce', **fmtparams)

    • user data를 file_obj에 컴마(,)로 구분된 문자열로 변환하여 쓰는 writer object 반환
  • example

    import glob, csv
    
    files = glob.glob('workspace/data_??.csv')
    all_data = []
    for file in files:
        with open(file, 'r') as f:
            csv_reader = csv.reader(f)
            data = []
            for line in csv_reader: # ex) line = ['11', '45']
                if line and not line[0].strip().startswith('#'):
                    data.append([int(val) for val in line])
            all_data = all_data + data

Python Standard Library, 그 이후


  • pre-built Python library를 설치해서 사용할 수 있음

  • pip install package_name

    (pip3 install package name) --> mac OS

    • ex) pip3 install opencv-python

    • pip3 install numpy

tqdm

  • 콘솔에 iteration의 진행상황을 시각화 해준다

  • example

from tqdm import tqdm
n = 1000000000
for i in tqdm(range(n)):
    pass

참조) Do it! 점프 투 파이썬 (박응용 지음), https://wikidocs.net (파이썬 계단밟기)

표준 라이브러리(Standard Library) (1)


  • 프로그래밍 언어의 기본 기능과 기능을 확장하는 데 사용할 수 있는 기본적인 모듈과 함수의 집합

  • Library : 원하는 정보(프로그램)를 찾아 사용하자

  • 프로그래머가 기본적인 작업을 수행하기 위해 처음부터 모든 것을 작성하지 않고, 이미 구현된 함수와 모듈을 사용하여 빠르고 효율적으로 프로그램을 작성할 수 있도록 도와준다.

sys 모듈


  • 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈

  • sys.argv

    • 명령행에서 인수 전달하기
    # Terminal, cmd, prompt에서
    python test.py abc pey guido
    --> 파일이름 뒤에 있는 값들이 sys.argv 리스트에 추가됨
  • sys.exit()

    • 강제로 스크립트 종료하기

    • ctrl z 나 ctrl d 와 같은 기능

  • sys.path

    • 자신이 만든 모듈 불러와 사용하기

    • sys.path는 파이썬 모듈들이 저장되어 있는 위치를 나타냄

    • 이 위치에 있는 모듈은 경로에 상관없이 어디에서나 불러올 수 있음.

    # path_append.py
    import sys
    sys.path.append("C:/doit/Mymod")
    --> 경로 이름을 추가해 해당 경로에 있는 모듈을 불러올 수 있음

pickle


  • 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈

  • 객체를 바이너리 형태로 표현하고 저장하거나, 데이터를 파이썬 객체로 복원하는 protocols을 제공

  • pickle 모듈의 dump 함수를 사용하여 객체 data를 그대로 저장(serializing)

    dump(obj, file_obj, ...) # Write the given Python object obj into file_obj
    import pickle
    f = open("test.txt", 'wb')
    data = {1: 'python', 2: 'You need'}
    pickle.dump(data, f)
    f.close()
  • pickle.dump로 저장한 파일을 load함수를 사용해 객체 data로 복원(de-serializing)

    load(file_obj, ...) # Read file_obj and return its Python object
    import pickle
    f = open("test.txt", 'rb')
    data = picle.load(f)
    print(data)
    res : {1: 'python', 2: 'You need'}
    import pickle
    with open('text.txt'. 'rb') as f:
        _, data = pickle.load(f)
        print(data)

OS


  • 환경 변수나 디렉토리, 파일 등의 OS 자원을 제어할 수 있게 해주는 모듈

  • os.environ

    • 내 시스템의 환경변수 값을 알고 싶을 때 사용
    >>> import os
    >>> os.environ
    environ({딕셔너리 객체}) # ('PROGRAMFILES': 'C:\\Program Files', ....) 이런식으로 나옴
    • 돌려받은 객체가 딕셔너리 객체이기 때문에, 호출해서 원하는 값을 얻을 수도 있음
    os.environ['PATH'] # res : 'C:\\ProgramData\\Oracle\\Java\\javapath; ... 생략 ...'
  • os.getcwd

    • 디렉토리 위치 돌려받기
    os.getcwd() # res : 'C:\WINDOWS'
  • os.system

    • 시스템 명령어 호출하기

    • 시스텀 자체의 프로그램이나 기타 명령어를 파이썬에서 호출할 수 있음

    # 현재 디렉토리에서 시스템 명령어 ls을 실행하는 예
    >>> os.system("ls")
  • os.popen

    • 실행한 시스템 명령어의 결괏값을 읽기 모드 형태의 파일 객체로 돌려줌
    f = os.popen("ls")
    print(f.read())
  • 기타 유용한 os 관련 함수

    • os.mkdir(디렉토리) : 디렉토리 생성

    • os.rmdir(디렉토리) : 디렉토리 삭제(비어있어야 가능)

    • os.unlink(파일 이름) : 파일을 지운다

    • os.rename(src, dst) : src라는 이름의 파일을 dst라는 이름으로 바꾼다.

shutil


  • shutil.copy : 파일을 복사해주는 파이썬 모듈
# src.txt 파일을 dst.txt로 복사
import shutil
shutil.copy("src.txt", "dst.txt")
  • dst가 디렉토리 이름이면 src.txt 그대로 dst 디렉토리에 복사됨

  • 동일한 이름이 있다면 덮어쓴다.

glob


  • Unix-style Pathname Pattern Expansion

  • 특정 디렉토리에 있는 파일 이름을 모두 알아야 할 때 주로 사용하는 모듈

  • glob는 Unix shell 에서 사용되는 특정 패턴과 일치하는 파일과 디렉토리를 찾아줌

    • glob(pathname)

      • 디렉토리에 있는 파일들을 리스트로 만들기

      • 디렉토리 지정하지 않으면 working directory에서 실행

        # C:/doit 디렉토리에 있는 파일 중 이름이 mark로 시작하는 파일들을 모두 찾아서 읽어들이는 예
        import glob
        glob.glob("C:/doit/mark*")
        glob.glob('*.py')

tempfile


  • 파일을 임시로 만들어서 사용할 때 유용한 모듈

  • tempfile.mkstemp()

    • 중복되지 않는 임시 파일의 이름을 무작위로 만들어서 돌려줌
    import tempfile
    filename = tempfile.mkstemp()
    filename # res : 'C:\WINDOWS\TEMP\~-275151-0'
  • tempfile.TemporaryFile()

    • 임시 저장 공간으로 사용할 파일 객체를 돌려줌

    • 기본적으로 wb모드를 가짐

    • f.close()가 호출되면 자동으로 사라짐

    import tempfile
    f = tempfile.TemporaryFile()
    f.close() # 생성한 임시파일 자동으로 삭제

time


  • 시간과 관련된 모듈
  • time.time()

    • UTC를 사용하여 현재 시간을 실수 형태로 돌려주는 함수
    • 1970/1/1 0시 00분 00초 epoch 시각부터 현재까지 흐른 시간을 second 로 리턴
    import time
    time.time() # res : 1692774508.134141
  • time.localtime / time.gmtime

    • time.time()이 돌려준 실수 값을 사용해서 연도, 월, 일, 시, 분, 초... 의 형태로 바꿔주는 함수
    • time.gmtime은 UTC 시간 기준으로 return
    time.localtime(time.time())
    # time.struct_time(tm_year=2023, tm_mon=11, ...)
    time.gmtime(time.time())
    # time.struct_time(tm_year=2023, tm_mon=11, ...)
  • time.asctime

    • time.localtime에 의해서 반환된 튜플 형태의 값을 인수로 받아 날짜와 시간을 알아보기 쉬운 형태로 돌려주는 함수
    time.asctime(time.localtime(time.time()))
    # res: 'Wed Aug 23 16:10:47 2023'
  • time.ctime

    • time.asctime(time.localtime(time.time()))를 time.ctime을 이용해서 간편하게 표시.

    • asctime과 다른점은 ctime은 항상 현재 시간만 돌려줌

    time.ctime() # res : 'Wed Aug 23 16:10:47 2023'
  • time.process_time / time.thread_time

    • 현재 프로세스 / 쓰레드 의 CPU 시간의 합을 return (sleep 시간 제외)
    time.process_time() # 4.59375
    time.thread_time() # 3.844024
  • time.strftime

    • 시간에 관계된 것을 세밀하게 표현하는 여러가지 포맷 코드 제공

    • time.strftime('출력할 형식 포맷코드', time.localtime(time.time()))

    import time
    time.strftime('%x', time.localtime(time.time()))
    # res : '08/23/23'
  • time.sleep

    • 루프 안에서 주로 사용

    • 일정한 시간 간격을 두고 루프를 실행할 수 있다.

    • 주어진 시간동안 current thread의 실행을 중단시킬 수 있다.

      # sleep1.py
      import time
      for i in range(10):
          print(i)
          time.sleep(1)
    start = time.time()
    time.sleep(2)
    elapse = time.time() - start # 2.001231235...

calendar


  • 파이썬에서 달력을 볼 수 있게 해주는 모듈

  • calendar.calendar(연도)

    • 그해의 전체 달력을 볼 수 있음
  • calendar.prcal(연도)

    • calendar.calendar(연도)와 같은 결괏값
  • calendar.prmonth(연도, 월)

    • 해당 연도의 해당 월에 해당하는 달력을 보여줌
  • calendar.weekday(연도, 월, 일)

    • 그 날짜에 해당하는 요일 정보를 돌려줌

    • 월요일은 0, 화요일은 1, .......

  • calendar.monthrange(연도, 월)

    • 입력받은 달의 1일이 무슨 요일인지, 그 달이 며칠까지 있는 지를 튜플 형태로 돌려줌
    import calendar
    calendar.monthrange(2023, 8) # (calendar.TUESDAY, 31)

random


  • 난수를 발생시키는 모듈

  • 다양한 확률분포에 따른 pseudo-random generators 제공

  • random.random()

    • 0.0에서 1.0 사이의 실수 중에서 난수 값을 돌려줌
  • random.randint(a, b)

    • a에서 b 사이의 정수 중에서 난수 값을 돌려줌(a, b 포함)
  • random.uniform(a, b)

    • a에서 b 사이의 실수 중에서 난수 값을 돌려줌(a, b 포함)
  • random.gauss(mu, sigma), random.normalvariate(mu, sigma)

    • 평균이 mu, 표준편차가 sigma인 Gaussian distribution을 따르는 분포 하에 난수(실수) 돌려줌
  • random.seed(a=None, version=2)

    • random number genarator을 초기화

    • a=None # current system time이 사용되고 있음

  • random.choice(iterable)

    • 입력받은 변수에서 무작위로 하나를 선택하여 돌려줌
  • random.shuffle(list)

    • 입력받은 리스트의 항목을 무작위로 섞어줌.
  • example

    # random_pop.py
    import random
    def random_pop(data):
        number = random.randint(0, len(data)- 1)
        return data.pop(number)
    import random
    round2 = lambda x : int(x + 0.5)
    print([round2(random.uniform(0, 10)) for  i in range(10)])
    print([round2(random.gauss(5, 1)) for i in range(10)])

webbrowser


  • 자신의 시스템에서 사용하는 기본 웹 브라우저를 자동으로 실행하는 모듈

  • webbrowser.open(url)

    • 기본 웹브라우저를 자동으로 실행하고 해당 url로 가게 해줌

    • 이미 웹브라우저가 실행된 상태라면 해당 url로 이동

    • 실행되지 않은 상태라면 브라우저 실행 후 해당 url로 이동

  • webbrowser.open_new(url)

    • 이미 웹 브라우저가 실행된 상태이더라도 새로운 창으로 해당 주소가 열림

threading


  • 컴퓨터에서 동작하고 있는 프로그램을 Process라고 함

  • 보통은 1개 프로세스는 한가지 일만 하지만, 스레드를 사용하여 하나의 프로세스 안에서 2가지 이상의 일을 동시에 수행할 수 있음

# origin.py
import time

def long_task():
    for i in range(5):
        time.sleep(1)
        print(f'working: {i}\n')

print("Start")

for i in range(5):
    long_task()

print("End")
  • 위 코드는 5초씩 5번 반복해 25초가 소요된다

  • 스레드를 사용하여 5초에 다 끝내보자

 # thread_test.py
import time
import threading

def long_task():
    for i in range(5):
        time.sleep(1)
        print(f'working: {i}\n')

print("Start")
threads = []
for i in range(5):
    t = threading.Thread(target = long_task) # Thread 생성
    threads.append(t)

for t in threads:
    t.start()

print("End")

math


  • C의 math.h나 cmath 와 유사하게 유용한 수학 함수, 상수들을 제공
  • Constant

    • pi : 원주율 3.1415....

    • e : 자연상수 2.718....

    • nan

  • sqrt(x)

    • x의 square root 값 return
  • log(x[, base]), log2(x), log10(x)

    • x의 natural 로그, base-2 로그, base-10 로그 값을 리턴
  • ceil(x)

    • x와 같거나 그 이상인 가장 작은 수를 return
  • prod(iterable, *, start = 1)

    • input iterable의 모든 요소들의 곱을 계산
  • sin(x), cos(x), tan(x).... atan(x), atan2(x,y)

    • 삼각함수
  • degrees(x), radians(x)

    • x 각도를 라디안으로 변환하거나, 그 반대
  • isinf(x), isnan(x), isfinite(x)

    • x가 infinity인지, NaN인지, finite 인지 혹은 아닌지 확인
import math
factorial_prod = lambda n : math.prod(range(1, n + 1))
print(factorial_prod(10)) # 3628800

decimal


  • 빠르고 정확하게 rounded 소수점 산술을 제공

  • Decimal : floating point value를 담고 있는 클래스

  • Decimal.quantize(exp, rounding=None, context=None)

    • exp 정확도를 가진 rounded value를 리턴
  • example

    # without decimal library
    print(round(3.5)) # 4
    print(round(4.5)) # 4 (not 5)
    • why? : systemic bias를 피하기 위해
    import decimal
    print(decimal.getcontext()) # rounding=decimal.ROUND_HALF_EVEN
    print(decimal.Decimal(3.5).quantize(1, deciaml.ROUND_HALF_UP)) # 4
    print(decimal.Decimal(4.5).quantize(1, deciaml.ROUND_HALF_UP)) # 5
    # handmade function
    round2 = lambda x : int (x + 0.5)
    print(round2(3.5)) # 4
    print(round2(4.5)) # 5

참조) Do it! 점프 투 파이썬 (박응용 지음)

내장 함수 (Built-in-function)


abs 함수

  • abs(x)

  • 어떤 숫자를 입력받았을 때 그 숫자의 절댓값을 돌려주는 함수

    abs(-3)
    res : 3

all 함수

  • all(x)

  • 반복 가능한(iterable) 자료형 x를 인수로 받아 x가 모두 참이면 True, 거짓이 하나라도 있으면 False 돌려줌

    all([1, 2, 3])
    res : True
    
    all([0, 1, 2])
    res : False

any 함수

  • any(x)

  • x 중 하나라도 참이 있으면 True, x가 모두 거짓일 때 False 돌려줌

    any([1, 2, 3, 0, 4])
    res : True
    
    any([0, ""])
    res : False

chr 함수

  • chr(i)

  • 아스키 코드값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수

    chr(97)
    res : 'a'
    chr(48)
    res : '0'

dir 함수

  • 객체가 자체적으로 가지고 있는 변수나 함수를 보여줌

    dir([1, 2, 3])
    res : ['append', 'count', 'extend', 'index', ...]
    
    dir({'1': 'a'})
    res : ['clear', 'copy', 'get', 'has_key']

divmod 함수

  • divmod(a, b)

  • 2개의 숫자를 입력받아 a를 b로 나눈 몫과 나머지를 튜플 형태로 돌려주는 함수

    divmod(7, 3)
    res : (2, 1)

enumerate 함수

  • enumerate : '열거하다'

  • 순서가 있는 자료형(리스트, 튜플, 문자열)을 입력받아 index 값을 포함하는 enumerate 객체로 리턴

    for i, name in enumerate(['body', 'foo', 'bar']):
        print(i, name)
    res:
    0 body
    1 foo
    2 bar

eval 함수

  • eval(expression)

  • 실행 가능한 문자열(ex. 1+2, 'hi' + 'a') 을 입력 받아 문자열을 실행한 결괏값을 돌려주는 함수

  • 입력받은 문자열로 파이썬 함수나 클래스를 동적으로 실행하고 싶을 때 사용

    eval('1 + 2') # res : 3
    eval("'hi' + 'a'") # res : 'hia'
    eval('divmod(4, 3)') # res : (1, 1)

filter 함수

  • 첫번째 인수로 함수이름, 두번째 인수로 함수에 차례로 들어갈 iterable 자료형을 받음

    • 아래 예시를 filter함수를 사용해서 간단히 나타낼 수 있다.
    # positive.py
    def positive(l):
        result = []
        for i in l:
            if (i > 0):
                result.append(i)
        return result
    
    print(positive[1, -3, 2, 0, -5, 6])
    결괏값 : [1, 2, 6]
    # filter1.py
    def positive(x):
        return x > 0
    
    print(list(filter(positive, [1, -3, 2, 0, -5, 6])))
    --> filter 함수는 positive 함수에서 반환 값이 참인 것만 묶어서 돌려줌
    • 람다식 사용

      list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6]))

hex 함수

  • hex(x)

  • 정수값을 입력받아 16진수로 변환하여 돌려줌

id 함수

  • id(object)

  • 객체를 입력받아 객체의 고유 주소(레퍼런스) 값을 돌려주는 함수

    a = 3
    id(3)
    135072304
    id(a)
    135072304

input 함수

  • input([prompt])

  • 사용자 입력을 받는 함수

  • 매개변수로 문자열을 주면 프롬프트가 됨

    a = input()
    b = input("Enter: ")

int 함수

  • int(x)

    • 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수형태로 돌려주는 함수
    int('3') # res : 3
    int(3.4) # res : 3
  • int(x, radix)

    • radix진수로 표현된 문자열 x를 10진수로 변환하여 돌려줌
    int('11', 2) # res : 3
    int('1A', 16) # res : 26

isinstance 함수

  • isinstance(object, class)

  • 첫번 째 인수로 인스턴스, 두번 째 인수로 클래스를 받아 클래스와 인스턴스 관계를 확인

    class Person: pass
    ...
    a = Person()
    isinstance(a, Person) # res : True

len 함수

  • len(s)

  • 입력값 s의 길이를 돌려주는 함수

    len("python") # res : 6
    len([1, 2, 3]) # res : 3
    len((1, 'a')) # res : 2

list 함수

  • list(s)

  • 반복가능한 자료형 s를 입력받아 리스트로 만들어 주는 함수

    list("python") # res : ['p', 'y', 't', 'h', 'o', 'n']
    list((1, 2, 3)) # res : [1, 2, 3]
  • 값만 복사(깊은 복사) 할 때도 사용

    a = [1, 2, 3]
    b = list(a)

map 함수

  • map(f, iterable)

  • 함수 f와 반복 가능한(iterable) 자료형을 입력 받는다.

  • 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려줌

  • 다음 예시는 PS 할 때 거의 매번 쓰는 코드

    • 입력으로 3개의 문자가 오면, 공백을 기준으로 split 하여 a, b, c에 int형으로 각각 형변환 후 저장
    a, b, c = map(int, input().split())
  • example

    def two_times(numberList):
        result = []
        for number in numberList:
            result.append(number*2)
        return result
    
    result = two_times([1, 2, 3, 4])
    print(result)
    
    위 코드를 map함수를 이용하여 다음처럼 바꿀 수 있다.
    def two_times(x): return x * 2
    list(map(two_times, [1, 2, 3, 4]))
    • 1이 two_times 함수의 입력값으로 들어감
    • 1 * 2가 되어 2가 됨.
    • 모두 수행되면 [2, 4, 6, 8]
    • 직접 인덱스에 접근해서 처리하는 것 보다 간결함.
  • lambda 사용

    list(map(lambda x: x*2, [1, 2, 3, 4]))

max 함수

  • max(iterable)

  • 인수로 iterable 자료형을 받아 최댓값을 돌려주는 함수

    max([1, 2, 3]) # res : 3
    max("python") # res : 'y'

min 함수

  • min(iterable)

  • 인수로 iterable 자료형을 받아 최솟값을 돌려주는 함수

    min("python") # res : 'h'

oct 함수

  • oct(x)

  • 정수 형태의 숫자를 8진수 문자열로 바꿔주는 함수

oct(34) # res : 0o42

open 함수

  • open(filename, [mode])

  • 파일이름, 읽기방법을 입력받아 파일 객체를 돌려준다.

  • 자세한 내용은 [[Python] 15. 파일 입출력]([Python] 15. 파일 입출력(FILE Input/Output)) 참조

  • 읽기방법 생략시 읽기전용모드(r)로 객체를 만들어 돌려줌

  • w: 쓰기 모드, r: 읽기 모드, a: 추가 모드, b: 바이너리 모드 (w, r, a와 함께 사용)

    f = open("binary_file", "rb") # rb는 바이너리 읽기 모드

ord 함수

  • ord(c)

  • 문자의 아스키 코드 값을 돌려주는 함수

pow 함수

  • pow(x, y)

  • x의 y 제곱의 결괏값을 돌려줌


pow(x, y)함수와 math.pow(x, y), x ** y와의 차이?


  • math.pow(x, y)의 결괏값은 항상 float형

  • pow는 3번째 파라미터로 나머지 계산 mod를 받을 수 있음. ex) pow(base, exp, mod) --> base, exp는 정수형

  • base ** exp 는 속도가 셋 중에서 제일 빠름


range 함수

  • range([start,] stop[,step])

  • for 문과 가장 많이 사용하는 함수

  • 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 돌려줌

  • 인수가 하나일 경우

    • 시작 숫자를 지정하지 않으면 range함수는 0부터 시작, 끝 숫자 포함 X

      list(range(5)) # res : [0, 1, 2, 3, 4]
  • 인수가 2개일 경우

    • 입력으로 주어지는 2개의 인수는 시작 숫자와 끝 숫자를 나타낸다. 끝 숫자 포함 X

      list(range(5, 10)) # res : [5, 6, 7, 8, 9]
  • 인수가 3개일 경우

    • 세번 째 인수는 숫자 사이의 거리를 의미

      list(range(1, 10, 2)) # res : [1, 3, 5, 7, 9]
      list(range(0, -10, -1)) # res : [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

round 함수

  • round(number[, ndigits])

  • 숫자를 입력받아 반올림 해주는 함수

    round(4.6) # res : 5
    round(5.678, 2) # res : 5.68
    # 소수점 [ndigits]자리까지 반올림하여 표시

sorted 함수

  • sorted(iterable)

  • 입력값을 정렬한 후 결과를 리스트로 리턴

  • list 자료형의 sort 메서드는 리스트 객체 그 자체를 정렬만 하고, 리턴하지는 않음.

    sorted([3, 1, 2]) # res : [1, 2, 3]
    sorted(['a', 'c', 'b']) # res : ['a', 'b', 'c']
    sorted("zero") # res : ['e', 'o', 'r', 'z']
    sorted((3, 2, 1)) # res : [1, 2, 3]

str 함수

  • str(object)

  • 문자열 형태로 객체를 변환하여 돌려주는 함수

    str(3) # res : '3'
    str('hi') # res : 'hi'
    str('hi'.upper()) # res : 'Hi' 

sum 함수

  • sum(iterable)

  • 입력받은 리스트나 튜플의 모든 요소의 합을 돌려주는 함수(집합도 가능)

    sum([1, 2, 3]) # res : 6
    sum((1, 2, 3)) # res : 6

tuple 함수

  • tuple(iterable)

  • 반복 가능한 자료형을 입력받아 튜플형태로 돌려줌(튜플은 튜플 그대로 리턴)

    tuple("abc") # res : ('a', 'b', 'c')
    tuple([1, 2, 3]) # res : (1, 2, 3)
    tuple((1, 2, 3)) # res : (1, 2, 3)

type 함수

  • type(object)

  • 입력값의 자료형이 무엇인지 알려주는 함수

    type(open("test", 'w')) # res : <class '_io.TextIOWrapper'>

zip 함수

  • zip(*iterable)

  • 동일한 개수로 이루어진 자료형을 묶어줌

    list(zip([1, 2, 3], [4, 5, 6])) # res : [(1, 4), (2, 5), (3, 6)]
    list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9])) # res : [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    list(zip("abc", "def")) # res : [('a', 'd'), ('b', 'e'), ('c', 'f')]

참조) Do it! 점프 투 파이썬 (박응용 지음)

예외처리(Exception Handling)


Exception


  • 프로그램 실행 중 특별한 처리가 필요한 변칙적이거나 예외적인 조건

  • 파이썬에는 많은 Bulit-in Exception 들이 존재함

  • ex) 0으로 나누는 경우

    ex) 없는 파일을 'r' 모드로 읽으려고 하는 경우

  • 이러한 예외 상황을 다루기 위해 Exception Handling을 해준다

오류 예외 처리 기법


try.except문

  • try 블록 수행 중 오류가 발생하면, except블록 실행.

  • try 블록 수행 중 오류가 발생하지 않으면, except 블록 실행 X

    try:
        ...
    except [발생 오류 [as 오류 메시지 변수]]:
        ...
    • []기호는 괄호 안의 내용을 생략할 수 있다는 관례 표시
  • except 구문을 사용하는 3가지 방법

    1. try, except 만 사용

      try:
         ....
      except:
         ....
    2. 발생 오류만 초함한 except문

      try:
         ....
      except 발생오류:
         ....
    3. 발생 오류와 오류 메시지 변수까지 포함한 except문

      try:
         ....
      except 발생 오류 as 오류 메시지 변수:
         ....
    • example
    try:
        4 / 0
    except ZeroDivisionError as e:
        print(e)
    a = [1, 2]
    try:
        a[3]
    except IndexError as e:
        print(e)
  • try ... finally

    • try문에는 finally 절을 사용할 수 있음

    • finally문은 예외 발생 여부 상관없이 항상 수행

    • 리소스를 close할 때 많이 사용 (아래 예시처럼)

      f = open('foo.txt', 'w')
      try:
          # 무언가를 수행
      finally:
          f.close()
  • 여러개의 오류 처리하기

    try:
        ....
    except 발생오류 1:
        ....
    except 발생오류 2:
        ....
    • example

      try:
          a = [1, 2]
          print(a[3])
          4 / 0
      except ZeroDivisionError:
          print("Can't Divide by Zero.")
      except IndexError:
          print("Can't Indexing.")
      --> 인덱싱 오류가 먼저 발생하므로 ZeroDivisionError에 해당하는 오류가 발생하지 않음
      try:
          a = [1, 2]
          print(a[3])
          4 / 0
      except ZeroDivisionError as e:
          print(e)
      except IndexError as e:
          print(e)
      try:
          a = [1, 2]
          print(a[3])
          4 / 0
      except (ZeroDivisionError, IndexError) as e:
          print(e)
      --> 2개 이상의 오류를 동시에 처리하기 위해서는 위와 같이 packing을 통해 처리한다.

오류 일부러 발생시키기

  • raise 명령어 사용

    class Bird:
        def fly(self):
            raise NotImplementedError
    
    class Eagle(Bird):
        pass
    
    eagle = Eagle()
    eagle.fly() # NotImplemented Error 발생

예외 만들기

  • 특수한 경우에만 예외 처리를 하기 위해 예외를 만들어서 사용하기도 함

  • example

    class MyError(Exception):
        pass
    
    def say_nick(nick):
        if nick == '바보':
            raise MyError()
        print(nick)
    
    say_nick("바보") # 오류 발생
    • 여기서 Exception은 Built-in 클래스
    # 위 예시에서 예외처리 기법 사용
    try:
        say_nick("천사")
        say_nick("바보")
    except MyError:
        print("허용되지 않는 별명입니다.")
    
    res :
    천사
    허용되지 않는 별명입니다.
    # 위 예시에서 예외처리 기법 사용
    try:
        say_nick("천사")
        say_nick("바보")
    except MyError as e:
        print(e) # 오류 메시지가 출력되지 않음
    • Exception 클래스를 상속받은 MyError 클래스가 어떤 오류인지 모름

    • print(e)로 오류메시지를 보이게 하려면 오류 클래스에 __str__ 메서드를 구현해야 함.

    class MyError(Exception):
        def __str__(self):
            return "허용되지 않는 별명입니다."

참조) Do it! 점프 투 파이썬 (박응용 지음)

+ Recent posts