코딩 테스트 스터디/엘리스 이론 강의

실습으로 배우는 파이썬 下 (클래스~응용편)

남쪽마을밤송이 2022. 2. 5. 04:49

 [08 클래스] 

클래스(class)

  • 하나의 클래스를 가지고 여러 개의 객체를 만들 수 있음
  • 만들어진 객체들은 서로 아무런 영향을 주지 않음
  • 클래스 멤버 : 클래스에서 변수와 같은 역할
    클래스 메소드: 클래스에서 함수와 같은 역할
    class MyClass:
        var = '클래스 멤버'
        def func(self):
            print('클래스 메소드')
    - 파이썬에서 클래스 메소드의 인자는 self를 관습적으로 사용해 객체를 전달

클래스 멤버와 인스턴스 멤버

  • 클래스 멤버 : 객체간 서로 공유되는 변수
  • 인스턴스 멤버 : 객체별로 고유한 값을 저장하는 변수
    인스턴스 멤버는 self.멤버이름을 통해 선언할 수 있음(특정 객체의 멤버이기 때문에 이러한 형식으로 선언)
    class KiaK3:
        brand = '기아'  #클래스 멤버
        model = 'K3'    #클래스 멤버
        def owner(self, name):
            self.name = name  #인스턴스 멤버​
    - brand, model 값은 KiaK3 클래스를 통해서 생성되는 모든 객체가 공유
    - 반면 name이라는 변수는 객체마다 고유한 값을 가짐
  • 클래스 메소드 선언 방법 : 첫 번째 인자는 반드시 self여야 하며, 이는 클래스로 생성된 객체를 의미
    class MyClass:
        var = '안녕하세요!'
        def sayHello(self):
            param1 = '안녕'
            # self를 이용해 아래 인스턴스 멤버 param2를 선언하고 '하이'를 저장해주세요.
            self.param2 = '하이'
            print(param1) # 안녕
            print(self.var) # 안녕하세요
    
    obj = MyClass()
    obj.sayHello()
    
    # 객체 `obj`의 인스턴스 멤버 `param2`를 출력해보세요.
    print(obj.param2)​ # 하이
  • 클래스 메소드 호출 방법
    - 클래스 이름을 이용한 메소드를 호출 : self 인자 필요(객체 이름)
    - 객체 이름을 이용한 메소드를 호출 : self 인자 생략
    #Car클래스의 객체를 생성하여 myCar에 저장
    myCar = Car()
    
    #클래스 이름인 Car로 메소드 호출
    Car.set_owner(myCar, '엘리스')
    
    #객체 이름인 myCar로 메소드 호출
    myCar.set_owner('엘리스')​

클래스 생성자

  • 클래스 생성자 는 객체가 생성될 때마다 자동으로 실행되는 클래스 메소드
  • 생성자는 클래스 내에서 다음과 같이 정의
    def __init__(self):
        # 여기에 생성자에서 처리하고자 하는 내용을 넣습니다.​
    - 일반적으로 생성자는 클래스 변수를 설정해주는 등의 초기화 작업을 수행
  • 생성자는 self 외에 여러개의 인자를 가질 수 있음
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age​
            
     # Person 클래스의 객체 생성
     person = Person("길동", 20)

클래스 소멸자

  • 클래스 소멸자 는 객체가 메모리에서 제거될 때 자동으로 실행되는 메소드
  • 소멸자는 클래스 내에서 다음과 같이 정의
    class Person:
        (생략)
        def __del__(self):
            # 여기에 소멸자에서 처리하고자 하는 내용을 넣습니다.​
  • 객체를 메모리에서 제거하기 위해 del 객체명 입력
  • 따라서 생성자나 소멸자와 같이 앞뒤에 ‘__’ 가 붙는 경우, 특별한 용도로 미리 예약한 메소드명이라고 생각하면 됨

클래스 상속

  • 상속은 하나의 클래스가 다른 클래스의 멤버와 메소드를 그대로 물려받아 사용할 수 있는 개념
  • 상속을 받는 클래스를 자식클래스, 상속을 하는 클래스를 부모클래스라 부름
  • 자식클래스는 서브클래스, 부모클래스는 슈퍼클래스라고도 부름
    class Subclass(SuperClass):​# class 자식클래스명(부모클래스명)
    - 자식클래스는 여러 개의 부모클래스로부터 상속받을 수 있음
    - 만약 자식클래스와 부모클래스의 멤버 또는 메소드가 중복된다면, 자식클래스의 요소를 우선시 

 [09 예외처리] 

