본문 바로가기
  • 실행력이 모든걸 결정한다
Python

[Python 간단정리 4] 예외 처리 / lambda / 내장·외장 함수

by 김코더 김주역 2023. 1. 7.
반응형

1. 예외 처리

1) try, except문

- try 블록 수행 중 오류가 발생하면 except 블록이 수행된다.

- except문에 발생 오류를 지정하지 않으면 오류 종류에 상관없이 오류가 발생하기만 하면 except 블록을 수행한다.

- 예를 들어, 수를 0으로 나눴을 때 발생하는 ZeroDivisionError 예외가 발생했을 때 오류 메시지를 출력하고 싶다면 다음과 같이 작성한다.

try:
    4/0
except ZeroDivisionError as e:
    print(e) # division by zero

- except 블록에 pass 키워드만 넣으면 오류를 그냥 회피한다.

 

 

2) else문

- 예외가 발생하지 않은 경우에 실행되며 반드시 except절 바로 다음에 위치해야 한다.

try:
    4/0
except ZeroDivisionError as e:
    print(e) # division by zero
else:
    print("이상 없음") # 실행되지 않음

 

 

3) finally문

- 예외 발생 여부에 상관없이 항상 수행된다.

try:
    4/0
except ZeroDivisionError as e:
    print(e) # division by zero
else:
    print("이상 없음") # 실행되지 않음
finally:
    print("검사 끝") # 실행됨

- 사용한 리소스를 반환해야 할 경우에 많이 사용된다.

 

 

4) raise

- raise 명령어를 통해 오류를 강제로 발생시킬 수 있다.

raise 발생 오류

- 예를 들어, Bird 클래스를 상속받는 자식 클래스들은 반드시 fly() 함수를 구현하도록 하고자 한다.

class Bird:
    def fly(self):
        raise NotImplementedError # 꼭 재정의해야 하는 부분이 재정의되지 않았을 때 발생시키는 예외

자식 클래스가 fly() 함수를 재정의하지 않은 상태로 fly() 함수를 호출하면 Bird 클래스의 fly() 함수가 사용되기 때문에 NotImplementedError 예외가 발생한다.

 

 

 

2. lambda

- lambda는 함수를 한줄로 간결하게 생성할 때 사용하는 예약어다.

lambda 인수1, 인수2 ... : 반환값

 

sum=lambda a,b: a+b
print(sum(3, 5)) # 8

arr = [lambda a,b: a+b, lambda a,b:a-b] # 리스트에 함수를 저장
print(arr[0](3, 4)) # 7
print(arr[1](7, 2)) # 5

 

 

 

3. 내장 함수

- 파이썬의 내장 함수는 import를 필요로 하지 않는다.

- abs(x) : 숫자 x의 절대값을 반환

- all(x) : 반복 가능한 자료형 x의 요소가 모두 참이면 True를 반환하고, 그렇지 않으면 False를 반환

print(all([1,2,3])) # True
print(all([0,1,2])) # False
print(all([True, False, True])) # False

- any(x) : 반복 가능한 자료형 x의 요소가 하나라도 참이면 True를 반환하고, 그렇지 않으면 False를 반환

- chr(x) : 정수형 아스키 코드값 x에 대한 문자를 반환

- ord(x) : 문자 x에 대한 정수형 아스키 코드값을 반환

- dir(x) : 객체 x가 자체적으로 가지고 있는 변수나 함수를 반환

- divmod(x, y) : x를 y로 나눈 몫과 나머지를 튜플로 리턴

- enumerate(x) : 순서가 있는 자료형 x을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 반환

for idx, str in enumerate(['apple', 'banana', 'lemon']):
    print(idx, str)

- eval(x) : 실행 가능한 문자열을 입력으로 받아 문자열을 실행한 결과값을 반환

print(eval("1+2")) # 3
print(eval("divmod(4,3)")) # (1, 1)

- filter(x, y) : 함수 x와 반복 가능한 자료형 y를 받아서, y의 요소들이 x에 입력되었을 때 리턴값이 참인 것들만 걸러낸 결과인 filter 객체를 반환

def negative(x):
    return x<0

print(list(filter(negative, [1, -2, 3, -4, 5, -6]))) # [-2, -4, -6]

- hex(x) : 정수값 x를 16진수로 문자열로 변환하여 반환

- oct(x) : 정수값 x를 8진수로 문자열로 변환하여 변환

- id(x) : 객체 x의 고유 주소값을 반환

- input(x) : x라는 프롬포트를 띄우고 사용자 입력을 받아서 반환 (x 생략 가능)

a=input("내용을 입력하세요: ")
print(a)

- int(x) : 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수 형태로 반환

※ int(x, radix) : radix 진수로 표현된 문자열 x를 10진수로 변환하여 반환

print(int('C4', 16)) # 196(=16*12+4)

