[08 클래스]
클래스(class)
- 하나의 클래스를 가지고 여러 개의 객체를 만들 수 있음
- 만들어진 객체들은 서로 아무런 영향을 주지 않음
- 클래스 멤버 : 클래스에서 변수와 같은 역할
클래스 메소드: 클래스에서 함수와 같은 역할
- 파이썬에서 클래스 메소드의 인자는 self를 관습적으로 사용해 객체를 전달class MyClass: var = '클래스 멤버' def func(self): print('클래스 메소드')
클래스 멤버와 인스턴스 멤버
- 클래스 멤버 : 객체간 서로 공유되는 변수
- 인스턴스 멤버 : 객체별로 고유한 값을 저장하는 변수
인스턴스 멤버는 self.멤버이름을 통해 선언할 수 있음(특정 객체의 멤버이기 때문에 이러한 형식으로 선언)
- brand, model 값은 KiaK3 클래스를 통해서 생성되는 모든 객체가 공유class KiaK3: brand = '기아' #클래스 멤버 model = 'K3' #클래스 멤버 def owner(self, name): self.name = name #인스턴스 멤버
- 반면 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()메서드를 마지막에 써주면 됨
출처: 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%B0sorted(d.items(), key=lambda x : x[1]) dict(sorted(d.items(), key=lambda x : x[1]))
[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 사용하기
출처: https://velog.io/@aonee/Python-%EC%A0%95%EB%A0%AC-sort-sorted-reversea = [(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)]
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
'코딩 테스트 스터디 > 엘리스 이론 강의' 카테고리의 다른 글
실습으로 배우는 파이썬 上 (프로그래밍 첫발 내딛기~모듈) (0) | 2022.02.01 |
---|---|
도레미 파이썬 Vol.2 (0) | 2022.01.26 |
도레미 파이썬 Vol. 1 (0) | 2022.01.25 |