예외처리

  • 프로그램이 실행되는 동안 에러가 발생하면 프로그램이 중단되는데 이를 예외 상황이라고 함
  • 이 때 예외처리 구문을 사용하면 예외 상황이 발생하더라도 예외 상황에 대한 적절한 코드를 실행하고, 프로그램을 계속 진행할 수 있음
  • try~except : try에 해당하는 블럭에 에러가 발생할 가능성이 큰 부분을 두고, 예외가 발생할 경우, except에 해당하는 코드 블럭이 실행됨
    try:
        # 오류가 발생할 가능성이 큰 코드
        코드 블럭 A
        ...
    except:
        # 오류가 발생할 경우 실행되는 코드
        코드 블럭 B
        ...​
  • try~except~else : 오류 상황이 아닐 때 특정 작업을 수행하는 코드를 작성하고 싶을 경우에 사용, try에 해당하는 코드에서 오류가 날 경우 except로 이동하고, 오류가 발생하지 않을 경우 else로 이동
    try:
        # 오류가 발생할 가능성이 큰 코드
        코드 블럭 A
        ...
    except:
        # 오류가 발생할 경우 실행되는 코드
        코드 블럭 B
        ...
    else:
        # 오류가 발생하지 않을 경우 실행되는 코드
        코드 블럭 C
        ...
  • try~except~finally : try에 해당하는 코드에서 오류가 날 경우, except와 finally에 해당하는 코드가 실행되고 try에 해당하는 코드에서 오류가 발생하지 않을 경우 finally에 해당하는 코드만 실행됨
    try:
        # 오류가 발생할 가능성이 큰 코드
        코드 블럭 A
        ...
    except:
        # 오류가 발생할 경우 실행되는 코드
        코드 블럭 B
        ...
    finally:
        # 오류가 발생 우무와 상관 없이 실행되는 코드
        코드 블럭 C
        ...​
  • try~except Exception : try~except문에서 파이썬에서 미리 정해놓은 예약어 Exception을 사용할 경우 오류가 발생한 원인을 출력 받을 수 있음, e(error)뿐만 아니라 Exception을 다른 이름으로도 저장할 수 있지만 현업에서는 e외의 다른 문자를 사용하는 것을 지양함
    try:
        # 오류가 발생할 가능성이 큰 코드
        코드 블럭 A
        ...
    # 오류가 무엇인지 알려주는 예약어 Exception을 e로 접근할 수 있도록 선언합니다.
    except Exception as e:
        # 오류가 발생할 경우 출력되는 오류 메시지가 저장된 e를 출력합니다.
        print(e)

 [10 유용한 파이썬 내장함수] 

divmod()

  • 파이썬 내장 함수 divmod()를 사용하면 몫과 나머지를 구할 수 있음
  • divmod()는 두 개의 정수를 인자로 받고 첫 번째 인자를 두 번째 인자로 나누었을 때의 몫과 나머지 값을 튜플로 리턴
    # 12를 3으로 나누었을 때의 몫과 나머지값을 저장합니다.
    a, b = divmod(12, 5)
    print(a, b) # 2, 2

hex(), bin()

  • 파이썬 내장 함수 hex()를 이용하면 인자로 받은 10진수를 16진수로 변환, bin()도 마찬가지로 2진수로 변환해 줌
  • 이때 리턴된 값은 문자열로 저장되고 변환한 2, 16진수에 덧셈이나 뺄셈을 수행하고자 할 경우 int(10진수로 바꿀 수, 기존 진법)를 이용해 10진수로 다시 변환한 후 연산을 해야 함!!!
    # 10진수 정수 26을 16진수로 변환
    a = hex(26)
    print(a)
    
    # 26의 16진수 값을 10진수로 다시 변환
    b = int(a, 16)
    print(b)​

abs(), round()

  • abs는 입력된 인자의 절대값을 리턴
  • round()는 입력된 숫자의 반올림한 값을 리턴, 두 개의 숫자를 인자로 받을 수 있음
    - 첫번째 인자는 반올림을 할 값
    - 두번째 인자는 반올림 자리 수
  • 예를 들어 두 번째 인자가 1, 2, 3일때는 각각 소수점 둘째자리, 소수점 셋째자리, 소수점 넷째자리에서 반올림
    참고로, 두번째 인자가 입력되지 않을 때에는 숫자의 소수점 첫째자리에서 반올림한 수를 리턴!!!
    print(abs(-1)) # 1
    # 18.8을 소수점 첫째자리에서 반올림
    print(round(18.8)) # 19
    # 1332를 1의 자리에서 반올림
    print(round(1332, -1)) # 1330
    # 1.554를 소수점 셋째자리에서 반올림
    print(round(1.554, 2)) # 1.55

