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

 

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는 파일 내용 전체를 문자열로 리턴한다.








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)


함수를 사용하는 이유

수학에서는 함수는 f(x)=x^2와 같이 만들고, f(2)=4 와 같이 활용한다. 여기서 f(x)를 함수라고 부르고, x^2은 함수의 내용, 2는 입력값, 4는 결과값이라고 한다. 이와 동일한 구조로 프로그래밍에서도 함수를 만들어서 사용한다.

프로그래밍에서 수학연산을 하기 위해서 함수를 만드는 것은 아니다. 프로그래밍을 하다가 보면 반복적으로 똑같은 작업을 해야 하는 경우가 있을 것이다. 이 작업을 줄이고자 의미가 있는 부분들을 묶어서  함수로 만드는 것이다. 수학에서의 함수와 같이 '하나의 함수당 함수의 내용이 있고, 입력값을 넣으면 출력값이 나온다' 와 같은 방법으로 만든다.

함수의 구조

파이썬 함수의 구조는 다음과 같이 구성된다.

def 함수명(매개변수):
<<수행할 문장들>>

def는 함수를 만들겠다는 예약어이며 함수명, 매개변수, 수행할 문장들은 사용자가 임의로 작성하는 것이다. 조건문과 반복문처럼 함수의 속하는 부분임을 나타내기 위해서 들여쓰기를 사용한다.

다음은 함수의 간단한 예시이다.


여기서 return은 함수의 결과값을 반환해주는 명령어이다.

이 함수는 두 개의 변수 x,y를 받아서 두 개의 합을 반환해주는 함수이다.



위 함수의 구조는 입력값이 있고, 결과값이 있는 일반적인 구조이다.

만약 입력값이 없거나, 결과값이 없는 함수의 구조도 가능할까??



다음과 같이 입력값 혹은 결과값이 없더라도 함수가 동작하는데엔 아무런 문제가 없다.

만약 입력값이 몇 개가 될지 모를 경우

입력값이 여러 개일 때 그 입력값을 다 더해주는 함수를 만들어보자. 하지만 몇 개가 입력될지 모른다면 어떻게 해야할까?
이와 같은 경우에는 *를 사용하면 된다.


매개변수 앞에 *를 사용하면 몇 개가 들어가던지, 전부 모아서 튜플로 바꾸어주기 때문에 상관이 없다.

*매개변수는 단독으로 사용하는 것 이외에도 다른 일반 변수와도 함께 사용가능하다.


return 

return은 함수 값을 반환해주는 명령어로써 사용한다면 하나의 함수에서 한 개만 사용이 된다. 이 점을 이용해서 함수를 끝내는 용도로 사용할 수 있다.
다음 함수는 number로 5를 받으면 return을 만나서 number를 print를 하지 않고 종료됨을 알 수 있다.

초기값을 미리 설정해둘 경우

함수의 매개변수에 미리 초기값을 정해둘 수 있다. 초기값을 정해둔 함수의 경우 함수를 사용할 때 그 값을 넣어 주지 않으면 미리 정해진 값으로 함수를 실행한다. 만약 초기값을 무시하고 값을 넣어준다면 초기값이 아닌 내가 설정한 값으로 함수를 실행한다.

Global , local

함수내에서 사용되는 변수의 성격은 local이라고 할 수 있다. 즉 함수내에서 정의되어 있는 변수는 함수 외부에는 영향을 주지 않는다는 것이다. 다음을 보면 함수 밖에 있는 number가 1로 정의 되어 있고 함수를 통해 number가 2배로 증가 되었을 것 같지만 그렇지 않다.

우리가 정의한 number는 함수 외부의 정의이고 함수 내부에서 2배를 해준 number는 단지 함수 내에서만 사용하는 변수지 밖의 number에는 영향을 주지 못한다는 것이다.


만약 함수 내부의 변수를 외부에 영향을 주려면 어떻게 해야 할까??


두 가지 방법이 있다.

return 

우리가 지금까지 외부의 변수에 영향을 줄 수 있었던 이유는 return을 사용했기 때문이었다.

Global

이 방법은 외부의 변수를 global이라고 재정의를 해서 직접 외부의 변수를 사용하겠다고 명시를 하는 것이다.

