본문 바로가기
프로그래밍/Python

[AI 부트캠프] DAY 9 - 파이썬 3

by HOHHOH 2023. 7. 28.

[오늘의 일지]

파이썬 익숙해지기 - 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 methodself 변수를 이용하여 객체를 구분합니다.

- selfClass 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

 

모듈과 패키지

- 모듈 : 모듈은 여러 변수와 함수를 가지고 있는 집합을 의미합니다.

- 내부 모듈 : 내부 모듈은 파이썬에 기본적으로 내장되어 있는 모듈입니다. 다양한 내부 모듈 존재하는데 파이썬 공식 홈페이지를 참고하시면 좋습니다.

 

The Python Standard Library

While The Python Language Reference describes the exact syntax and semantics of the Python language, this library reference manual describes the standard library that is distributed with Python. It...

docs.python.org

- 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()

colab에서 예시의 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)

 

swarmplot() 실행결과

- 패키지 

패키지는 모듈이 모여서 구조를 이룬 것을 의미한다

도트(.)를 사용하여 파이썬 모듈을 디렉터리 구조로 관리할 수 있게 해 줍니다.

(모듈 이름이 A.b인 경우, A는 패키지이고 b는 A패키지의 b모듈 의미)

 

코딩 공부하기 좋은 사이트

LeetCode

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Futureskill

 

퓨처스킬

매일 함께 성장하는 커뮤니티

futureskill.io

programmers

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

HackerRank

 

HackerRank - Online Coding Tests and Technical Interviews

HackerRank is the market-leading technical assessment and remote interview solution for hiring developers. Start hiring at the pace of innovation!

www.hackerrank.com

Codility

 

Codility: Online Coding Tests & Technical Interviews

The #1 rated coding test & interview platform. Test developer skills with online coding interviews and create programming assessments to hire developers.

www.codility.com

[마무리]

 오늘 수업은 어떻게 보면 다소 생소할 수 있는 내용들이 많았습니다. 처음 보는 입장에서는 아직 다 이해하지 못한 느낌을 많이 받았는데 그래도 뭔가 이제 본격적으로 파이썬을 가지고 무언가 시작하는 것 같습니다. 특히 오늘 배운 파트 중에 모듈 부분에서 파이썬의 다양한 라이브러리를 가지고 데이터 분석 예시를 실행해 보는 것을 통해서 데이터 사이언스라는 분야에 대해 좀 더 흥미가 생기는 느낌도 받은 거 같습니다. 

 

반응형

댓글