max(), min()

  • 파이썬 내장 함수 max() min() 함수를 이용하면 시퀀스 자료의 최대, 최소 값을 찾아낼 수 있음
  • 문자열의 경우 max()는 최대 인덱스값, min()은 최소 인덱스값을 반환
    # num_data의 최대값을 출력
    num_data = [1, 2, 3]
    print(max(num_data)) # '3'
    
    # str_data의 최소값을 출력
    str_data = 'Python'
    print(max(str_data)) # 'n'
    print(min(str_data)) # 'P'​

 [11 문자열] 

isalpha()

  • 파이썬이 제공하는 isalpha() 메소드를 사용하면 특정 문자열이 한글이나 알파벳으로만 구성되어 있는지 확인할 수 있음
  • 확인하고 싶은 문자열을 변수에 저장하고 변수명.isalpha()를 작성하여 사용할 수 있음
  • 문자열의 모든 문자가 알파벳 또는 한글로만 구성되어 있으면 True를 리턴하고 아니면 False를 리턴, 공백이 있으면 False가 반환됨

isdigit()

  • 파이썬이 제공하는 isdigit() 메소드를 사용하면 특정 문자열이 숫자로만 구성되어 있는지 확인할 수 있음
  • 확인하고 싶은 문자열을 변수에 저장하고 변수명.isdigit()를 호출하여 사용할 수 있음
  • 문자열의 모든 요소가 숫자로 구성되어 있으면 True를 리턴하고 아니면 False를 리턴, 공백이 있으면 False가 반환됨

isalnum()

  • isalnum() 메소드를 사용하면 문자열을 구성하는 요소가 모두 숫자 또는 알파벳, 한글 등 언어 문자인지 확인하고 True 또는 False를 리턴
  • 기호나 공백이 있으면 False가 반환됨

find()

  • find()는 문자열에서 특정 문자열이 위치하는 인덱스를 얻을 수 있음
  • ()에 인자로 입력한 문자열이 최초로 나타나는 인덱스를 리턴
  • 특정 인덱스 이후에 나타나는 문자를 찾고 싶을 경우 문자를 찾기 시작할 시작점의 인덱스를 두 번째 인자로 추가, 두 번째 인자가 없는 경우에는 제일 왼쪽부터 찾기 시작
    txt = 'Apple Special Event Keynote'
    
    # 소문자 'p'가 최초로 나타나는 인덱스를 찾음
    find1 = txt.find('p')
    print(find1) # 1
    
    # 'Event'가 최초로 나타나는 인덱스를 찾음
    find2 = txt.find('Event')
    print(find2) # 14
    
    # 인덱스10 이후에 나타나는 소문자 'e'의 인덱스를 찾음
    find3 = txt.find('e', 10)
    print(find3) # 16​

replace()

  • replace() 메소드는 문자열에서 특정 문자나 문자열을 다른 문자(열)로 변경할 때 사용
  • replace()는 두 개의 문자열을 인자로 받음, 해당하는 모든 문자열을 변경
    - 첫번째 인자 : 변경하고 싶은 문자열
    - 두번째 인자 : 첫번째 인자를 대체할 문자열

sorted()

  • sorted()는 인자로 입력받은 문자열을 알파벳 오름차순으로 정렬하고 결괏값을 리스트 형태로 리턴
  • 대문자가 우선순위를 가짐
  • 내림차순으로 정렬하고 싶을 경우 두번째 인자로 reverse=True를 입력하고 그럴 경우 반대로 소문자가 우선순위를 가짐

ord()

  • ord()는 사람이 알아보는 문자를 컴퓨터가 인식하는 코드값으로 변환
  • ord()는 인자로 문자 한 개를 받아 이에 해당하는 ASCII 코드를 정수로 반환
  • ord()의 인자로 숫자 또는 한 개 이상의 문자를 입력할 경우 오류가 발생함

crd()

  • chr()는 ord()의 반대 기능을 수행
  • chr()의 인자로 정수값을 입력하면 이 정수값에 해당하는 문자를 리턴
  • 입력한 코드값에 대한 문자가 존재하지 않을 경우 오류가 발생