보통 global이라고 명시를 해서 사용하기 보단 return을 사용한 방법을 이용한다. 그 이유는 단순한 함수의 경우에는 문제가 없지만 함수가 복잡해질수록 global한 변수는 제어하기 힘들어지기 때문이다. 


Print

지금까지 출력하는 함수인 print를 별다른 설명없이 사용하고 있었다. 하지만 print 내에서도 여러 기능을 제공하고 있었다.
print의 구조는 다음과 구성되어 있다,

print(value,....sep=' ',end='\n',file=sys.stdout,flush=False)

보통 print의 sep이나 end까지만 사용하고 file이나 flush는 사용하지 않는다.

print 내에서 여러 문자열을 + 로 이어가거나 콤마(,)를 사용해서 출력한다. 이 둘의 차이점은 + 은 띄어쓰기를 지원해주지 않지만 콤마로 구분을 하면 띄어쓰기를 해주기 때문이다. 이 이유는 콤마가 sep을 나타내는데, sep의 기본값은 공백으로 설정되어 있기 때문이다.


위에서도 말했듯이 콤마가 sep이 공백으로 설정되어 있기 때문에 띄어쓰기를 했다면 sep값을 주면 콤마를 사용했을 때 그 사이사이에 sep이 들어가게 된다.



또한 출력을 하면 하나의 print 당 한 줄에 나타나게 되는데, 그 이유는 print의 end의 기본값이 줄바꿈으로 설정되어 있기 때문이다.



따라서 end값을 공백으로 변경해준다면 한 줄에 모든 값을 표시해 줄 수 있다.


문자열 포맷팅

한 과일가게가 있다고 하자. 이 가게는 과일의 남은 양들을 공지해주는 프로그램을 만들었다. 그 프로그램은 다음과 같이 공지한다.

"사과가 7개 있습니다."

손님이 와서 사과를 2개 사갔다고 하자. 그러면 다음과 같이 수정된다.

"사과가 5개 있습니다."

위의 두 문자열은 동일한데 숫자 7과 5만 다르다. 이렇게 큰 틀이 있고 특정 부분만 바꾸어서 계속 사용해야하는 문자열이 있다면 문자열 포맷팅을 사용하면 더 편하게 사용할 수 있다.

문자열 포맷팅을 하는 방법에는 크게 세 가지 방법이 있다.

1. % 사용하기
2. format 함수 사용하기
3. f 사용하기

1. % 사용하기

%를 사용할 경우 문자열 포맷코드가 있다. %+"..."와 같은 형태로 사용한다.

코드 

설명 

%d 

 정수형

%s 

 문자열

%f 

부동소수점 

%% 

단어 '%' 


2. format 함수 사용하기

format 함수를 사용하면 좀 더 유연하게 문자열 포맷팅을 하는 것이 가능하다. 포맷팅을 하고 싶은 부분들을 { }로 표시를 하며 { }에 숫자를 집어 넣어서 포맷팅의 순서를 지정할 수 있고, 숫자를 생략한다면 가장 먼저 만나는 { }부터 차례대로 포맷팅해준다.

3. f 사용하기

파이썬 3.6버젼부터 제공하는 기능으로 그 이전 버젼에서는 사용할 수 없다. 문자열 앞에 f를 붙여서 문자열 포맷팅을 할 수 있다.




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.조건문

반복문

 같은 작업을 반복적으로 해야할 때, 반복문을 사용한다면 작업의 양이 줄어들 뿐만 아니라 보기에도 깔끔해지게 된다.
반복문에는 크게 for와 while 두 가지가 있다.



For

for는 주로 list 혹은 String과 같이 반복가능한 객체를 한 번씩 훑어보기 위해서 사용한다. for의 구조는 다음과 같다.

for <<variable>> in <<iterable>>:
<<contents>>

if 절과 같이 for 즉 반복적으로 행할 내용들은 for에 속하는 것임을 나타내기 위해서 indentation(들여쓰기)을 설정해둔다.
if 절과 같이 들여쓰기는 스페이스바 4번이나 탭 한번으로 통일하여 사용한다.
variable은 사용자가 임의로 변수를 설정해서 사용하는데 주로 i , j, k .... 순으로 사용하는게 일반적이다.
다음과 같이 iterable에 String 값을 넣으면 한 글자(char)씩 반복하며 진행한다.


