ChainMap

collection 모듈에 있는 ChainMap은 공식문서에 따르면 여러 딕셔너리나 다른 매핑을 묶어 갱신 가능한 단일 뷰를 만든다고 한다.

즉, ChainMap은 여러 딕셔너리를 하나의 링크드 형태로 묶으며, 기존에는 여러 dict들을 for를 통해 탐색했던 것을 한 번에 수행할 수 있다고 생각하면 된다.

chainMap에는 다음과 같은 method들이 있다.

  1. maps
  2. new_child
  3. parents

new_child

parents

namedtuple

namedtuple은 지정해준 이름으로 간단한 서브 클래스를 반환한다. 이 서브 클래스는 인덱싱되고 iterable일 뿐만 아니라 attribute 조회로 접근 할 수 있다.

Counter

Counter는 hash 가능한 객체를 세기 위한 dict 서브 클래스다. 요소는 dict의 키로 저장되고 개수는 value로 저장된다. 개수는 0이나 음수도 포함하는 임의의 정숫값이 될 수 있다.

OrderedDict

딕셔너리 순서를 기억하는 Dict으로 옛날 python에서는 이를 활용하는 것이 유용했으며, 이제 내장 dict도 삽입 순서를 기억하기 때문에 덜 중요해졌다.

popitem(last=True)

OrderedDict의 popitem()은 (key, value)를 반환하고 제거한다. last가 True면 LIFO 방식으로, False면 FIFO 방식으로 반환다.

defaultdict

defaultDict은 dict과 유사하지만 key값이 없을 경우에 미리 지정해 놓은 초기(default)값을 반환하는 역할을 한다.
dict의 setdefault 와 유사하지만 더 간단하고 빠르다.

deque

deque는 double-ended-queue의 약자로 stack과 queue를 일반화한 것이다. deque는 메모리적으로 효율적이기 때문에 양쪽 끝에서 append와 pop이 모두 O(1)의 성능을 지원한다. deque는 다음과 같은 메서드를 지원한다.

  1. append
  2. appendleft
  3. clear
  4. copy
  5. count(x)
  6. extend
  7. extendleft
  8. index
  9. insert
  10. pop
  11. popleft
  12. remove
  13. reverse
  14. rotate

이 중 자주 쓰이는 것들만 살펴본다.

deque를 사용해서 iterable한 객체를 deque 객체로 만들 수 있다.

https://docs.python.org/ko/3/library/collections.html

 

collections — 컨테이너 데이터형 — Python 3.9.6 문서

collections — 컨테이너 데이터형 소스 코드: Lib/collections/__init__.py 이 모듈은 파이썬의 범용 내장 컨테이너 dict, list, set 및 tuple에 대한 대안을 제공하는 특수 컨테이너 데이터형을 구현합니다. named

docs.python.org

 

Functools

Functools module은 high-order-function(고차원 함수)를 위해 고안된 것으로 다른 함수에 적용하거나 다른 함수를 반환하는 모듈이다. Functools에는 다음과 같은 함수들을 제공한다.

  1. lru_cached
  2. cmp_to_key
  3. total_ordering
  4. partial
  5. reduce

1. lru_cached

@functools.lru_cache(maxsize = 128 )

lru_cache(user_function)

 

lru_cache는 함수의 리턴 결과를 캐시해 주는 데코레이터이며, 최종 요청 이후에는 캐시된 결과를 리턴한다. maxsize는 캐시할 수 있는 최대 갯수를 의미하며, Least Recently Used(LRU)를 사용하기 때문에 최근에 참고되지 않은 데이터가 교체된다.

 

다음과 같이 재귀를 사용해서 factorial을 구하는 함수가 있다고 하자.

Jupyter의 timeit 매직함수를 사용해서 n이 10일 때, 20일 때 시간을 측정해보도록 한다.

이번에는 functools의 lru_cahce를 데코레이터로 설정해서 factorial을 재정의하고, 다시 한 번 10, 20일 때 시간을 측정해보도록 한다.

내부적으로 각 factorial의 값을 캐시하고 있기 때문에, 시간 단축이 많이 발생한 것을 알 수 있다.

2. cmp_to_key

sorted와 같은 정렬 함수의 key에 함수로 정렬을 하기 위해서 사용한다. 이 때 사용하는 함수는 두 개의 인수를 받아야 하고, 그들을 비교해서 작다면 음수, 같으면 0, 크다면 양수를 반환하도록 해야 한다.

예시는 다음 문제를 사용하도록 한다.

https://codedrive.tistory.com/429

 

[BOJ]1422. 숫자의 신

문제: 숫자의 신은 여러명이 있지만, 그 중에 자연수의 신은 오세준이다. 오세준은 자연수의 신으로 오래오래 살다가 어느 날 음수의 신과 전쟁을 하게 되었다. 오세준은 음수의 신 이다솜을 이

codedrive.tistory.com

3. total_ordering

@total_ordering 데코레이터를 사용하면, 사용자 정의 객체, 즉 class끼리 비교하거나 정렬할 수 있다. 다음 블로그 글이 잘 설명하고 있는 것 같아 참조한다.

https://velog.io/@doondoony/Python-total-ordering-decorator

 

[Python] functools.total_ordering

@total_ordering 과 Python 비교연산자 오버로딩에 대해 알아보아요

velog.io