- isinstance(object, class) : 인스턴스 object가 클래스 class의 인스턴스인지를 판단하여 참이면 True, 거짓이면 False를 반환

class A:
    pass

a=A()
print(isinstance(a, A)) # True

- len(x) : 입력값 x의 길이(요소의 전체 개수)를 반환

- list(x) : 반복 가능한 자료형 x를 리스트로 변환하여 반환

- tuple(x) : 반복 가능한 자료형 x를 튜플로 변환하여 반환

- map(x, y) : 반복 가능한 자료형 y의 각 요소가 함수 x에 의해 수행된 결과인 map 객체를 반환

print(list(map(lambda x:2*x, [1,2,3,4,5]))) # [2, 4, 6, 8, 10]

- max(x) : 반복 가능한 자료형 x의 최대값을 반환

- min(x) : 반복 가능한 자료형 x의 최소값을 반환

- pow(x, y) : x의 y제곱을 반환

- range([start,] stop [,step]) : [Python 간단정리 2]의 [3-2) range() 함수] 참고

- sorted(x) : 반복 가능한 자료형 x의 요소들을 정렬해서 그 결과를 리스트로 반환

- str(x) : 객체 x를 문자열 형태로 변환하여 반환

- type(x) : 객체 x의 자료형을 반환

- zip(x) : 동일한 개수로 이루어진 자료형을 하나씩 묶어서 zip 객체로 반환

print(list(zip([1,2,3],['a','b','c'],[7,8,9]))) # [(1, 'a', 7), (2, 'b', 8), (3, 'c', 9)]

 

 

 

4. 유용한 외장 함수들

1) sys

- 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 제어할 수 있게 해주는 모듈

 

- sys.argv : 명령 행에서 입력한 인수 불러오기

- sys.exit() : 스크립트 종료

- sys.path : 파이썬 모듈들이 저장되어 있는 디렉토리 리스트를 반환

 

 

2) pickle

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

- 어떠한 자료형이든 상관없이 저장하고 불러올 수 있다.

import pickle

class Hello:
    def __init__(self):
        self.a=3
        self.b=4
        self.c=5
    def sum(self):
        return self.a+self.b+self.c
    
hello = Hello()
f=open("test.txt", 'wb') # 바이너리 쓰기
pickle.dump(hello, f) # 객체를 파일에 저장
f.close()

f=open("test.txt", 'rb') # 바이너리 읽기
data=pickle.load(f) # 파일에 저장된 객체를 로드
print(data.sum()) # 12

 

 

3) os

- OS 자원을 제어할 수 있게 해주는 모듈

 

- os.environ : 현재 시스템의 환경 변수에 대한 정보를 딕셔너리 객체로 반환

- os.path.join(x, y) : 디렉터리명 x과 파일명 y를 이어준 문자열을 반환

- os.path.splitext(x) : 파일 경로 x를 확장자를 기준으로 두 부분으로 나누어 튜플로 반환

- os.path.isdir(x) : 파일 경로 x가 디렉토리면 True를 반환하고, 그렇지 않으면 False를 반환

- os.chdir(x) : 현재 디렉토리의 위치를 x로 변경

os.chdir("C:\WINDOWS")

- os.getcwd() : 현재 디렉토리의 위치를 반환

- os.system(x) : 시스템 명령어 x를 실행

- os.popen(x) : 시스템 명령어 x를 실행시킨 결과값을 읽기 모드 형태의 파일 객체로 반환 (x는 문자열)

- os.mkdir(x) : 새 디렉토리를 x라는 이름으로 생성

- os.rmdir(x) : x라는 이름의 디렉토리를 삭제

- os.unlink(x) : x라는 이름의 파일을 삭제

- os.rename(x, y) : 파일의 이름을 x에서 y로 변경

- os.listdir(x) : 디렉토리 경로 x에 있는 모든 파일의 이름을 리스트로 반환

- os.walk(x) : 시작 디렉토리 경로 x부터 시작하여 그 하위의 모든 디렉토리를 차례대로 탐색하고, 그 탐색 결과로 root, dirs, files 값을 묶은 튜플을 반환한다.

※ root는 탐색 경로, dirs는 root 아래에 있는 폴더 리스트, files는 root 아래에 있는 파일 리스트

 

 

4) shutil

- 파일을 복사해 주는 모듈

shutil.copy("src.txt", "dst.txt")

 

 

5) glob

- 특정 디렉토리에 있는 파일들의 리스트를 반환해주는 모듈

glob.glob("C:\Python\h*") # 'h'로 시작하는 파일들을 모두 검색

 

 

6) tempfile

- 임시 파일을 만들어서 사용하고 싶을 때 사용하는 모듈

 

- tempfile.mktemp() : 중복되지 않는 임시 파일의 이름을 무작위로 만들어서 반환