Range

for 반복문을 사용할 때 iterable 부분에 list나 String 값을 넣어서 직접 값을 탐색하며 진행을 하기도 하지만 range를 사용해서 인덱스로 접근을 하기도 한다.
range는 range((start),stop,(step))으로 구성되어 있다. start(선택사항)부터 stop(필수적)까지 step(선택사항)씩 연속적인 정수 객체를 만들어 준다.


range 함수로 만들어진 값은 list와 비슷하게 작동을 하지만 range라는 객체를 가지고 있다. 따라서 list에 사용하는 메소드들을 사용하는 것은 불가능 하므로 사용하기 위해서는 list로 변환 후 사용해야 한다.



다음은 range 와 len 함수를 사용해서 인덱스로 배열값들을 접근하는 경우이다. iterable 자리에 list 나 String을 넣어서 직접 값에 접근을 하게 되면 하나의 배열만 반복문을 사용할 수 있지만 다음과 같이 range와 len을 사용하면 길이가 같은 두 개의 배열을 동시에 반복문을 사용할 수 있다.



enumerate

range에선 인덱스로 접근할 수 없다는 단점을 보완하기 위해서 인덱스와 값을 동시에 접근 할 수 있도록 해주는 함수이다.
enumerate(iterable)로 사용을 하며 인덱스와 값을 쌍으로 가지는 튜플값을 하나의 원소로 가지는 enumerate 객체로 반환을 한다.
enumerate((0,iterable[0]),(1,iterable[1]),.....)



이중 반복문

이중 반복문이란 반복문안에 반복문을 사용하는 것으로 주로 행렬을 나타내고자 할 때, 서로 연관있는 두 개의 반복가능한 객체를 동시에 사용하고자 할 때 사용한다.


위처럼 두 개의 반복문을 사용할 때 서로 각각의 variable을 사용해야 하며 first의 한 값당 second가 한 루틴씩 실행됨을 알 수 있다.


또한 들여쓰기에 따라서 실행되는 횟수가 달라지는데 print(i+"번째 중"+j+"번째")는 i와 j 둘다 속해있는 부분이라 총 9번 실행됨을 알 수 있지만

print("---------------")는 i에만 해당하는 부분이므로 3번만 실행됨을 알 수 있다.


While

while 반복문은 내가 얼마나 반복문을 사용해야 할지 정확히 모를 때 사용하거나 중복적인 인덱스 혹은 값을 접근해야 할 경우에 사용한다.


while의 구조는 다음과 같다.


while <<condition>>:

<<contents>>


while은 for와 달리 순차적으로 진행을 하지 않고 condition이 참인 경우에만 while 내의 내용을 반복한다. 이 말은 condition이 거짓이 될 때까지 계속 반복한다는 뜻이다. 따라서 처음에는 condition이 참이어야 while문이 실행이 되지만 contents를 진행하면서 condition이 거짓이 되도록 만들어야 한다. 그렇지 않으면 무한반복에 빠지게 된다. 만약 무한반복에 빠지게 된다면 ctrl+c 혹은 쥬피터를 사용한다면 위의 정지버튼을 누르면 된다.



아래는 탈출 조건이 없으므로 무한반복에 빠지게 된다.



반복문을 더 효율적으로 활용하기 위해서 break와 continue를 사용할 수 있다.


break

반복문 진행중에 이미 원하는 바를 이뤄서 뒤의 진행이 필요가 없을 수 있다. 따라서 더 효율적으로 사용하기 위해 반복문이 한참 진행중이라도 일정 조건을 만나면 반복문이 끝나게 만들어주는 것이 break다. 또한 while에서는 condition이 아직 참이라도 break를 만나면 반복문이 바로 끝내도록 할 수 있다.
break는 다음과 같이 사용한다.

continue

break는 일정 조건을 만나면 반복문을 깨뜨리지만 continue는 일정 조건에서만 반복문이 진행되지 않도록 한다. 반복문 내에서 continue를 만난다면 아직 반복문 내에 남은 내용이 있더라도 작동하지 않고 다음 값으로 넘어간다. continue는 다음과 같이 사용한다.


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)