4. partial

 partial은 한 함수의 특정 인자를 위한 함수를 만들기 위해 사용한다. 숫자나 문자열을 정수(integer)로 변환해주는 파이썬 내장 함수 int(x, base=10)을 재활용하여, 이진수로만 변환해주는 새로운 함수를 만들 수 있다.

 기존에 int 내장 함수는 위와 같이 작동한다. partial을 사용해서 각 진수로 변환할 수 있는 새 함수를 정의하도록 한다.

이처럼 partial은 여러 인자를 받는 함수를 하나의 인자를 고정시켜서 새로운 함수로 정의하고자 할 때, 사용한다.

5. reduce

reduce는 반복가능한 객체(iterable)에 함수를 순차적으로 적용한다. 단, 각각의 객체에 적용하는 것이 아닌 누적형식으로 적용한다.

즉 위 예시는 15 = (((1+2)+3)+4+5) 와 같은 방식으로 적용되어 계산된 것과 같다.

 

Reference

https://docs.python.org/ko/3/library/functools.html

 

functools — 고차 함수와 콜러블 객체에 대한 연산 — Python 3.9.6 문서

 

docs.python.org

 

Remote Repository 

 이전 [Git 빨]에서는 local Repository에서 진행된 것이므로 아직 다른 사람과는 공유를 할 수 없는 상태였다. 따라서 이를 다른 사람들과 공유하기 위해서는 local Repository에서 Remote Repository에 올려야 한다. 대표적인 Remote Repository로는 github가 있다.

 

[출처]https://greenido.files.wordpress.com/2013/07/git-local-remote.png?w=696&h=570

 

 remote repository는 기본적으로 빈 repositroy이며 이 곳에서 직접 작업을 할 수는 없고, 단지 local repository에 있는 branch들을 올릴 수 있다. remote repository와 통신하기 위해서는 크게 두 가지 방법이 있다. http 방법과 SSH 방법인데 보통 http 방법을 통해서 전송 및 수신하면 된다. (개인 기기에서만 진행한다면 SSH 방법을 사용해도 된다.)

 

 local repository의 값을 remote repository에 그대로 올라가기 때문에 pointer 값인 head와 branch명이 그대로 올라가게 된다. 그러면 나중에 이 값을 받으려고 할 때 내 local repository의 pointer와 master가 헷갈릴 수 있다. remote repository에서 온 branch 앞에는 origin/~ 와 같이 붙게 된다.

 

[출처] https://leanpub.com/pro-git/read

 

 origin/master와 master는 서로 다른 것으로 인식되기 때문에 local에서 commit을 하면 master만 움직일 뿐 origin/master는 움직이지 않는다. 대신 remote에 다른 사람이 새로 값을 넣어두었다면 remote repository에만 값이 바뀌게 될 것이다.

 

[출처] https://leanpub.com/pro-git/read

 이 상태에서 다시 값을 받아온다면 f42c5를 기준으로 서로 값이 달라지게 되는 것이므로 branch로 갈라지게 된다. 따라서 이를 나중에는 merge하는 작업이 필요하다.

 

명령어

 따라서 위와 같은 작업을 하기 위해서 clone, push, fetch, pull과 같은 방법을 사용해서 remote repository와 상호작용을 할 수 있다.

clone, fork

 처음 local repository와 remote repository와 연결을 할 때 사용하는 명령어/기능이다. fork는 다른 사람이 가지고 있는 repository를 참고해서 프로젝트를 진행하려고 하지만 그 repository에 push를 하지 않으려고 할 때 사용한다. 쉽게 말하면 다른 사람이 만든 remote repository를 내가 복사해오는 것을 의미한다.

 clone은 remote repository의 값을 처음 local로 가져오려 할 때 사용한다. 위에서 말했던 http나 ssh 방법을 사용해서 가져올 수 있다. http/ssh 값은 쉽게 복사를 해서 붙여넣을 수 있다. 명령어는 다음과 같이 사용한다.

git clone <http/ssh 값>

push

 내 local의 값을 remote로 올리기 위해서 사용하는 명령어다. 기본적으로는 항상 origin master를 올리게 되어 있고 권한이 없다면 master의 경우에는 push가 되지 않을 수 있다. (누구나 push를 할 수 있다면 문제가 발생할 수 있다.) 명령어는 다음과 같이 사용한다. <new branch>의 default는 origin master이다.

git push <new branch>

fetch

fetch는 remote repositories로 부터 commit을 받아올 수 있다. 즉 현재의 HEAD를 유지한 채로 branch별로 바뀐 점을 가져올 수 있는 것이다. (아직 merge 하지 않았다.) 명령어는 다음과 같이 사용한다.

git fetch origin <branch>

pull

pull은 fetch와 merge 명령어를 동시에 바꾸는 것으로 현재의 HEAD가 바뀌게 될 것이다. 명령어는 다음과 같이 사용한다.

git pull

'Language > Git' 카테고리의 다른 글

[Git 빨]3. Git Branching  (0) 2019.07.26
[Git 빨] 2. Git의 사용 이유와 기본적인 흐름  (0) 2019.07.19
[Git 빨]1. Git 설치하기  (0) 2019.07.12