eval()

  • 코드를 작성하다 보면 사용자의 입력값 또는 파일에서 읽은 수식이나 문자열을 그대로 실행해야 할 경우가 있는데이때 eval()을 사용하면 코드로 실행 가능한 문자열을 인자로 받아 결괏값을 리턴할 수 있음
    expr1 = '2+3'
    expr2 = 'round(3.7)'
    
    ret1 = eval(expr1)
    ret2 = eval(expr2)
    
    print(ret1) # 5
    print(ret2) # 4​

 [12 리스트] 

index()

  • index()는 리스트에서 멤버의 값을 알고 있을 때 해당 멤버가 최초로 나타나는 위치의 인덱스를 리턴
    listdata = [1, 0, 3, 7, 8, 1]
    # listdata에서 멤버 3이 최초로 나타는 위치를 출력
    print(listdata.index(3)) # 2
    # listdata에서 인덱스2 이상인 멤버부터 검색하여 멤버 1이 등장하는 인덱스를 출력
    print(listdata.index(1, 2)) # 5​

리스트 요소 순서를 역순으로 만들기

  • 리스트를 구성하는 멤버를 역순으로 만드는 방법에는 두 가지가 있음
  • reverse() : 리스트의 모든 요소의 순서를 거꾸로 만들어 원본 리스트 자체가 변경됨, 따라서 새로운 변수에 원본 리스트를 저장하고 새로운 변수를 reverse()해야 원본 리스트를 변경하지 않고 역순 리스트를 얻을 수 있음
  • [::-1] : 스탭에 -1을 입력하여 리스트를 슬라이싱을 하면 멤버 순서가 역순으로된 새로운 리스트를 만들 수 있고 원본 리스트가 변경되지 않음

insert()

  • insert()를 사용하면 리스트의 특정 위치에 새로운 요소를 삽입할 수 있음
  • insert()는 두 개의 인자를 받음
    - 첫번째 인자 : 새로운 요소를 삽입할 위치
    - 두번째 인자 : 새로운 요소값

리스트에서 특정 요소 삭제하기

  • del 키워드와 리스트에서 제거하고 싶은 값의 인덱스를 사용하면 리스트의 특정 위치의 요소를 제거할 수 있음
  • 추가로 del 리스트명만 입력하면 리스트 자체를 제거할 수 있음
    # day에서 '낮잠'을 삭제
    day = ['아침', '점심', '낮잠', '저녁', '야식']
    del day[2]
    print(day) # ['아침', '점심', '저녁', '야식']​
  • remove()를 이용하면 리스트에 있는 특정 요소의 값을 이용해 그 요소를 제거할 수 있음
    day = ['아침', '점심', '낮잠', '저녁', '야식']
    # day에서 '낮잠'을 삭제
    day.remove('낮잠')
    print(day) # ['아침', '점심', '저녁', '야식']​

리스트 요소 무작위로 섞기

  • shuffle()을 사용하면 리스트의 요소를 무작위로 섞을 수 있음
  • shuffle()을 사용하기 위해서는 먼저 random 모듈에서 shuffle을 import해야 하고 shuffle()을 사용하면 원본 리스트가 변경됨
    from random import shuffle
    
    listdata = [1, 2, 3, 4, 5]
    # listdata의 요소를 무작위로 섞음
    shuffle(listdata)
    print(listdata) # [1, 5, 2, 3, 4]

리스트의 모든 요소를 인덱스와 쌍으로 추출하기

  • enumerate()는 시퀀스 자료형을 인자로 받아 각 요소를 인덱스와 함께 쌍으로 추출할 수 있는 enumerate 객체를 리턴함
  • 이 객체를 리스트형으로 변환하기 위해서는 list(enumerate(리스트명))와 같이 list()를 이용함
    meals = ['아침', '아점', '점심', '저녁', '야식']
    # meals의 모든 요소를 인덱스와 쌍으로 추출
    ret = list(enumerate(meals))
    print(ret)
    
    # enumerate와 for문 사용
    for i, meal in enumerate(meals):
        print('하루 %d끼: %s' %(i, meal))
    '''
    [(0, '아침'), (1, '아점'), (2, '점심'), (3, '저녁'), (4, '야식')]
    하루 0끼: 아침
    하루 1끼: 아점
    하루 2끼: 점심
    하루 3끼: 저녁
    하루 4끼: 야식
    '''​

