Language/Python

TIL-파이썬[판다스,모듈,클래스]리눅스/Python[Pandas,Module,Class],Linux

청렴결백한 만능 재주꾼 2020. 4. 27. 18:44
반응형

굿모닝 좋은 아침이다. 익숙지 않은 카드 챙김 때문에 집을 다시 돌아갔다 왔는데 내일부턴 잘 챙겨야겠다는 교훈을 준 해프닝이라고 생각하자. 좋은 아침이지만 지각한 아침부터 배워볼 것은 클라스. 예전에 했던 OOP인데 다시 복습한다 생각하고 해 보자.. 어제 하던 pandas 좀 있다가 해보자.

 

OOP(Objdect Oriented Programming,객체 지향 프로그래밍)

Class

>>>class 이태원:

>>>    def __init__(self,name,job,status):   #-->> 넣고 싶은 파라미터 넣기

>>>        self.name  = name
>>>        self.job = job
>>>        self.status = status

>>>    def introduce(self):

>>>        return "안녕하세요. {}입니다.저는 {}입니다. 그리고 현재 {} 을/를 맡고 있습니다.".format(self.name,self.job,self.status)

 

이태원이란 class를 만들어 보았다.

 

introduce -->>  Method

이름, 직업, 상태 -->> Parameter ,Attribute(매개변수로 속성을 받음)

 

세 가지의 객체를 넣어봄.

 

>>>이태오 = bubu("이태오","영화투자자","이혼남")
>>>지선우 = bubu("지선우","의사","이혼녀")
>>>여다경 = bubu("여다경","백수","유부남킬러")

 

그럼 __init__에서 지정되었던 것처럼 처음부터 이름과 직업 상태 순으로 argument(인자)를 받는다.

여기에서 메소드(introduce)를 이용하여 호출을 하면 결과는 다음과 같이 나온다.

OOP class example

 

그래서 왜 이런 걸 했냐. 과제가 있어서입니다.


Assignment

Class를 직접 구현해 보겠습니다.

Database라는 이름의 class를 구현해 주세요.

Database 클래스는 다음의 속성(attribute)들을 가지고 있습니다.

 

  • name : database의 이름

  • size : 저장할 수 있는 데이터의 max 사이즈. Size를 넘어서는 데이터를 저장할 수 없다.

 

Database 클래스는 다음의 메소드들을 가지고 있습니다.

 

  • insert

  • select

  • update

  • delete

 

Insert

insert 메소드는 self 외에 2개의 parameter를 받습니다.

field와 value 입니다.

Field 는 저장하고자 하는 데이터의 필드명 이고 value는 값입니다.

Field 와 value는 내부적으로 dictionary에 저장되어야 합니다.

insert 메소드는 다음 처럼 호출 할 수 있습니다.

 

 

insert 메소드는 특별한 리턴값은 없습니다.

만일 내부 dictionary의 총사이즈가 database 클래스의 size 속성보다 크면 더 이상 새로운 값들을 저장하지 말아야 합니다.

 

 

Select

select 메소드는 self 외에 1개의 parameter를 받습니다.

field 입니다.

Field 는 읽고자 하는 데이터의 필드명입니다.

내부적으로 데이터를 저장하고 있는 dictionary에서 해당 field에 해당하는 키와 연결되어 있는 값을 리턴해주어야 합니다.

 

예를 들어, 이미 name이라는 필드명으로 "정우성"이라는 값을 저장했다고 한다면:

 

 

이 되어야 합니다.

만일 해당 필드 값으로 지정 되어 있는 값이 없다면 None 을 리턴해주세요.

 

Update

Self 외에 2개의 parameter를 받습니다.

field와 value 입니다.

이름 그대로 이미 저장되어 있는 값을 수정하는 메소드 입니다.

 

 

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.

그리고 특별한 리턴 값은 없습니다.

 

Delete

delete 메소드는 self 외에 1개의 parameter를 받습니다.

field 입니다.

Field 는 지우고자 하는 데이터의 필드명 입니다.

 

 

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.

그리고 특별한 리턴 값은 없습니다.


Answer is:

class Database:    
  
  database1={}
    
  def __init__(self,name,size):
    self.name = name
    self.size = size
        
  def insert(self,field,value):
    if len(self.database1)<self.size:
      if field in self.database1:
        self.database1[field]=self.database1[field]+value
      else:
        self.database1[field]=value
        
            
    
        
  def select(self,field):
    if field in self.database1:
      return self.database1[field]
    else:
      return None
    
  def update(self, field, value):
    if field in self.database1:
      self.database1[field]=value
    else:
      return None
        
  
  def delete(self, field):
    if field in self.database1:
      self.database1.pop(field)
    else:
      pass    