Branching

 git을 잘 사용하기 위해서는 branching을 잘 관리해야 한다. branching을 잘 사용하면 선형적인 개발이 아닌 비선형적인 개발을 할 수 있으며 버전 관리를 하는 것이 더 용이해진다. 따라서 복잡한 branch를 잘 관리할 수 있도록 해야 한다.

 branching 개념을 소개하기 전에 HEAD와 master가 무엇인지 알아야 한다. master는 기본적으로 생성되어 있는 branch다. 그리고 HEAD는 pointer로 가장 마지막으로 commit 한 곳이 어딘지를 가리키는 pointer다.(추후 이 HEAD를 임의로 옮길 수 있긴 하다.)

git의 master와 HEAD

branch의 생성, 이동, merge

 

git의 흐름도와 실제 폴더

 위와 같이 default인 branch가 있다고 하자. c0과 c1은 commit이며 숫자가 작을수록 더 오래된 commit이다. 따라서 c1이 더 최신 commit이므로  defult와 HEAD가 c1을 가리키고 있다.

 branch를 만드는 명령어는 branch이다. git branch <만들 branch명> 명령어를 입력해서 branch를 만들 수 있다. 따라서 git branch experiment를 입력해서 새 branch를 만들도록 하자.

 

branch를 만들어도 master

 

 branch를 만들어도 HEAD를 옮긴 것이 아니므로 experiment로 branch가 이동한 상태는 아니다. 아직 HEAD가 master(default)에 있는 것이므로 지금 commit을 한다면 master에 c2가 쌓이게 될 것이다. 따라서 새로 만든 experiment branch로 이동하기 위해서 checkout이라는 명령어를 사용한다. git checkout <이동할 branch명> 명령어를 입력해서 branch를 이동할 수 있다. 따라서 git checkout experiment를 입력해서 이동하도록 하자.

 

experiment로의 이동

 

 branch를 이동했다면 다음과 같이 푸른색 master가 experiment로 바뀐 것을 알 수 있다. 따라서 이 상태에서 commit을 두 번 한다면 experiment 가지에서 증가하게 될 것이다.

 

 

experiment에서의 commit

 

 이제 다시 master(default)로 돌아간다면 어떻게 바뀌게 될까? default에서 commit3.txt와 commit4.txt를 만든 기록이 없으므로 test.txt와 commit2.txt만 가지고 있을 것이다. 

 

이전 사진 재탕한 것이 아닙니다.

 

 merge란 두 개의 branch를 합치는 것을 의미한다. 실생활 예시로 설명한다면 한 프로그램이 A라는 사람이 로그인 기능을 구현하고 B라는 사람이 회원가입을 하는 기능을 구현했다 하자, 각자 branch를 생성해서 기능을 구현했고, 완성했다면 이를 합쳐야 할 것이다. 이때 사용하는 것이 merge라는 기능이다. merge를 설명하기 위해서 commit을 몇 번 더했다. 

 

 

좌상단_현재 상태, 우상단_experiment branch, 아래_default branch

 

 다음과 같은 상태라고 할 때 experiment branch를 이제 default를 합치기 위해서 default(master) branch로 이동을 해야 한다. 그 다음에는 git merge experiment를 하면 experiment가 default에 합쳐지게 된다. 

 

master에 모든 파일이 합쳐졌다.

 

 하지만 merge를 수행했다고 experiment가 사라진 것은 아니다 experiment에 존재하는 변경사항들이 master에 합쳐진 것이지 branch 자체가 사라진 것은 아니다. 따라서 experiment로 변경 후 다시 commit을 하면 다음과 같이 만들어지게 될 것이다.

 

 

 

 

 이렇게 branch를 생성,이동하고 이를 merge를 함으로써 비선형적(병렬적)으로 프로젝트를 진행할 수 있게 된다. 따라서 branch를 잘 사용해서 프로젝트 진행에 효율성을 높이도록 해보자.

'Language > Git' 카테고리의 다른 글

[Git 빨]4. Remote Repository  (1) 2019.08.02
[Git 빨] 2. Git의 사용 이유와 기본적인 흐름  (0) 2019.07.19
[Git 빨]1. Git 설치하기  (0) 2019.07.12

Git은 왜 사용할까?

 프로젝트를 진행하다 보면 코드를 자주 수정하게 되고 그 코드를 저장하게 된다. 이럴 때마다 '하나의 버전이 생겼다.'라고 한다. (게임의 패치 버전과 같다고 생각하면 된다.) 버전을 나누면서 코드를 관리한다면 얻을 수 있는 장점이 많다. 만약 프로젝트를 진행하다가 실수로 파일을 지우게 되었다거나 컴퓨터가 고장이 난다면 다시 이 파일을 복구할 수 없는 방법이 없다. 또한 내가 계속해서 진행하던 프로젝트 방향이 옳지 못한 방향일 수도 있을 것이다. 버전을 나눠서 관리하지 않았다면 다시 이전으로 돌아갈 수 (undo) 없었을 것이다. 하지만 버전을 나눠서 관리해 저장했다면 필요한 버전으로 돌아가서 다시 진행하면 될 일이다. 따라서 버전을 나눠서 관리를 해야 한다. 

 그러면 매번 다른 이름으로 저장하기를 해서 버젼명을 적어주면 되지 않을까 생각할 수 있다. 하지만 대부분의 경우에는 프로젝트는 팀으로 진행하는 경우가 많다. 아무리 자주 버전을 자주 공유한다고 해도 같은 버전의 파일을 수정하고 있을 수도 있고, 서로 진행한 방향이 맞지 않아서 충돌이 발생할 수 있을 것이다. 그렇다고 해서 서로 시간을 나눠가며 프로젝트를 진행하기에는 매우 비효율적이다. 따라서 위의 문제를 모두 해결하기 위해 생겨난 것이 VCS(Version Control System)이다.

 VCS는 각 사용자들은 repositories라는 저장소를 가지고 있다. (CVS) 그리고 서로 공유하는 repository(git)를 만들어 자re신의 repo에 있는 파일들을 git의 repo에 올리고 내려받으면서 버전을 관리하겠다는 시스템이다.

 메일로 코드를 공유하는 것과 차이를 두기 위해서 Branching이라는 개념이 존재한다. 같은 repository안에 서로 다른 가지(branch)를 만들어서 서로 코드를 관리하고 나중에 이를 서로 merge를 해서 합칠 수 있도록 했다.

 