리스트의 요소가 모두 참/거짓인지 확인하기

  • 리스트의 모든 요소가 참인지 또는 모든 요소가 거짓인지 판단해야 하는 경우, 파이썬 내장함수 all() 또는 any()를 사용, 여기서 True란 숫자의 경우 1을 뜻함
    - all() : 인자로 입력되는 리스트의 모든 요소가 참인 경우 True, 거짓이 하나라도 포함되어 있을 경우 False를 리턴
    - any(): 인자로 입력되는 리스트의 모든 요소가 거짓인 경우 False, 참이 하나라도 포함되어 있을 경우 True를 리턴
  • 파이썬에서 거짓은 False 외에도 다음의 값들로도 표현할 수 있음(비어있으면 False라는 뜻)
    - 숫자 0
    - 빈 문자열 '', ""
    - 빈 리스트 []
    - 빈 튜플 ()
    - 빈 사전 {}

 [13 사전] 

사전에 요소 추가하기

  • 사전에 새로운 요소를 추가하기 위해서는 키와 값을 함께 추가해야 함
    # 영어 단어로 구성된 english 리스트 선언
    english = ['abandon', 'ablaze', 'abnormality', 'abolish']
    # 영어 단어 뜻으로 구성된 korean 리스트를 선언
    korean = ['버리다', '불타는', '변칙', '폐지하다']
    # 비어있는 vocab 사전을 선언
    vocab = {}
    # english 리스트의 인덱스와 요소를 각각 i와 k에 순서대로 저장
    for i, k in enumerate(english):
        # korean 리스트의 요소값을 val 변수에 순서대로 저장합니다. (val = '버리다')
        val = korean[i]
        # vocab 사전에 english 리스트의 요소를 키로, korean 리스트의 요소를 값으로 추가합니다.
        vocab[k] = val
    
    print(vocab) # {'abandon': '버리다', 'ablaze': '불타는', 'abnormality': '변칙', 'abolish': '폐지하다'}​
  • 사전의 요소를 삭제할 때는 del 딕셔너리명['키 이름']의 형식을 사용하고 모든 요소를 제거하려면 딕셔너리명.clear()를 사용

사전에서 키만 추출하기

  • keys()를 이용하면 사전에서 모든 키를 추출할 수 있음
  • 주의할 점은 keys()는 사전의 모든 키를 객체 형태로 출력하기 때문에 리스트의 형태로 변형하고 싶을 경우에는 list()를 사용해야 함
    # 세 개의 키:값으로 구성된 사전을 선언
    dict_data = {'이름':'엘리스','나이': 2, '취미':'코딩'}
    # 사전의 모든 키를 추출하여 ks에 객체 형태로 저장
    ks = dict_data.keys()
    # 객체 형태의 ks를 리스트형으로 변경
    ks_list = list(ks)
    # 사전의 모든 키를 담고 있는 리스트를 출력
    print(ks_list) # ['이름', '나이', '취미']

사전에서 값만 추출하기

  • values()를 이용하면 사전에서 모든 값을 추출할 수 있음
  • keys()와 마찬가지로 values()는 사전의 모든 키를 객체 형태로 출력하기 때문에 리스트의 형태로 변형하고 싶을 경우에는 list()를 사용해야 함
    # 세 개의 키:값으로 구성된 사전을 선언
    dict_data = {'이름':'엘리스','나이': 2, '취미':'코딩'}
    # 사전의 모든 값을 추출하여 ks에 객체 형태로 저장
    vals = dict_data.values()
    # 객체 형태의 ks를 리스트형으로 변경
    vals_list = list(vals)
    # 사전의 모든 값을 담고 있는 리스트를 출력
    print(vals_list) # ['엘리스', 2, '코딩']

사전 요소를 모두 추출하기

  • items()를 이용하면 사전에서 모든 요소를 추출할 수 있음
  • 마찬가지로 items()는 사전의 모든 키를 객체 형태로 출력하기 때문에 리스트의 형태로 변형하고 싶을 경우에는 list()를 사용해야 함
    # 세 개의 키:값으로 구성된 사전을 선언
    dict_data = {'이름':'엘리스','나이': 2, '취미':'코딩'}
    # 사전의 모든 값을 추출하여 ks에 객체 형태로 저장합니다.
    items = dict_data.items()
    # 객체 형태의 ks를 리스트형으로 변경
    items_list = list(items)
    # 사전의 모든 값을 담고 있는 리스트를 출력
    print(items_list) # [('이름', '엘리스'), ('나이', 2), ('취미', '코딩')]​