Bool Type

Bool Type은 이전에 소개했던 자료형처럼 참과 거짓을 나타내는 자료형이다.

Bool Type은 Boolean이라고도 부르며 True와 False 두개의 값만을 가진다. 또한 Boolean 연산자로는 and, or, not 이 있다.


not은 부정 연산자로 True면 False를 False이면 True를 리턴한다. 


and는 전부 참일 경우에만 True를 리턴하고 하나의 False만 있어도 False를 리턴한다.


or은 전부 거짓일 경우에만 False를 리턴하고 하나의 True만 있어도 True를 리턴한다.



Relation Operators(관계 연산자)

관계 연산자란 흔히 알고 있는 > , < , >=, 등을 일컫는다. 연산자의 리턴 값은 Bool이다.


관계 연산자 중 '같다' 가 수학에서 사용하는 기호와는 다르다는 점을 주의해야 한다. 수학에서는 ' = '이 '같다' 라는 의미를 가지고 있지만 프로그래밍 언어에서는 '변수에 값을 대입을 한다.' 라는 의미로 사용한다. 따라서 프로그래밍 언어에서 '같다' 라는 관계 연산자를 사용하고자 하면 '=='를 사용해야 한다.



관계 연산자는 숫자 값들에서만 사용할 수 있는 것이 아닌 String에서도 사용이 가능하다. 그 이유는 컴퓨터에서는 String을 표현하기 위해서 Ascii 코드를 사용하기 때문이다. Ascii 코드는 문자열이나 특수문자를 숫자로 변환한 코드로 미리 정해져 있다. Ascii 코드표는 구글에서 검색을 한다면 쉽게 얻을 수 있다.


If Statement(조건문)

if 절은 다음과 같이 구성되어 있다.

if <<condition>>:
contents

condition의 내용이 True 이면 contents의 내용을 수행하고 False이면 contents 내용을 수행하지 않고 넘어간다.
if에 속해있는 내용이라는 점을 구별하기 위해서 들여쓰기(indentation)를 사용한다. Python에서는 이 들여쓰기는 스페이스바 4번 혹은 tab키 1번으로 통일하여 사용하는데 자신이 편한 방향으로 통일하여 사용하면 된다. 같은 if 절에 속하는 내용이면 모든 content에 들여쓰기를 사용해야 하며 들여쓰기가 끝나는 지점부터는 if절에 속하지 않는 부분으로 판단하게 된다.
다음은 조건문을 사용한 간단한 예시이다.

input() 함수는 사용자가 직접 변수값을 입력하도록 하는 함수이다. 반환값은 항상 string이다. ()안에 다음과 같이 글귀를 넣으면 다음과 같이 글귀를 print 하면서 변수값을 받을 수 있다.


조건문에는 if 이외에도 else와 elif가 존재한다.


else는 해석 그대로 나머지를 뜻한다. if 절에서 if에 있는 조건문 이외의 모든 부분들을 수행한다. 다음과 같은 예시에서는 13세 이상 65세 미만의 경우에는 if절에 해당하는 조건이지만 그 외에의 나이 즉 13세 미만 65세 이상의 나이들은 else 절에 들어가게 된다.



하지만 어떤 경우에는 같은 변수에 대해서 여러 개의 조건을 취하고 싶은 경우도 있을 것이다. 그럴 경우 if를 여러 개 사용하여 조건문을 만들어도 상관이 없지만 다음과 같이 elif를 사용하면 간단하게 줄일 수 있다. elif란 else if 의 줄임말으로 if에 해당하지 않는 조건 중에 추가 조건을 걸어주는 것이다. 다음과 같이 elif를 사용하면 elif에 해당하는 조건으로 들어가게 된다.



else나 elif는 생략해도 무관하기 때문에 작성하지 않아도 괜찮지만 if절은 사용하면 무조건 contents에 하나의 코드라도 작성을 해야한다


만약 일부 조건에 대해서 아무런 조치를 취하지 않고 싶을 경우에는 pass 라는 사용하면 된다. pass는 말 그대로 코드를 실행하지 않고 넘긴다는 뜻이다.



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


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