Git의 기본 개념

 Git을 본격적으로 사용하기에 앞서서 몇가지 개념을 알고 있어야 한다. git에는 크게 세 가지의 공간이 있다. 

local repository입니다.

1. working directory : 사용자가 실제로 작업을 하는 공간이다. 이 공간에서 파일을 수정, 추가, 삭제를 할 수 있다.

2. staging area : working directory에서 바뀐 상태(수정, 추가, 삭제)를 이 공간으로 올린다. (add 한다.)

3. git directory : staging area에 올린 상태들을 repository에 올림으로써 하나의 버전을 등록하게 된다. (commit 한다.)

 

git은 각 버젼에 대해 checksum을 만들어 놓았기 때문에 이전의 버전으로 돌아가는 것이 쉽다.

 

Git의 기본적인 흐름

Git을 사용하는 기본적인 흐름은 다음과 같다. 

 

1. Init a repo

우선 repository를 만들어야 한다. 따라서 내가 만들고 싶은 파일에서 우클릭을 해서 Git Bash를 사용해서 git command 창에 들어오고 이 창에 git init을 쳐서 repository를 만들도록 한다.

위와 같이 .git 파일이 만들어졌다면 성공

위 사진과 같이 .git 폴더가 만들어졌다면 성공적으로 repository를 만들게 되었다.(숨김 파일을 보이기로 설정해야 한다.)

 

2. Edit files

 .git이 있는 폴더 내에서 새로운 파일을 하나 만들어 보도록 하자. 즉 working directory에 새로운 파일을 만든다는 것이다.

아무 파일이나 하나 만들거나 가져와보자.

 

3. Stage the changes and Review your changes

 지금은 working directory에 있는 것이고 이를 staging area에 올려야 한다. 이를 확인하는 간단한 방법은 git status 명령어를 사용하는 것이다. git status를 사용하면 아래 왼쪽 사진과 같이 Untracked files 라며 staging area에 올려야 한다고 빨간 글씨로 알려준다. 

 따라서 이 파일을 staging area에 올리기 위해서는 git add <filename> 명령어를 사용해야 한다. 이 예시에서는 git add test.txt 와 같이 입력을 하였고, 이 명령어를 수행하고 나서 git status를 다시 쳐보니 초록색 글씨로 staging area에 올라와 있음을 알려준다. (오른쪽 사진)

[좌] add 하기 전, [우] add 한 후

 

4. Commit the changes

 이제 이 staging area에 있는 것을 repository에 올려야 하는데 이는 git commit 명령어를 사용한다. git commit 명령어를 사용하게 되면 commit message를 입력하라고 초기 설치했던 편집기로 이동하게 될 것이다.

 commit message는 repository에 등록을 할 때 어떠한 점이 바뀌었는지 간단히 써준다고 생각하면 된다.

따라서 우측 사진처럼 message를 입력하고 저장버튼을 누르고 닫는다면 commit이 완료될 것이다.

 

[좌] git commit 명령어 [우] commit message 입력하기

 

 만약 이렇게 편집기를 통해서 message를 입력하는 것이 귀찮다면 git commit -m "<message 내용>"을 통해서 위와 같은 작업을 수행할 수 있다. 이후 git status를 다시 입력하면 깔끔하게 staging area가 비워진 모습을 얻을 수 있을 것이다.

 

 지금까지 Git의 기본적인 흐름이었으며 이 큰 틀은 거의 바뀌지 않는다. 하지만 Git을 잘 사용하기 위해서는 branch를 잘 다뤄야 하며 다음 편에서는 branch와 관련된 명령어를 소개하겠습니다.

 

'Language > Git' 카테고리의 다른 글

[Git 빨]4. Remote Repository  (1) 2019.08.02
[Git 빨]3. Git Branching  (0) 2019.07.26
[Git 빨]1. Git 설치하기  (0) 2019.07.12

프로그래머라면 GitHub를 사용하지않는 사람이 없을 것이고 이 깃허브를 잘 사용하기 위해서는 git 언어를 사용하는 것이 중요하다. 따라서 이번엔 Git의 중요성을 설명하기에 앞서서 Git을 설치하는 방법을 간단하게 설명하고자 한다.

 

[ Git for Windows]

https://git-scm.com/downloads

위 사이트에서 각자 운영체제에 맞는 Git 설치 파일을 다운받을 수 있다. 설치를 완료한 후 다음과 같은 화면을 얻었다면 옳게 설치를 하게 된 것이다.

 