지금 다시 보니 저 귀찮았던 self.database1을 __init__에 넣어버릴걸... self.database1 = database1이렇게
최소한의 검색으로 풀어서 뿌듯했다. 문제를 제대로 읽어보고 제출했으면 시간을 단축시킬 수 있었을 건데. 아쉽다.


 

 

 


 

Modules & Packages

 

파이썬에서 모듈은 변수나 함수 그리고 클래스 등을 모아놓은 파일입니다.

따로 모듈로 모아놓은 이유는 다음과 같습니다.

 

  • 다른 파일에서 재사용이 가능하게 하고

  • 전체 코드가 한 파일에 넣기에는 너무 커졌을 때 여러 파일로 나누어서 정리를 하기 위해서.

Module 만들기

>>>## my_module.py 

-->>my_module이 이름이고 확장자는 다른 파일에서 굳이 안 써도 됨

>>>my_module_var = 7

>>>def my_module_func():

>>>      return "Hello!"

 

>>>class MyModuleClass:

>>>      pass


import my_module

하면 my_module이란 것을 사용할 수 있음.

<모듈 이름>.<모듈에서 사용하길 원하는 변수/함수/클래스 이름>

예)my_moudle.my_module_func()

 

Alternative ways to import modules

from <모듈 이름> import <함수/변수/클래스1>,<함수/변수/클래스2>, ..., <함수/변수/클래스N>

 

import 키워드 외에 from import 키워드를 사용하여 모듈을 불러 올 수 있다.

 

예)

>>>from my_module import my_module_func, my_module_var

>>>print(my_module_var)

>>>my_module_func()


>>>from my_moudle import *
Using *(별표)

이렇게 하면 그 모듈의 모든 요소를 불러옴. 하지만 로컬 스콥을 가지고 있는 이 모듈과 다른 요소들과 충돌을 일으킬 수 있다고 한다. 그래서 별표를 쓰는 것은 권장하진 않음.

 

Import As

ex)

>>>from my_module import my_func as f1

 별칭을 줄 수 있음.

>>>f1()

numpy나 pandas에서도 자주 쓰는 것을 보았음.

ex)

>>>import numpy as np

>>>import pandas as pd

>>>np.ndarray

 

Packages

Package는 모듈을 담고있는 큰 개념.

예)

>>>import pkg.mod1

>>>from pkg.mod2 import func2

 

>>>pkg.mod1.func2()

>>>func2()

이렇게 dot notation으로 package에서 원하는 모듈을 import할 수 있음.

 

 

Package Initialization

패키지를 넣을 때에 초기 설정을 __init__.py을 통해 해준다. 뭘 설정 할 수 있냐하면:

  • Import 할때 경로의 총 길이 줄여주기

  • Package에서 import 할 수 있는 변수/함수/클래스 제한하기

  • 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들


How import statement finds modules and packages

Import Search

파이썬 모듈을 어떻게 찾는가?

  •  sys.modules

파이썬이 가장 우선적으로 확인 하는 곳. 단순한 dictionary. import되었던 모든 모듈과 package를 저장하고 있음.

 

  •  built-in modules

파이썬에서 제공하는 공식 라이브러리.

 

  •  sys.path

 파이썬이 가장 마지막으로 보는 장소. 기본적으로 list이며 string 요소를 가지고 있음. 각 string 요소는 경로를 나타내고 있음.

 

sys는 파이썬에 포함되어 있는 모듈.

ex)

>>>import sys

 

>>>print(sys.path)

>>>print(sys.modules)

그러므로 파이썬에서 수정과 출력 가능함.

 

Absolute Path & Relative Path

이해를 돕기위한 예시 프로젝트 저장 경로

Absolute path는 current directory(현재 위치한 경로)임. 그래서 위치한 경로가 길면 길어질 수 있음. 이러한 단점을 보완하는 것이 Relative Path임. 일반적으로 local package를 Import 할 때에 absolute path를 사용하면 됨.

ex)

>>>from package1 import module1

>>>from package1.module2 import function1 

>>>from package2 import class1 

>>>from package2.subpackage1.module5 import function2

 

-->> Absolute path를 사용해 package1 과 package2를 import 한 것. 파이썬에서는 윈도우나 리눅스에서처럼 slash(/)나 back slash(\)대신 dot(.)을 씀.

 


 

Relative Path는 import 하는 위치를 기준으로 경로를 정의함. 그래서 대체로 local package안에서 다른 Local package를 import 할 때에 사용됨. 