사전 정렬하기

  • 사전은 기본적으로 시퀀스 자료형이 아니지만 sorted()를 사용하면 사전을 인자로 입력받아 정렬할 수 있음
  • sorted()는 기본적으로 사전의 키를 오름차순으로 정렬한 결과를 리스트로 리턴
  • reverse=True를 두번째 인자로 입력하면 내림차순으로 정렬한 결과를 받을 수 있음
  • 값이나 모든 요소를 정렬하고 싶은 경우 각각 values()와 items()를 사용하면 됨
    # 세 개의 키:값으로 구성된 사전을 선언
    channels = {'tvn':16, 'jtbc':15, 'ocn':41}
    # channels의 키를 오름차순으로 정렬
    print(sorted(channels))
    # channels의 키를 내림차순으로 정렬
    print(sorted(channels, reverse=True))
    # channels의 값을 오름차순으로 정렬
    print(sorted(channels.values()))
    # channels의 모든 요소를 내림차순으로 정렬
    print(sorted(channels.items(), reverse=True))
    '''
    ['jtbc', 'ocn', 'tvn']
    ['tvn', 'ocn', 'jtbc']
    [15, 16, 41]
    [('tvn', 16), ('ocn', 41), ('jtbc', 15)]
    '''​
  • 참고로 딕셔너리에 items() 메서드를 사용해주면 {"key" : value}의 형태를 [(key, value)]의 형태로 만들어 주는데 이를 sorted 해주면 key값을 기준으로 오름차순으로 정렬해주기 때문에 value값으로 정렬하려면 lambda를 사용해야 함
  • 정렬된 list값을 다시 dictionary로 바꿔주려면 dict()메서드를 마지막에 써주면 됨
    sorted(d.items(), key=lambda x : x[1])
    dict(sorted(d.items(), key=lambda x : x[1]))​
    출처: https://velog.io/@kylexid/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%9E%90%EB%A3%8C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0

 [14 응용편] 

lambda 함수 사용하기

  • lambda 함수는 일반적인 함수 정의 방법과 다르게 함수이름이 없고, 한줄로 간단하게 정의되는 함수
  • lambda 함수를 정의하는 방법은 : lambda 인자, 인자, ... : 실행 코드
  • 일반적인 함수에서 결괏값을 리턴할 때 return을 사용하지만 lambda 함수에서는 return을 입력하지 않고 리턴하고 싶은 결괏값을 : 이후에 입력
    # 문자열을 리턴하는 일반적인 함수 func1를 정의
    def func1(name, age):
        return '이름: %s \n나이: %d' %(name, age)
    # 일반적인 함수 func1를 실행
    print(func1('엘리스', 2))
    # 동일한 함수를 lambda 함수 func2로 정의
    func2 = lambda name, age: '이름: %s \n나이: %d' %(name, age)
    # lambda 함수 func2를 실행
    print(func2('엘리스', 2))
    # 이름: 엘리스 
    # 나이: 2
  • .sort와 sorted()의 key에 lambda 사용하기
    a = [(1, 2), (0, 1), (5, 1), (5, 2), (3, 0)]
    
    # 인자없이 그냥 sorted()하면 리스트 아이템의 각 요소 순서대로 정렬
    b = sorted(a)
    print(b) # [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
    
    # key 인자에 lambda 함수를 사용하면 해당 함수의 반환값을 비교하여 순서대로 정렬
    c = sorted(a, key = lambda x : x[0])
    print(c) # [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
    d = sorted(a, key = lambda x : x[1])
    print(d) # [(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)]
    
    # 아이템 첫 번째 인자를 기준으로 오름차순으로 먼저 정렬하고,
    # 그 안에서는 두 번째 인자를 기준으로 내림차순 정렬
    e = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)]
    f = sorted(e, key = lambda x : (x[0], -x[1]))
    print(f) # [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]​
     출처: https://velog.io/@aonee/Python-%EC%A0%95%EB%A0%AC-sort-sorted-reverse