잘 설치하셨습니다.

 이제 계속해서 다음을 누르며 따라가다보면 여러가지 옵션을 설정하게 되는데, 대부분 기본 설정을 유지하면서 따라가면 됩니다.  하지만 다음과 같이 기본 편집기를 고르는 화면이 나오는데 대부분 default로 vim(vi 편집기)로 설정 되어 있습니다. vi 편집기를 사용해보지 않은 사람이라면 이 편집기를 사용하는 것이 어려울 수도 있기 때문에 다른 편집기로 바꾼 뒤로 설정해주면 됩니다.

 

저는 VScode를 사용했습니다.

이후에도 계속 많은 설정들을 하는데, 전부 기본 설정 (이미 체크되어 있는)을 따라 가도 문제 없이 진행됩니다. 모든 설치가 완료되었다면 바탕화면이나 임의의 폴더에서 우클릭을 하면 다음과 같이 우클릭 창이 바뀌었을 것입니다.

 

Git Bash 와 Git GUI가 생겼습니다.

이제 Git Bash를 눌러서 Git의 언어를 사용할 수 있습니다.

 

여기까지 왔다면 이제 다 설치했습니다.

본격적으로 Git을 사용하기에 앞서서 초기 설정을 해주어야 하는데 사용자 이름과 사용자 메일을 등록해줘야 합니다. 등록하는 방법은 다음과 같습니다.

 

- git config --global user.name “Your Name“ 

– git config --global user.email Your Email

 

이 단계까지 마쳤다면 Git의 설치를 다했습니다.

 

 

'Language > Git' 카테고리의 다른 글

[Git 빨]4. Remote Repository  (1) 2019.08.02
[Git 빨]3. Git Branching  (0) 2019.07.26
[Git 빨] 2. Git의 사용 이유와 기본적인 흐름  (0) 2019.07.19

2019/01/29 - [Language/Python] - [Python 따라하기]1. Python 설치하기

2019/02/05 - [Language/Python] - [Python 따라하기]2. 자료형_part 1(String, Int,Float, List)

2019/02/12 - [Language/Python] - [Python 따라하기]3. 자료형_part2(Tuple,Set,Dictionary)

2019/02/19 - [Language/Python] - [Python 따라하기]4. 조건문

2019/02/26 - [Language/Python] - [Python 따라하기]5. 반복문(For, While, break, continue)

2019/03/05 - [Language/Python] - [Python 따라하기]6. 함수만들기(def, print, format)

2019/03/12 - [Language/Python] - [Python 따라하기]7. 파일 입출력 (File I/O)

2019/03/19 - [Language/Python] - [Python 따라하기]8. 클래스와 상속(Class, inheritance)

2019/03/26 - [Language/Python] - [Python 따라하기]9. 예외처리(try,except,finally)

유용한 내장 함수 및 외장 함수

파이썬을 더 잘 사용하기 위해서 많은 내장함수와 외장함수를 알고 있는 것이 중요하다. 남들보다 더 많이 알고 있다면 내가 만들고자 하는 프로그램의 작업량이 훨씬 줄을 수 있을 것이다.

내장함수

내장함수는 외장함수와는 달리 import가 필요하지 않다. 따라서 아무런 설정이 없어도 바로 사용할 수 있다.

abs

abs(x)는 어떤 숫자를 입력으로 받았을 때, 그 숫자의 절대값을 돌려주는 함수이다.


chr

chr(int)는 아스키 코드값을 입력으로 받아 그 코드에 해당하는 문자를 출력하는 함수이다.

divmod

divmod(a,b)는 2개의 숫자를 입력으로 받는다. 그리고 a를 b로 나눈 몫과 나머지를 튜플 형태로 반환하는 함수이다.


몫을 구하는 연산자 //와 나머지를 구하는 연산자 %로 구한 것과 같다.


filter

영어 단어의 뜻과 같이 조건에 맞는 값들을 걸러낸다는 동작을 한다. 첫 번째 인수로 함수 이름을, 두번째 인수로 iterable한 자료형을 받는다. 그래서 iterable한 자료형의 값들을 함수로 넣어 참인 것들만 묶어서 반환한다.

map

filter처럼 map(f,iterable)로 함수와 iterable한 객체를 받는다. map은 filter와 비슷한 역할을 하지만 iterable의 각 요소에 함수 f에 의해 수행된 결과를 묶어서 반환을 한다.

ord

chr의 반대성격을 가지는 함수이다. ord(c)는 문자의 아스키 코드값을 반환하는 함수이다.

외장함수

외장함수란 전 세계의 파이썬 사용자들이 만든 유용한 프로그램들을 모아 놓은 것이다. 이를 파이썬 라이브러리라고 부르는데, 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 알고 있으면 된다.

os

os 모듈은 환경 변수나 디렉토리, 파일 등을 제어할 수 있게 해주는 모듈이다.

os.environ

현재 시스템의 환경 변수 값들을 보여준다.

os.chdir

os.chdir을 이용하여 아래와 같이 현재 디렉토리의 위치를 변경할 수 있다.

os.getcwd

os.getcwd는 현재 자신의 디렉토리 위치를 반환한다.

glob

파일을 읽고 쓰는 기능이 있는 프로그램을 만들다 보면 특정 디렉토리에 있는 파일 모두를 가져와야 할 때가 있다. 이 때 사용하는 모듈이 바로 glob이다.