ex)

>>>#packae2/module3.py   -->>이라는 파일에

>>>from . import class1

>>>from .subpackage1.module5 import function2

dot(.)은 import가 선언되는 파일의 현재 위치를 말함. 현재위치가 package2/module3.py이므로 현재 위치에서 원하는 모듈의 경로만 선언해주면 됨.

 

또 dot(.) 2개를 사용할 수도 있음. 

ex)

>>>#subpackage1/module5.py

>>>from ..module4 import class4

 

Relative path 는 경로의 길이는 줄지만 위치해 있는 곳이 어디인지에 따라 헷갈릴 수가 있다. 그래서 absolute path를 사용하는 것을 권장함.

 

 


Linux Basics

시스템을 운영하는데에 가장 널리 사용하는 운영체제

 

리눅스의 구조

커널

- 리눅스의 핵심, 프로세스 관리, 메모리 관리, 파일 및 장치 등 컴퓨터의 하드웨어를 모두 제어하는 영역

 

- 커널과 사용자간의 접점으로 셀을 통해 우리는 컴퓨터가 원하는 동작을 하도록 할 수 있다. 대표적인 셀은 BASH(Bourne-again Shell)이 있다. 요즘은 zsh(Z shell)이 많이 쓰이고 있다.

 

응용프로그램

-각종 프로그램 시스템을 위한 프로그램, 사용자의 문서 편집 도구, 브라우저 네트워크 도구 등 다양한 것을 말함.

 

 

Linux Directory Structure

트리 구조로 되어 있음. Root는 slash(/)임 . 그리고 하위구조가 밑에 있음.

우리가 주목해야 할 디렉터리는:

/home -  사용자의 정보를 저장할 수 있는 경로

 

 

Root directory

cd = Change Directory

pwd = Print Working Directory

ls = list  

ls -a = 숨겨진 파일도 표시하게 함.

표시 된 리스트 중 dot(.)이 하나인 것은 하위디렉터리 dot(.)이 두개면 상위 디렉터리이다.

ls -l = 자세히 보는 것.

ls -la 로도 함께 쓸 수 있음.

PATH

절대 경로

가장 상위 구조 주소부터 현재 내가 있는 곳 까지 다 적는 것

ex) cd /home/ubuntu

상대 경로

내 위치로 부터 적는 것

ex) cd ./ubuntu   ( dot(.)두개 쓰면 위로 감)

 

 

Configs(환경 변수)

>>>env

-->>환경을 보여주는 명령어

명령어들은 환경 변수에 저장되어 있어야 됨.

>>>which ls

-->>ls가 어디에 지정되어 있나를 보여줌.(결과는 ls의 위치를 보여줌)

 

환경 변수를 출력하는 명령어 ECHO

>>>echo $PATH

-->>PATH 환경 변수 값

>>>echo $HOME

-->> HOME 디렉터리 환경 변수 값

 

mkdir = make directory

 

>>>mkdir abcd

>>cd abcd

>>cd ..

>>vi .bashrc

-->>BASH 설정 파일에 환경변수의 특정경로를 추가

그리고 적어 줘야 할 것

>>>export PATH="/home/ubuntu/abcd:$PATH"

 

>>>source .bashrc

-->>배쉬 환경설정 파일을 다시 읽기

>>>echo $PATH

-->>그러면 abcd가 추가 된 것을 확인 할 수 있음.

 

Shell commands

이때까지 썼던 것들 모음.

>>>cd

>>>ls

>>>mv abc cba   

-->>move는 경로를 바꾸거나 이름을 바꾸는 것. abc->cba

 

>>>cp -r cba ab

-->> copy는 파일이나 디렉터리를 복사함. 디렉터리를 복사할 경우 -r을 써야함.

 

>>>vi abcd.text

-->> abcd 텍스트 파일을 만듬

 

>>>cat abcd.text

-->>텍스트파일의 내용을 보여줌

 

>>>rm abc.txt

-->> remove 삭제하다. -r 을 붙이면 디렉토리를 지울 수 있음.

 

>>>clear

-->> 프롬프트 화면을 지움.

 

>>>pwd

-->>현재 나의 위치를 보여줌.

 

>>>man ls

-->> 원하는 명령어의 manual을 보여줌

 

>>>sudo apt install tldr

-->> too long; didn't read 패키지 설치(간략하게 메뉴얼 보여주는 패키지) // apt가 우분투// 

>>sudo pip install tldr

-->> 해도됨.

 

>>>tldr ls

-->> ls의 쉬운 메뉴얼을 보여줌.

 

 

 

 

 

 

 

 

 

 

반응형