map 함수 사용하기

  • 파이썬 내장 함수 map()은 집합 A와 함수 f가 주어지면 집합 B를 쉽게 구해주는 함수와 동일한 역할을 함
  • map(f, A)와 같이 map()의 첫번째 인자로 함수를, 두번째 인자로 f에 대입할 집합을 입력하면, A의 모든 요소를 f에 대입한 결과를 얻을 수 있음
  • 이때 리턴되는 객체는 map 객체이기 떄문에 list()를 이용해 리스트로 변환할 수 있음
    # x를 인자로 받아 x+1를 리턴하는 lambda 함수를 f에 저장
    f = lambda x: x+1
    # f에 대입할 집합 A를 선언
    A = [1, 2, 3]
    # A의 모든 요소를 f에 대입 
    ret = map(f, A)
    # ret을 리스트로 변환하여 출력 
    print(list(ret)) # [2, 3, 4]​

텍스트 파일을 읽고 출력하기

  • 텍스트 파일을 읽고 그 내용을 화면에 출력하고자 하면 우선 텍스트 읽기 모드로 파일을 열어야 함, 이때 사용되는 파이썬 내장 함수는 open()
  • open() 함수는 파일 이름과 파일 열기 모드를 입력값으로 받고 파일 객체를 변수에 반환함
  • 변수 = open('파일 이름', '파일 열기 모드')
  • 파일 열기 모드에는 r과 w가 주로 사용됨
    - r : 읽기모드로 파일을 읽을 때 사용
    - w : 쓰기모드로 파일에 내용을 쓸 때 사용
  • 텍스트 파일을 열고 변수에 저장한 이후에는 read()를 이용하여 텍스트 파일 내의 모든 내용을 읽어와 또 다른 변수에 저장할 수 있음
  • 파일에 대한 처리가 모두 끝나면 close()를 이용해 파일을 닫습니다.
    # 엘리스 플랫폼에 업로드된 텍스트 파일 iu_palette.txt를 읽기 모드로 열고 f에 저장
    f = open('iu_palette.txt', 'r')
    # f에 저장된 iu_palette.txt를 읽고 내용을 출력
    data = f.read()
    print(data)
    '''
    이상하게도 요즘엔 
    그냥 쉬운 게 좋아
    ...
    I got this. I'm truly fine
    이제 조금 알 것 같아 날
    '''
    # 파일을 닫음
    f.close()​

텍스트 파일을 한 줄씩 읽고 출력하기

  • 텍스트 파일의 용량이 매우 클 경우에는 read()로 한꺼번에 파일 내용을 읽어들이면 메모리 문제를 야기할 수 있음
  • 이 경우 readline()을 사용해 텍스트 파일 내용을 한 줄 단위로 읽어오면 됨
  • 한줄을 읽고 나면 파일을 읽기 시작하는 위치는 그 다음 줄의 맨 처음이 됨, 파일의 끝에서 더 이상 읽을 내용이 없으면 readline()은 빈 문자열을 리턴
    # iu_palette.txt를 읽기 모드로 열고 f에 저장
    f = open('iu_palette.txt', 'r')
    # f에 저장된 iu_palette.txt의 한 줄을 읽고 내용을 출력
    line1 = f.readline()
    print(line1) # 이상하게도 요즘엔
    # f에 저장된 iu_palette.txt의 다음 줄을 읽고 내용을 출력
    line2 = f.readline()
    print(line2, end='') # 그냥 쉬운 게 좋아
    # 파일을 닫음
    f.close()​
  • 텍스트 파일을 한줄씩 읽는 또 다른 방법은 파일 readlines()를 이용하는 것
  • readlines()는 텍스트 파일의 끝까지 한줄씩 읽고 각 줄을 리스트의 원소로 리턴
    # iu_palette.txt를 읽기 모드로 열고 f에 저장
    f = open('iu_palette.txt', 'r')
    # f에 저장된 iu_palette.txt의 내용을 읽고 lines에 리스트 형태로 저장
    lines = f.readlines()
    # 리스트 형태로 저장된 iu_palette.txt 내용을 출력
    print(lines) # ['이상하게도 요즘엔 \n', '그냥 쉬운 게 좋아\n', '하긴 그래도 여전히 \n', '코린 음악은 좋더라\n', ..., "I got this. I'm truly fine\n", '이제 조금 알 것 같아 날']
    # 파일을 닫음
    f.close()​