glob모듈은 디렉토리 내의 파일들을 읽어서 리스트로 반환한다. * , ? 등을 사용해서 원하는 파일만 읽을 수 있다.

datetime

datetime 패키지에서는 날짜와 시간을 함께 저장하는 datetime 클래스, 날짜만 저장하는 date 클래스, 시간만 저장하는 time 클래스가 있다.
그중 가장 많이 사용하는 datetime 클래스에 대해서 소개한다.

datetime.dateime 클래스

패키지 이름과 클래스 이름이 datetime으로 같기 때문에 사용할 때 주의해야 한다. datetime에서 반환하는 객체는 datetime.datetime이다. 가장 대표적인 것은 현재 시간을 출력하는 now()이다.


now()에서 생성된 객체들에 대해 다음과 같이 접근할 수 있다.


datetime.datetime에는 여러 메서드들도 제공하지만 그중 strftime()을 자주 사용하는 문자열을 반환해주는 함수이다. 이 메서드는 어떤 형식으로 문자열을 만들지 결정하는 문자열을 인수로 받는다. 자세한 것은 다음 링크에서 확인할 수 있다.

https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior


random

random은 난수를 발생시키는 모듈이다. 다음은 0~1.0 사이의 실수 중에서 난수값을 리턴하는 예시이다.

randint

random.randint(a,b)와 같이 사용하며 a에서 b 사이의 정수 중에서 임의의 값을 반환한다.

random.choice

random.choice(list)와 같이 사용하며 list 값 중 무작위로 하나를 선택하여 반환한다.

random.shuffle

random.shuffle(list)와 같이 사용하며 list를 무작위로 섞는다.



2019/01/29 - [Language/Python] - [Python 따라하기]1. Python 설치하기

2019/02/05 - [Language/Python] - [Python 따라하기]2. 자료형_part 1(String, Int,Float, List)

2019/02/12 - [Language/Python] - [Python 따라하기]3. 자료형_part 2(Tuple,Set,Dictionary)

2019/02/19 - [Language/Python] - [Python 따라하기]4.조건문

2019/02/26 - [Language/Python] - [Python 따라하기]5. 반복문(For, While, break, continue)

2019/03/05 - [Language/Python] - [Python 따라하기]6. 함수만들기(def, print, format)

2019/03/12 - [Language/Python] - [Python 따라하기]7.파일 입출력 (File I/O)

2019/03/19 - [Language/Python] - [Python 따라하기]8.클래스와 상속(Class, inheritance)


예외 처리

프로그램을 만들다 보면 많은 오류를 만난다. 오류가 발생하는 이유는 프로그램이 올바르게 동작되도록 해주는 파이썬의 능력이다. 하지만 가끔은 이러한 오류를 무시하고 싶을 때도 있다. 이러한 기능은 파이썬은 try,except를 이용해서 오류를 처리 해줄 수 있다.

자주 발생하는 에러

오류를 처리하는 방법을 알기 전에 자주 발생하는 에러들에 대해 알아보자.

IndexError

프로그래밍을 하면서 가장 많이 만날 에러이다. 파이썬은 iterable한 객체에 인덱스로 접근을 할 수 있는데 iterable한 객체보다 더 큰 크기의 인덱스로 접근을 할 때 발생한다.

ZeroDivisionError

숫자 0으로 나누었을 때 발생하는 에러이다.

SyntaxError

구문오류로써 이미 프로그래밍 언어에서 고안해둔 것에 대해서 문제가 발생할 때이다. 주로 괄호를 열었으나 닫지 않은 경우에 발생한다.

TypeError

연산, 함수가 계산할 때 데이터의 유형이 잘못되었을 때 발생한다.

오류 처리하기

오류 처리는 다음과 같이 수행을 한다.
try:
<<코드>>
except (발생 오류(as 오류 변수)):
<<코드>>

우선 try 내부에 있는 코드를 수행하고 이를 수행하다가 오류가 발생하면 except 블록이 수행된다. 하지만 try블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.

except 구문을 보면 ()를 사용한 부분이 있는데 그 부분은 생략해도 무관한 부분이다.
따라서 except를 사용하는 방법에 따라서 다음과 같이 나뉘어진다.

1.try,except만 있을 경우

try에서 오류가 발생한 경우 except로 넘어간다.

2.발생오류가 포함되어 있을 경우

적어둔 발생오류가 발생했을 경우에만 except문으로 이동한다.

3.발생오류와 오류변수까지 적은 경우

이러한 경우엔 오류변수에 오류 메세지의 내용이 담겨진다.


Try,Finally

try문은 finally를 사용할 수 있는데, finally는 try문 수행 도중 예외 사항이 발생하지 않더라도 항상 수행된다. 보통 파일을 오픈 한 것을 다시 닫아야 할 때 사용한다.


오류가 여러개 발생했을 경우

오류를 여러개 처리주려고 할 경우 단순히 except를 여러 개 사용하는 것이 아니라 튜플로 묶어서 처리해줘야 한다.

아래와 같은 경우 인덱스 에러가 먼저 발생해서 ZeroDivisionError에 들어가지 않는다.


오류를 일부러 발생시킬 경우

오류를 일부러 발생시키는 것이 이상하게 들릴 수 있지만 종종 필요한 경우가 있다. 파이썬에서는 raise라는 명령어를 사용해서 오류를 강제로 발생시킬 수 있다. 예를 들어 프로그램을 만들다가 아직 구현하지 못한 함수가 있는데 추후에 다시 사용해야 할 때 오류를 발생시키고자 한다.


