[오늘의 일지]
파이썬 익숙해지기 - Input/Output, OOP, 클래, 모듈과 패키지
[상세 내용]
파이썬 익숙해지기
Input/Output
- I/O : Input/Output의 약자로 컴퓨터가 데이터를 입력받고 출력하는 모든 작업을 의미합니다. 프로그램 입장에서 들어오는 모든 데이터를 Input, 나가는 모든 데이터를 Output이라고 합니다. 메인 메모리 입장에서 생각하는 들어오고 나가는 모든 데이터에 대해서 I/O 처리라고 부릅니다. (단, CPU와의 소통은 제외)
- STDIN / STDOUT (Standard IN, Standard OUT)
파이썬은 input()을 통해서 stdin을 사용자로부터 입력받을 수 있다.
파이썬은 print()를 통해서 stdout을 사용자에게 출력할 수 있다.
# a에 키보드로 입력받은 값을 할당하고 출력해본다.
a = input()
a, type(a)
>>>
10
('10', str)
# 입력받는 값을 숫자라고 가정한 경우.
n = int(input())
n, type(n)
>>>
10
(10, int)
# 입력받는 값을 숫자라고 가정했는데 문자열이 들어오면 에러가 난다. 이 경우는 type casting이 실패한 경우이다.
#n = int(input())
n = int(input())
n + 2
>>>
10
12
- File I/O : 프로그램은 메인 메모리 상에서 존재하기 때문에, 스토리지로부터 파일을 불러오는 것도 input이고, 프로그램의 결과를 스토리지에 저장하는 것도 output입니다. (file에는 txt, png, json, xlsx 등 여러 가지 종류가 있습니다.)
# filein/fileout example
with open("data/a.txt", 'r') as f:
data = f.readlines()
# 파이썬에서는 with open() 함수를 통해서 텍스트 파일을 쉽게 불러올 수 있습니다.
# ‘r’, ‘w’, ‘a’ 등의 mode를 바꿔서 파일을 다른 옵션으로 열 수 있다. (read, write, append순)
#다른 타입의 파일을 열기 위해선 다른 라이브러리들이 필요합니다.
# e.g. csv, excel 파일을 열기 위해 pandas, csv, openpyxl 라이브러리를 사용할 수 있다.
# e.g. png, jpg 파일을 열기 위해 PIL, opencv 라이브러리를 사용할 수 있다.
# e.g. pk, pkl 파일을 열기 위해 pickle 라이브러리를 사용할 수 있다. (파일 타입이 binary라서, ‘rb’를 써야함)
# I/O가 데이터 처리를 할 때 가장 느린 파트이기 때문에 신경써줘야 합니다.(performance bottleneck)
OOP
- OOP : Object-Oriented Programming의 약자로 객체(Object)를 기반으로 프로그램을 만드는 방법론입니다.
- 개념의 추상화(abstraction) : OOP는 실제 세상을 표현하고 있는, 여러 가지 개념들을 프로그램으로 옮겨서 구현할 수 있기 위한 콘셉트의 프로그래밍 패러다임(paradigm)입니다.
- 객체(object)라는 개념은 실제 사물 하나하나를 의미할 수 있고, 이러한 사물들이 공유하는 속성을 정의한 것을 클래스(Class)라고 합니다.
- 기존 방식은 데이터(변수, variable)와 데이터를 처리하는 기능(함수, function)이 독립적이었지만, OOP는 이를 하나의 개념(Class)으로(Class) 묶어서 생각하기 때문에 그 객체가 처리되는 기능을 자연스럽게 정의할 수 있습니다.
- Class에는 Class를 기술하는 정보를 나타내는 변수인 Class variable과과 Class의 특징을 설명하는 기능인 Class method를 포함합니다.
- 개념의 구체화(instantiation) : 추상적인 개념 Class를 실제로 사용하려면 하나하나의 개별 사물로 만들어야 하는데, 이를 개별 사물인 객체(object)라고 합니다.
- OOP의 장점
- 생산성 향상 : 클래스 구조를 잘 설계하면 라이브러리 형태로 재사용이 쉬워진다.
- 자연적인 모델링 : 일상생활에 존재하는 개념을 그대로 프로그램에 구현 가능하다.
- 재사용성 증가 : 클래스의 상속의 개념 때문에, 프로그래밍 자체의 재사용성이 극대화된다.
- 유지보수 용이성 증가 : OOP를 이용하여 개발을 하게 되면,, 다른 기능을 수정하더라도 클래스가 서로 다르게 구현되어 있어 다른 기능에 끼치는 영향이 매우 적어질 수 있다.
클래스
- 클래스(Class) : 클래스를 이용해서 구현하려는 개념을 객체(object)의 형태로 찍어낼 수 있습니다.
- 객체(object) : 클래스로 만들어진 모든 것을 의미합니다. 객체는 객체마다 고유한 성질을 가지고 동일한 클래스로 만든 객체들은 서로 영향을 주지 않습니다.
- 객체와 인스턴스 : 인스턴스는 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용합니다. 보통 클래스 기반으로 만들어진 객체를 인스턴스라고 부릅니다. 클래스 인스턴스를 생성하려면 클래스 이름 뒤에 () 괄호를 적으면 됩니다.
인스턴스 이름 = 클래스 이름()
- 구현하려는 대상의 특성을 Class variable로, 대상이 수행해야 하는 일을 Class method로 구현해야 합니다.
- Constructor(생성자)를 통해서 객체를 찍어내는 틀을 정의할 수 있습니다.
# Python Class example
class Human(superclass): # 상속을 받고 싶을 때, 상속받을 클래스 이름을 파라미터로 지정.
def __init__(self, name, weight): # Constructor
self.name = name
self.weight = weight
...
def gain_weight(self, a, b):
tmp_weight = self.weight + a
<statement>
...
return tmp_weight
>>> object1 = Human("Kim", 70) # class_name() : __init__ method call
>>> object1.name
>>> "Kim"
>>> object1.gain_weight(5, 7)
>>> 75
- 생성자는 __init__() 함수를 이용하여 구현합니다.
- 구현되는 객체는 self self라는 자체 변수를 가집니다. self는 말 그대로 객체 자기 자신을 지칭합니다.
- self 변수를 통해서 모든 객체는 자기 자신을 구분할 수 있습니다.
- Class method도 self 변수를 이용하여 객체를 구분합니다.
- self는 Class variable이기 때문에 하나의 ClassClass 내에서 통용됩니다.
- Class도 역시 재사용성을 고려하여 디자인되어야 합니다.
- Class로 구현할 때 제일 중요한 포인트는 “어떤 특성과 어떤 기능을 구현할 것인가"입니다.
- 상속
- 상속 선언
자식 클래스를 선언할 때 소괄호로 부모 클래스를 포함
그러면 자식 클래스에서는 부모 클래스의 속성과 메서드는 따로 기재하지 않아도 자동 포함
- 메서드 오버라이딩
부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것
- 일반적인 메서드 오버라이딩
자식 클래스에서 생성된 객체의 메서드를 부르면 부모 클래스의 메서드는 무시한다.
- 부모 메서드 호출
부모 클래스의 메서드도 수행하고 자식 클래스의 메서드도 함께 수행하고 싶을 때 사용한다.
super() 키워드 사용하여 자식 클래스 내에서 부모 클래스 호출 가능하다
# 부모 클래스 선언 예시
class Jelly :
def __init__(self, color, taste):
self.color = color
self.taste = taste
def print_info(self):
print("부모 클래스입니다.")
print("젤리")
# 자식 클래스 선언 예시
# 자식 클래스를 선언할 때 소괄호로 부모 클래스를 포함
# 일반적인 메소드 오버라이딩
# 자식 클래스에서 생성된 메소드로 부모 클래스의 메소드 무시
class TeddyBearJelly(Jelly):
def print_info(self):
print("자식 클래스입니다.")
print("곰돌이 젤리")
print("Taste : ", self.taste)
print("Color : ", self.color)
# 자식 클래스 선언
# 자식 클래스를 선언할 때 소괄호로 부모클래스를 포함
# 부모 메소드 호출
# super() 키워드를 사용하여 자식 클래스에서 부모 클래스 호출 가능
class HeartJelly(Jelly):
def print_info(self):
super().print_info()
print("자식 클래스입니다.")
print("하트 젤리")
print("Taste : ", self.taste)
print("Color : ", self.color)
# 부모 클래스로 객체 생성
# 부모 클래스의 print_info() 함수
red_jelly = Jelly("red", "strawberry")
red_jelly.print_info()
>>>
부모 클래스입니다.
젤리
# 자식 클래스로 객체 생성
# 자식 클래스의 print_info() 함수
# 자식 클래스에서 생성된 메소드로 부모 클래스의 메소드 무시
yellow_jelly = TeddyBearJelly("yellow", "lemon")
yellow_jelly.print_info()
>>>
자식 클래스입니다.
곰돌이 젤리
Taste : lemon
Color : yellow
# 자식 클래스로 객체 생성
# 자식 클래스의 print_info() 함수
# super() 키워드를 사용하여 자식 클래스에서 부모 클래스 호출 가능
green_jelly = HeartJelly("green", "apple")
green_jelly.print_info()
>>>
부모 클래스입니다.
젤리
자식 클래스입니다.
하트 젤리
Taste : apple
Color : green
- 다중 상속 : 자식 클래스를 선언할 때 소괄호로 원하는 부모클래스를 모두 포함할 수 있습니다. (다중 상속의 개수 제한 없음)
class 부모 클래스1:
pass
class 부모 클래스2:
pass
class 자식 클래스(부모 클래스1, 부모 클래스2):
pass
모듈과 패키지
- 모듈 : 모듈은 여러 변수와 함수를 가지고 있는 집합을 의미합니다.
- 내부 모듈 : 내부 모듈은 파이썬에 기본적으로 내장되어 있는 모듈입니다. 다양한 내부 모듈 존재하는데 파이썬 공식 홈페이지를 참고하시면 좋습니다.
- import 구문 : import는 모듈 전체를 가져올 때 사용
# 파이썬 math 모듈은 수학 함수가 담겨있음
# 모듈을 사용할 때는 모듈 뒤에 도트(.) 입력하고 원하는 변수나 함수를 입력
import math
print(math.floor(1.2))
print(math.ceil(1.2))
>>>
1
2
- from 구문 : from은 모듈 내에서 필요한 것만 골라서 가져올 때 사용
# floor(내림), ceil(올림) 함수만 선택
# 모듈을 사용할 때는 원하는 변수나 함수만 입력
from math import floor, ceil
print(floor(1.2))
print(ceil(1.2))
>>>
1
2
- as 구문 : as는 모듈의 별칭을 붙일 때 사용
# 모듈을 사용할 때는 모듈 별칭 뒤에 도트(.) 입력하고 원하는 변수나 함수를 입력
import math as m
print(m.floor(1.2))
print(m.ceil(1.2))
>>>
1
2
- 외부 모듈 : 외부 모듈은 파이썬에서 기본적으로 제공해 주는 것이 아닌 외부 사람들이 만들어서 배포한 모듈
- seaborn 모듈 실습 : seaborn은 데이터 시각화 라이브러리로 고급 인터페이스를 제공합니다.
모듈 설치하기
pip는 특정 버전의 모듈을 설치하거나 설치한 모듈을 제거할 때 사용합니다.
지금 실습에서 사용하고 있는 google colab은 대부분의 모듈이 설치되어 있습니다.
pip install 모듈 이름
모듈 불러오기
import 구문을 통해 모듈 불러오기
as 구문으로 별칭 지정하기
# seaborn 불러와서 별칭 sns로 사용
import seaborn as sns
데이터 불러오기
seaborn 라이브러리에서 제공하는 titanic 데이터 불러오기
seaborn의 load_dataset() 함수를 이용
# titanic 데이터 불러오기
titanic = sns.load_dataset('titanic')
데이터 파악
head( ) 함수 : titanic 데이터 상단 5개의 행 확인
info( ) 함수 : 행과 열의 크기, 칼럼명, 결측치, 데이터 타입 확인
# titanic 데이터 내용 확인
# .head() : 데이터의 상단 5개 행 출력
titanic.head()
# .info() :데이터에 대한 전반적인 정보 제공
# 행과 열의 크기, 컬럼명, 컬럼별 결측치, 컬럼별 데이터 타입
print(titanic.info())
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 survived 891 non-null int64
1 pclass 891 non-null int64
2 sex 891 non-null object
3 age 714 non-null float64
4 sibsp 891 non-null int64
5 parch 891 non-null int64
6 fare 891 non-null float64
7 embarked 889 non-null object
8 class 891 non-null category
9 who 891 non-null object
10 adult_male 891 non-null bool
11 deck 203 non-null category
12 embark_town 889 non-null object
13 alive 891 non-null object
14 alone 891 non-null bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB
None
- 데이터 시각화
swarmplot( ) 함수 : 데이터의 분산까지 고려하여 데이터 포인트가 서로 중복되지 않도록 시각화. 즉, 데이터가 퍼져 있는 정도를 입체적으로 파악 가능
swarmplot( ) 함수의 매개변수 : x축 변수, y축 변수, 데이터 셋, hue (특정 열 데이터로 색상을 구분하여 출력)
# 이산형 변수의 분포 - 데이터 분산 고려 (중복 X)
# x축 변수, y축 변수, 데이터 셋, 성별로 색상 구분
sns.swarmplot(x='class', y='age', data=titanic, hue='sex')
>>>
<Axes: xlabel='class', ylabel='age'>/usr/local/lib/python3.10/dist-packages/seaborn/categorical.py:3544: UserWarning: 15.2% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
warnings.warn(msg, UserWarning)
- 패키지
패키지는 모듈이 모여서 구조를 이룬 것을 의미한다
도트(.)를 사용하여 파이썬 모듈을 디렉터리 구조로 관리할 수 있게 해 줍니다.
(모듈 이름이 A.b인 경우, A는 패키지이고 b는 A패키지의 b모듈 의미)
코딩 공부하기 좋은 사이트
LeetCode
Futureskill
programmers
HackerRank
Codility
[마무리]
오늘 수업은 어떻게 보면 다소 생소할 수 있는 내용들이 많았습니다. 처음 보는 입장에서는 아직 다 이해하지 못한 느낌을 많이 받았는데 그래도 뭔가 이제 본격적으로 파이썬을 가지고 무언가 시작하는 것 같습니다. 특히 오늘 배운 파트 중에 모듈 부분에서 파이썬의 다양한 라이브러리를 가지고 데이터 분석 예시를 실행해 보는 것을 통해서 데이터 사이언스라는 분야에 대해 좀 더 흥미가 생기는 느낌도 받은 거 같습니다.
'프로그래밍 > Python' 카테고리의 다른 글
[AI 부트캠프] DAY 11 - 파이썬 5 (0) | 2023.08.01 |
---|---|
[정보] 파이썬 코딩 연습하기 좋은 사이트 5가지 추천 (0) | 2023.07.30 |
[AI 부트캠프] DAY 10 - 파이썬 4 (0) | 2023.07.29 |
[AI 부트캠프] DAY 8 - 파이썬 2 (0) | 2023.07.27 |
[AI 부트캠프] DAY 7 - 파이썬 1 (0) | 2023.07.26 |
댓글