- tempfile.TemporaryFile() : 임시 파일 객체를 반환한다. 기본적으로 'wb' 모드를 가지며, 해당 파일 객체의 close() 함수가 호출되면 이 파일 객체는 자동으로 사라진다.

 

 

7) time

- 시간 관련 모듈

 

- time.time() : UTC를 이용하여 현재 시간을 실수 형태로 반환

- time.localtime() : time.time()에 의해서 반환된 실수값을 이용해서 연도, 월, 일, 시, 분, 초 등의 형태로 변환한 결과인 time.struct_time 객체를 반환

import time
result=time.localtime(time.time()) # time.struct_time(tm_year=2023, tm_mon=1, tm_mday=8, tm_hour=17, tm_min=16, tm_sec=5, tm_wday=6, tm_yday=8, tm_isdst=0)
print(result.tm_year) # 2023
print(result.tm_mon) # 1
print(result.tm_mday) # 8

- time.asctime() : time.struct_time 객체를 파라미터로 받아서 날짜와 시간을 보기 쉬운 형태의 문자열로 반환

print(time.asctime(time.localtime(time.time()))) # 'Sun Jan  8 17:31:08 2023'

- time.ctime() : time.asctime(time.localtime(time.time()))와 동일한 기능을 한다.

- time.strftime(x, y) : time.struct_time 객체 y를 포맷 코드 x에 따라 표현한 시간 정보를 반환

print(time.strftime('%x', time.localtime(time.time()))) # '01/08/23'

※ 포맷 코드 참고 : https://www.tutorialspoint.com/python/time_strftime.htm

- time.sleep(x) : x초 동안 코드 실행을 지연

 

 

8) calendar

- 달력을 볼 수 있게 해주는 모듈

 

- calendar.calendar(x) : x년도 달력을 문자열 형태로 반환

- calendar.prcal(x) : x년도 달력을 출력 (반환값 없음)

- calendar.prmonth(x, y) : x년도 y월 달력을 출력 (반환값 없음)

- calendar.weekday(x, y, z) : x년도 y월 z일에 해당하는 요일 정보(0(월)~6(일))를 반환

- calendar.monthrange(x, y) : x년도 y월의 1일이 무슨 요일인지와 해당 달이 며칠까지 있는지를 튜플 형태로 반환

print(calendar.monthrange(2023, 1)) # (6, 31)

 

 

9) random

- 난수를 발생시키는 모듈

 

- random.random() : 0과 1 사이의 실수 중에서 난수값을 반환

- random.randint(x, y) : x에서 y 사이의 정수 중에서 난수값을 반환

- random.choice(x) : 반복 가능한 자료형 x의 요소들 중에서 무작위로 하나를 리턴

- random.shuffle(x) : 리스트 x의 요소들을 무작위로 섞음

 

 

10) webbrowser

- 기본 웹 브라우저를 자동으로 실행되게 하는 모듈

 

- webbrowser.open(x) : 문자열 x로 표현된 url로 이동

- webbrowser.open_new(x) : 문자열 x로 표현된 url로 새 창을 띄워서 이동

 

 

11) threading

- 쓰레드를 다루는 모듈

- threading.Thread 클래스를 통해 쓰레드 객체를 생성할 수 있다.

예시

import threading
import time

def show(msg): # 0.5초마다 msg를 출력
    while True:
        time.sleep(0.5)
        print(msg, end=' ')
        
for i in ['a', 'b', 'c']:
    t = threading.Thread(target=show, args=(i, )) # show 메소드를 실행 대상으로 한 쓰레드를 생성
    t.daemon=True # 주 프로그램이 종료되는 순간 데몬 스레드도 함께 종료되도록 설정
    t.start() # 쓰레드 시작
    
for i in range(10): # 0.1초 간격으로 0부터 9까지 출력
    time.sleep(0.1)
    print(i, end=' ')

- 다음과 같이 쓰레드를 threading.Thread를 상속 받은 클래스로 정의할 수도 있다. 위의 코드와 동일한 역할을 수행한다.

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, msg):
        threading.Thread.__init__(self) # 반드시 호출해야 한다.
        self.daemon=True
        self.msg=msg
        
    def run(self): # 쓰레드가 할 작업
        while True:
            time.sleep(0.5)
            print(self.msg, end=' ')

        
for i in ['a', 'b', 'c']:
    t = MyThread(i) 
    t.daemon=True # 주 프로그램이 종료되는 순간 데몬 스레드도 함께 종료되도록 설정
    t.start() # start() 실행 시 MyThread.run()이 자동으로 수행됨
    
for i in range(10): # 0.1초 간격으로 0부터 9까지 출력
    time.sleep(0.1)
    print(i, end=' ')

 

 

● 참고 자료 : Do it! 점프 투 파이썬

 

 

 

반응형

댓글