NotImplementedError는 파이썬 내장 오류로 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 발생시키고자 할 때 사용한다.




2019/01/29 - [Language/Python] - [Python 따라하기]1. Python 설치하기

2019/02/05 - [Language/Python] - [Python 따라하기]2. 자료형_part 1(String, Int,Float, List)

2019/02/12 - [Language/Python] - [Python 따라하기]3. 자료형_part2(Tuple,Set,Dictionary)

2019/02/19 - [Language/Python] - [Python 따라하기]4.조건문

2019/02/26 - [Language/Python] - [Python 따라하기]5. 반복문(For, While, break, continue)

2019/03/05 - [Language/Python] - [Python 따라하기]6. 함수만들기(def, print, format)

2019/03/12 - [Algorithm/Python] - [Python 따라하기]7.파일 입출력 (File I/O)


클래스를 사용하는 이유

클래스를 사용하지 못하면 프로그램을 만들지 못하는 것은 아니다. 클래스를 사용하지 않더라도 충분히 좋은 프로그램을 만들 수 있다.

하지만 클래스를 사용할 수 있다면 조금 더 편한 프로그램을 만들 수 있을 뿐이다.

예를 들어 계산기가 있다고 하자. 계산기에서 연산을 할 때 값들을 계속 누적해서 진행해야 한다. 그러기 위해서는 계산기당 하나의 전역변수와 하나의 함수가 필요하다. 하나의 계산기가 있는 것이라면 문제가 없지만 만약 여러 개의 계산기를 동시에 사용을 해야 한다면 어떻게 해야할까? 계산기가 늘어날 수록 전역변수와 함수가 계속 추가되어야 한다. 그러면 추가될수록 메모리를 많이 차지하게 될 것이다.

하지만 클래스를 사용한다면 하나의 변수와 함수만으로도 독립적인 값들을 유지할 수 있다.

클래스와 객체

클래스와 객체의 관계는 다음과 같이 설명 할 수 있다.

* 신입생 -> 클래스(class)
* 학생1,학생2, .... -> 객체(object)

클래스란 똑같은 무엇인가를 계속해서 만들어낼 수 있는 하나의 틀 같은 것이고(신입생), 객체란 클래스에 의해서 만들어진 것을 뜻한다.

클래스에 의해서 만들어진 객체는 서로 독립적인 성격을 가진다. 하나의 학생의 학적사항이 변동되더라도 다른 학생들에겐 영향을 주지 못하는 것과 같다. 다음은 하나의 간단한 클래스 예시이다.


위의 클래스는 아무런 기능을 가지고 있지 않다. 그래도 이 클래스는 객체를 생성할 수 있다. 다음은 객체를 만드는 방법이다.


학생정보 클래스 만들기

본격적으로 신입생들을 위한 학생정보를 만들어보도록 하자.

학생정보에 들어갈 수 있는 변수로는 이름, 학번, 성별 그리고 듣는 과목들이 있을 것이다. 학생정보에 들어갈 수 있는 함수들로는 각 변수를 설정하는 함수와 총 듣는 과목의 수를 반환해주는 함수, 과목을 추가해주는 함수가 있다고 하자. 다음은 학생정보를 담고 있는 Student 클래스이다.

위의 클래스를 하나씩 뜯어서 확인해보자.

__init__(생성자)

클래스 부분에서 __int__이 있다. 여기서 init 앞 뒤에 있는 것은 '_' 두 개씩 있는 것이다.
클래스에서 이 함수를 생성자라고 부른다. 생성자란 객체가 생성될 때 자동으로 호출되는 메소드이다. 객체의 초기값의 설정을 해줘야 할 때 사용을 한다.

Student의 클래스는 name, s_id, gender ,course라는 변수를 받고 이를 객체의 정보에 저장을 한다. 이 때 self를 사용하는데 지금 생성된 객체에 작용하는 작업이라고 생각하면 된다. 만약 기본 초기값이 설정되어 있지 않으면 변수들중 하나의 값이라도 넣지 않는다면 TypeError가 발생한다.


__str__(출력)

클래스 부분에서 __str__이 있다. 이것을 문자열화 함수라고 한다. 객체를 출력할 때의 형식을 지정해주는 함수이다.

__eq__(비교자)

클래스 부분에서 __eq__가 있다. 이것을 비교 함수라고 한다. 객체간의 값을 비교(==)할 때 사용을 한다.

클래스 내장 함수

일반적으로 string이나 list에서 제공해주는 함수처럼 이 클래스에서 제공해주는 함수이다.


상속

여기서 상속은 "재산을 상속받다" 라고 할 때의 상속과 같은 의미이다. 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있는 것이다. 이 상속의 개념을 이용해서 각 학과 별로 신입생에게 기능을 추가할 수 있다. 예를 들어 컴퓨터공학과 학생들에게는 파이썬을 할 수 있는지 물어보는 함수가 있다고 하자. 그러면 다음과 같이 Student 클래스를 상속받아 기능을 추가 할 수 있다. 그리고 상속 클래스를 만들 때는 다음과 같은 형식을 가진다.

class <<자식 클래스 이름>>(<<부모 클래스 이름>>):
<<내용>>