Tuple형

튜플은 값을 변경시킬 수 없다는 점을 제외하고는 리스트와 동일하다. 여기서 '값을 변경시킬 수 없다'라는 것은 값을 수정, 변경, 삭제를 할 수 없다는 것이다.


리스트와 동일하게 인덱싱과 슬라이싱을 할 수 있지만 값을 변경시키는 것은 불가능하다.



리스트와 같이 덧셈과 곱셈의 사칙연산을 지원한다.



 Tuple 자료형은 값을 변경시킬 수 없다는 점이 가장 큰 특징이며, 이 점을 이용해서 값이 변하면 안되는 것, 혹은 잘 변하지 않는 값을 사용하는 경우에 사용한다.


Set(집합형)

Set은 집합 자료형으로 집합에 관련된 연산을 지원해준다. set() 연산자를 이용하거나 {}를 사용해서 집합 자료형을 사용하며 2가지의 큰 특징이 있다.

1.순서가 없다

2.중복이 없다.


 '순서가 없다'라는 특징은 위의 Hello 와 같이 set으로 자료형을 변환하면서 각 글자의 위치가 달라졌다는 것을 의미한다. 따라서 '순서가 있다' 라는 특징을 가지는 리스트와 튜플과 달리 인덱싱과 슬라이싱 기능을 사용할 수 없다.


'중복이 없다'라는 특징은 Hello 두 개의 l 이 있지만 set 자료형에서는 하나의 l 만 있는 것을 확인 할 수 있다. 따라서 이 점을 이용해서 다른 자료형의 중복을 제거하기 위해 사용한다.


집합 사칙연산

집합 자료형이므로 교집합, 합집합, 차집합과 같은 연산을 지원한다.

교집합

두 집합 사이의 공통된 요소를 반환한다. & 를 사용하거나 intersection()을 사용한다.

합집합

두 집합을 합치는 작업을 수행한다. | (shift + \ )을 사용하거나 union()을 사용한다.

차집합

두 집합의 차를 수행한다. - 연산자를 사용한다.


내장함수

값 추가하기

하나의 값을 추가할 경우 add()를 사용하고 여러 값을 추가해야 할 경우 update()를 사용한다.

값 제거하기

값을 제거하고 싶을 경우 remove를 사용하면 된다.


Dictionary

Dictionary 자료형은 key 값과 value 값으로 구분되어져 있다. 즉 과일에 대한 dict 자료형이라고 하면 사과의 갯수 4개, 바나나의 갯수 5개...와 같이 대응 관계를 가지고 있는 자료형이다. 이와 같은 자료형을 다른 프로그래밍 언어에서는 해쉬(Hash)라고 부른다. 다음과 같이 사용하며 상당부분 set과 비슷한 성질을 가지고 있다.



일반 적으로 key에는 변하지 않는 값을 value에는 변하는 값을 넣도록 한다.

딕셔너리 자료형에 값은 다음과 같이 추가 및 제거를 한다.


딕셔너리도 set과 같은 성질을 가지고 있기 때문에 숫자로 인덱싱과 슬라이싱을 할 수 없다. 대신 key 값을 통해서 value 값에 접근 할 수 있다.


또한 중복을 허용하지 않으므로 같은 key 값은 존재할 수 없다.



내장 함수

key 리스트 만들기

keys()는 딕셔너리의 key 값들만 모아서 리스트로 반환을 한다. 이 때 우리가 알고 있는 list 자료형이 아닌 dict_keys라는 객체로 반환하는데 리스트와 동일하게 반복문에서 사용할 수 있다. 이를 리스트로 만들고자 하면 list()함수를 사용하도록 한다.


value 리스트 만들기

values()는 딕셔너리의 value 값들만 모아서 리스트로 반환을 한다. keys()와 마찬가지로 dict_values로 반환을 하고 동일하게 사용한다.

item 리스트 만들기

items()는 딕셔너리의 쌍들을 모아서 tuple로 묶어 리스트로 반환을 한다. keys()와 마찬가지로 dict_items로 반환을 하고 동일하게 사용한다.


+ Recent posts