파일을 열고 자동으로 닫기

  • 파일을 다룰 때는 open(), close()로 파일을 열고 닫아야 함
  • 프로그래밍을 할 때 가끔 파일을 열고 난 후 파일을 닫지 않고 코드를 작성하는 경우가 있는데 with open() as를 사용하면 파일에 대한 처리가 끝나면(구문을 나오면) 자동으로 파일을 닫을 수 있음
  • with open('파일 이름', '파일 열기 모드') as 변수명:
        파일 처리 코드
    # iu_palette.txt를 읽기 모드로 열고 f에 저장한 후 자동으로 닫음
    with open('iu_palette.txt', 'r') as f:
        # f에 저장된 iu_palette.txt의 내용을 읽고 리스트 형태로 출력
        print(f.readlines()) # ['이상하게도 요즘엔 \n', '그냥 쉬운 게 좋아\n', '하긴 그래도 여전히 \n', '코린 음악은 좋더라\n', ..., "I got this. I'm truly fine\n", '이제 조금 알 것 같아 날']​

파일의 특정 부분만 읽기

  • open()으로 파일을 열면 파일을 읽거나 쓰는 위치는 파일의 가장 첫 부분으로 고정됨, 하지만 실제 코드를 작성할 때 파일의 특정 부분이나 특정 용량만큼 읽어야 하는 경우가 많음
  • 이럴 때 seek()을 이용하면 파일의 특정 부분으로 파일을 읽는 위치를 이동시키고 해당 위치부터 일정 크기만큼 읽을 수 있으며, read()의 인자로 정수를 입력하면 읽을 크기를 지정할 수 있음
    # stockcode.txt를 읽기 모드로 열고 f에 저장
    f = open('stockcode.txt', 'r')
    # stockcode.txt의 10 바이트 위치부터 파일을 읽기 시작
    f.seek(10)
    # 21 바이트 만큼 파일을 읽고 그 내용을 data에 저장 
    data = f.read(21)
    # 10 바이트부터 21 바이트 만큼 읽은 내용을 출력
    print(data)
    '''
    화약품
    000040 S&T모터스
    000
    '''
    # 파일을 닫음
    f.close()​

현재 시간 출력하기

  • 파이썬의 time 모듈은 시간과 관련되어 있는 다양한 함수들을 제공함, 그중 localtime()은 현재 서버 시간을 time.struct_time 형식의 데이터로 리턴
  • localtime()의 리턴값을 변수에 저장하고 인덱싱을 사용하면 현재 날짜, 시간 등을 접근할 수 있음
    - 인덱스0 : tm_year (현재 년도)
    - 인덱스1 : tm_mon (현재 월)
    - 인덱스2 : tm_mday (현재 날짜)
    - 인덱스3 : tm_hour (현재 시간)
    - 인덱스4 : tm_min (현재 분)
    - 인덱스5 : tm_sec (현재 초)
    - 인덱스6 : tm_wday (현재 요일)
    - 인덱스7 : tm_yday (1월 1일부터 현재까지 날짜수)
    - 인덱스8 : tm_isdst (섬머타임 적용 여부)
    # time 모듈에서 localtime() 함수를 호출
    from time import localtime
    # time.struct_time 형식의 현재시간을 current_time에 저장
    current_time = localtime()
    # time.struct_time 형식의 현재시간을 출력
    print(current_time)
    # 인덱싱을 사용해 time.struct_time에서 현재 년도, 월, 날짜를 출력
    print(current_time[0], current_time[1], current_time[2])
    # 2022 02 07​

프로그램 실행 시간 계산하기

  • datetime 모듈의 datetime 객체를 사용하면 날짜와 시간을 단순하게 처리할 수 있습니다.

    그중 datetime 객체의 now() 함수는 현재 시간을 1/10000000초 단위까지 계산하여 표시해줍니다.

    현재 시간을 두 번 측정하고 두 값의 차이를 이용하면 코드의 특정 부분이 실행되는데 소요되는 시간을 계산할 수 있습니다.
    # 1. datetime 모듈에서 datetime 객체를 호출
    from datetime import datetime
    # 2. 현재 시간을 측정하여 start에 저장
    start = datetime.now()
    # 실행할 코드
    ret = 0
    for i in range(100000):
        ret += i
    # 3. 현재 시간을 다시 측정하여 end에 저장
    end = datetime.now()
    # 4. start와 end에 저장된 두 시간의 차이를 계산하고 elapsed에 저장
    elapsed = end-start
    print('1에서 100000까지 더한 결과: %d' %ret) # 1에서 100000까지 더한 결과: 4999950000
    print('총 계산 시간:', elapsed) # 총 계산 시간: 0:00:00.010338​