Computer_Student에서 구현을 하지 않았지만 Student의 내용들을 상속받았으므로 Student의 생성자, 문자열화 함수등의 내용들을 사용할 수 있다.

그리고 또한 Computer_Student에서만 구현된 canDoPython도 사용이 가능하다.



메소드 오버라이딩

메소드 오버라이딩은 상속받은 클래스에서 부모 클래스에 정의된 함수를 상속받은 클래스에서 재정의함으로써 사용을 하는 것이다. 컴퓨터 공학과 학생들은 수강신청을 할 때 6과목이 넘는다면 신청을 할 수 없다는 기능을 추가해주고 싶다. 그러면 동일한 이름으로 재정의를 해서 부모클래스의 함수를 덮어버리는 것이다.





파일 입출력

 만약 당신이 엄청 긴 문자열 중에 특정 단어를 세야 하는 업무를 받았다고 하자. 그렇다면 문자열을 하나의 변수로 받아 count 함수를 사용해서 단어를 세면 된다고 생각할 수 있다. 이 일을 하기 위해 문자열을 변수에 저장하려고 했는데 이 문자열의 양이 너무 많았다. 직접 타이핑하는 것은 불가능하고 복사해서 붙여 넣는 방법을 사용하기에도 여러 페이지로 되어 있어서 오래 걸릴 작업이다. 그렇다면 이와 같은 경우에는 어떻게 해야 할까?

이럴 경우에는 이 문자열을 하나의 txt 파일로 저장을 한 뒤, 이를 입력으로 받아오면 된다. 이처럼 프로그래밍에서는 외부 파일을 '입력'으로 받아서 여러 작업을 할 수 있다. 또한 내가 프로그래밍을 하면서 작성한 내용을 txt에 출력도 가능한데, 이를 파일 입출력이라고 부른다.

import os

파일 입출력을 하기에 앞서 파일을 작성하거나 읽어오기 위해서는 현재 파이썬이 실행되고 있는 위치가 중요하다. 지금 파이썬이 실행되고 있는 위치에 있는 파일에만 읽어올 수 있거나 작성을 할 수 있기 때문이다. 따라서 이를 관리하기 위해서 python에서 파일의 경로에 관한 함수를 제공해주는 os라는 내장 모듈이 있다.

os.getcwd()

os.getcwd()는 현재 python이 작업하고 있는 파일 디렉토리의 경로를 얻어오는 함수이다. 현재 작업하고 있는 위치를 확인을 할 수 있고, 만약 작업 디렉토리의 경로를 이동한다면 잘 이동했는지 확인을 할 수 있다.


os.chdir()

os.chdir()는 작업 디렉토리의 경로를 바꿔주는 함수로 매개변수로 내가 바꾸고 싶은 경로를 입력해주면 된다.


다음은 예시 파일이다. file_example.txt

파일 입출력하는 방법

파일을 읽어오는 방법은 open이라는 함수를 사용하는 것이다. open은 보통 다음과 같이 사용하며 파일 객체를 반환한다.

file=open( <<파일 명>>, <<파일 모드>>,....)

 이외에도 encoding과 같은 매개변수가 존재하나, open은 위 두 개의 매개변수를 주로 사용한다. 첫 번째 매개변수는 내가 열 파일의 이름이거나 작성할 파일의 이름이고, 두 번째 매개변수는 모드를 선택하는 것이다. 모드는 'r' 모드, ' w ' 모드 , 'a' 모드가 있는데 r은 읽기 모드, w는 쓰기 모드, a는 추가 모드이다. 그리고 가장 중요한 것으로 항상 파일을 open을 했다면 close를 해 주어야 한다. 일반적으로 프로그램을 종료하면 자동으로 close가 되기는 하나 닫아주는 편이 좋다.

따라서 파일을 읽어 오는 방법은 다음과 같이 "r" 모드를 사용하면 된다.

쓰기 모드

쓰기 모드는 open(내가 작성할 파일 명,"w")과 같이 사용하며 내가 작성하고 있는 파일 공간에 그 파일 명의 txt 파일이 없다면 생성하여 작성한다. 만약 동일한 명의 txt 파일이 있다면 그 안의 내용을 지우고 새로 작성한다.


읽기 모드

위에서 본 것처럼 'r' 모드로 열면 파일의 내용이 아닌 파일 객체를 반환하게 된다. 이를 함수를 사용해서 읽어내야 하는데 3가지 방법이 있다.

readline

readline은 한 줄씩 읽는 방법이다. 하나의 readline 당 txt 파일의 한 줄을 읽어오며 txt 파일을 전부 읽어오려면 여러번의 readline을 사용해야 한다.



위처럼 readline으로 읽어와 print 할 경우 두 번 줄바꿈을 하는 것을 알 수 있다. 그 이유는 readline으로 읽어올 때, 문자열의 끝에 "\n"이 붙어 있기 때문이다. 따라서 이를 막기 위해서 문자열의 공백이나 줄바꿈을 없애주는 함수인 strip을 사용하도록 한다.


readlines

readlines 에서 더 발전된 형태로 파일을 모두 읽어서 각각의 줄을 하나의 요소로 가지는 리스트로 리턴 된다. 즉 ["......\n",".....\n",".......\n"]과 같은 형식을 가지고 있다.

read

read는 파일 내용 전체를 문자열로 리턴한다.








+ Recent posts