반응형

04. NumPy 기본: 배열과 벡터 연산

4.2 유비버설 함수: 배열의 각 원소를 빠르게 처리하는 함수

ufunc라고 불리기도 하는 유니버설 함수는 ndarray안에 있는 데이터 원소별로 연산을 수행하는 함수다

유니버설 함수는 하나 이상의 스칼라값을 받아서 하나 이상의 스칼라 결괏값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 백터화된 래퍼 함수라고 생각하면 된다.

np.sqrt(arr)

np.exp(arr)

위 함수들은 단항 유니버설 함수라고 한다.

add나 maximum 처럼 2개의 인자를 취해서 단일 배열을 반환하는 함수는 이항 유니버설 함수라고 한다.

modf는 파이썬 내장함수인 divmod의 백터화 버전인데, 분수를 받아서 몫과 나머지를 함께 반환한다.

 

4.3 배열을 이용한 배열지항 프로그래밍

Numpy 배열을 사용하면 반복문을 작성하지 않고 간결한 배열 연산을 많은 종류의 데이터 처리 작업을 할 수 있다.

배열 연산을 사용해서 반복문을 명시적으로 제거하는 기법을 흔히 벡터화라고 부르는데,

일반적으로 벡터화된 배열에 대한 산술 연산은 순수 파이썬 연산에 비해 2~3 배에서 많게는 수집, 수백 배 까지 빠르다.

브로드캐스팅 은 아주 강력한 벡터 연산 방법이다.

 

np.meshgrid함수는 두 개의 1차원 배열을 받아서 가능한 모든(x,y) 짝을 만들 수 있는 2차원 배열 두개를 반환한다.

np.meshgrid 가능한 모든 짝 

 

4.3.1 배열 연산으로 조건절 표현하기

numpy.where함수는 x if 조건 else y같은 삼항식의 벡터화된 버전이다.

xarr = np.array([1.11.21.31.41.5])

yarr = np.array([2.12.22.32.42.5])

cond = np.array([TrueFalseTrueTrueFalse])

 

result = [(x if c else y) for x,y,c in zip(xarr, yarr, cond)]

print(result)

 

result = np.where(cond, xarr, yarr)

print(result)

numpy.where로 넘기는 배열은 그냥 크기만 같은 배열이거나 스칼라 값이 될 수 있다.

 

4.3.2 수학 메서드와 통계 메서드

배열 전체 혹은 배열에서 한 축을 따르는 자료에 대한 통계를 수학 함수는 배열 메서드를 사용할 수 있다.

sum, mean, std Numpy의 최상위 함수를 이용하거나 배열의 인스턴스 메서드를 사용해서 구할 수 있다.

axis 인자를 받아서 해당 aixs 에 대한 통계를 계산하고 한 차수 낮은 배열을 반환한다.

 

cumsum과 cumprod메서드는 중간 계산값을 담고 있는 배열을 반환한다.

다차원 배열에서 cumsum같은 누산 함수는 같은 크기의 배열을 반환한다. 하지만 축을 지정하여 부분적으로 계산하면 낮은 차수의 슬라이스를 반환한다.

 

4.3.3 불리언 배열을 위한 메서드

1 True

0 False

any와 all 메서드는 불리언 배열에 특히 유용하다.

any메서드는 하나 이상의 값이 True인지 검사하고 ,

all 메서드는 모든 원소가 True인지 검사한다.

 

4.3.4 정렬

sort()메서드에 

np.sort 메서드는 배열을 직접 변경하지 않고 정렬된 결과를 가지고 있는 복사본을 반환한다.

배열의 분위수를 구하는 쉽고 빠른 방법은 우선 배열을 정렬한 후 특정 분위의 값을 선택하는 것디아.

 

4.3.5 집합 관련 함수

Numpy 는 1차원 ndarray 를 위한 몇가지 기본적인 집합 연산을 제공한다.

np.unique()

np.in1d함수는 두개의 배열을 인자로 받아서 첫 번쨰 배열의 원소가 

두번째 배열의 원소를 포함하느닞 나타내는 불러언 배열을 반환한다.

 

 

4.4 배열 데이터의 파일 입출력

Numpy는 디스크에서 텍스트나 바이너리 형식의 데이터를 불러오거나 저장할 수 있다.

pandas 

 

npy 파일 과 npz파일 

npy 파일

np.save와 np.load는 배열 데이터를 효과적으로 디스크에 저장하고 불러오기 위한 함수다.

배열은 기본적으로 압축되지 않은 원시(가공되지 않은) 바이터리 형식의 .npy파일로 저장된다.

.npy 로 끝나지 않으면 자동적으로 확장자가 추가된다.

np.save()

np.load()

 

npz 파일

np.savez 함수를 이용하면 여러 개의 배열을 압축된 형식으로 저장할 수 있는데, 저장하려는 배열을 키워드 인자 형태로 잔달한다.

npz파일을 불러올 떄는 배열을 필요할 때 불러올 수 있도록 사전 형식의 객체에 저장한다.

np.load()

p.savez_compressed: 압축이 잘 되는 데이터 

np.savez_compressed() 

 

4.5 선형대수

행렬의 곱셈, 분할, 행렬식 그리고 정사각 행렬 수학 같은 선형대수는 배열을 다루는 라이브러리에서 중요한 부분이다.

매트랩 

행렬 곱셈 dot

x.dot(y) np.dot(x,y)

 

numpy.linalg는 행렬의 분할과 역행렬, 행렬식과 같은 것들을 포함하고 있다.

이는 매트랩, R같은 언어에서 사용하는 표준 포트란 라이브러리인 BLAS, LAPACK또는 Intel MKL Math Kernel Library(Numpy 빌드에 따라 다르다)을 사용해서 구현되였다.

from numpy.linalg import inv, qr

X = np.random.randn(5,5)

mat = X.T.dot(X)

print(inv(mat))

 

print(mat.dot(inv(mat)))

 

q,r = qr(mat)

print(r)

print(q)

반응형
반응형

3.3 파일과 운영체제

f= open()

줄끝 end-of-line EOL

f.close()

 

파일을 읽을 떄는 read,seek,tell메서드를 주로 사용하게 되는데 read메서드는 해당 파일에서 특정 개수만큼의 문자를 반환한다.

 

with open(path) as f:

  lines = [x.rstrip() for x in f]

 

read메서드는 읽은 바이트만큼 파일 핸들의 위치를 옮긴다.

tell메서드는 현재 위치를 알려준다.

seek 메서드는 파일 핸들의 위치를 해당 파일에서 지정한 바이트 위치로 옮긴다.

 

파일의 텍스트를 기록하려면 write나 writelines메서드를 이용하면 된다.

 

3.3.1 바이트와 유니코드

b를 추가해서 열 수 있는 이진 모드와는 다르다.

UTF-8 인코딩을 사용하는 비-아스키 문자가 포함된 파일

 

04. NumPy 기본: 배열과 벡터 연산

Numpy는 Numerical Python의 줄임말 

파이썬에서 산술 계산을 위한 가장  중요한 필수 패키지 중 하나다. 

 

효율적인 다차원 배열인 ndarray는 빠른 배열 계싼과 유연한 브로드캐스팅 기능 제고

반복문을 작성할 필요 없이 전체 데이터 배열을 빠르게 계ㅆ산할 수 있는 표준 수학 함수

배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구와 메모리에 적재된 파일을 다루는 도구

선형대수, 난수 생성기, 푸리에 변환 기능

c,c++ ,포트란으로 작성한 코드를 연결할 수 있는 C API

 

Numpy의 C API는 사용하기 쉬우므로 저 수준 언어로 작성된 외부 라이브러리에 데이터를 전달하거나 반대로 외부 라이브러리에서 NumPy 배열 형태로 파이썬에 데이터를 전달하기 용이하다.

Numpy 배열 과 배열 기반 연산에 대한 이해를 한 다음 pandas 같은 배열 기반 도구를 사용하면 휠씬 더 효율적이다.

 

Numpy는 일반적인 산술 데이터 처리를 위한 라이브러리를 제공하기 떄문에 많은 독자가 통계나 분석, 특히 표 형식의 데이터를 처리하기 위해 pandas를 사용하기 원할 것이다.

 

내장 파이썬의 연속된 자료형들 보다 휠씬 더 적은 메모리를 사용한다.

파이썬 반복문을 사용하지 않고 전체 배열에 대한 복잡한 계산을 수행할 수 있다.

 

numpy 휠씬 빠르다.

 

4.1 Numpy ndarray :다차원 배열 객체

Numpy 의 핵심 기능 중 하나는 ndarray 라고 하는 N차원의 배열 객체인데 파이썬에서 사용할 수 있든 대규모 데이터 집합을 담을 수 있는 빠르고 유연한 자료구조다.

배열은 스칼라 원소간의 연산에 사용하는 문법과 비슷한 방식을 사용해서 전체 데이터 블록에 수학적인 연산을 수행할 수 있도록 해준다.

import numpy as np
data = np.random.randn(2,3)
print(data)

산술 연산

print(data*10)
print(data+data)

from numpy import *

print(data.shape)
print(data.dtype)

4.1.1 ndarray 생성하기

배열을 생성하는 가장 쉬운 방법은 array함수를 이용하는 것이다.

data1 = [6, 7.5, 8, 0,1]
arr1 = np.array(data1)
print(arr1)

data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
print(arr2)

print(arr2.ndim)

print(arr2.shape)

print(np.zeros(10))

print(np.zeros((3,6)))

print(np.zeros((2,3,2)))

np.empty 는 0으로 초기화된 배열을 반환하지 않는다.

empty함수는 최기화되지 않은 배열을 생성한다.

최기화되지 않는 '가비지' 값으로 채워진 배열을 반환한다.

명시하지 않으면 float64(부동소수점) 가 될것이다.

 

4.1.2 ndarry의 dtype

dtype은 ndarray가 메모리에 있는 특정 데이터를 해석하기 위해 필요한 정보(또는 메타데이터)를 담고 있는 특수한 객체다.

arr1 = np.array([1,2,3], dtype = np.float64)

dtype로 type를 설정한다.

 

4.1.3 Numpy 배열의 산술 연산

배열의 중요한 특징은 for문을 작성하지 않고 데이터를 일괄 처리할 수 있다는 것이다.

백터화라고 하는데 , 같은 크기의 배열 간의 산술 연산은 배열의 각 원소 단위로 적용된다.

브로드캐스팅 : 크기가 다른 배열 간의 연산 broadcasting

arr[5:8].copy()를 사용해서 명시적으로 배열을 복사해야 한다.

 

슬라이스로 선택하기

 

4.1.5 블리언값으로 선택하기

numpy.random모듈에 있는 randn함수를 사용해서 임의의 표준 정규분포 데이터를 생성하자.

비교 연산 == 벡터화

!= 혹은 ~ 

 

4.1.6 팬시 색인

팬시 색인은 정수 배열을 사용한 색인을 설명하기 위해 Numpy에서 차용한 단어다.

 

arr = np.empty((8,4))

for i in range(8):

  arr[i] = i

 

print(arr)

arr[[4,3,0,6]]

-이면 끝으로 선택한다.

 

reshape 행렬의 행(로우) 과 열(컬럼) 

 

4.1.7 배열 전치와 축 바꾸기

배열 전치는 데이터를 복사하지 않고 데이터의 모양이 바뀐 뷰를 반환하는 특별한 기능이다.

ndarray는 transpose메서드와 T라는 이름의 특수한 속성을 가지고 있다.

arr = np.arange(15).reshape((3,5))

print(arr)

print(arr.T)

행렬 계산을 할 떄 자주 사용되게 될 텐데 , np.dot

arr = np.random.randn(6,3)

print(arr)

 

print(np.dot(arr.T, arr))

arr = np.arange(16).reshape((2,2,4))

print(arr)

 

print(arr.transpose((1,0,2)))

swapaxes라는 메서드가 있는데 두 개의 축 번호를 받아서 배열을 뒤바꾼다.

print(arr)

print(arr.swapaxes(1,2))

swapaxes 도 마찬가지로 데이터를 복사하지 않고 원래 데이터에 대한 뷰를 변환한다.

반응형
반응형

3.1.5 집합

유일한 원소만 담는 정렬되지 않은 자료형이다.

set()

 

집합은 합집합, 교집합 , 차집합 , 대칭차집합 같은 산술 집한 연산을 제공한다.

union   |

intersection   &

 

 

3.1.6 리스트 집합사전표기법

리스트 표기법은 파이썬 언어에서 가장 사랑받는 기능 중 하나다.

dict_comp = {key-expr : value-expr for value in collection

                  if condition}

set_comp = {expr for value in collection if condition}

 

3.2 함수

함수는 파이썬에서 코드를 재사용하고 조직화하기 위한 가장 중요한 수단이다.

 

3.2.1 네임스페이스 스코프 지역함수

함수는 전역과 지역, 두가지 스코프 영역에서 변수를 참조한다.

변수의 스코프를 설명하는 다른 용어로 네임스페이스가 있다.

 

3.2.2 여러 값 반환하기

def f():

  a = 5

  b = 6

  c = 7

  return a,b,c

a,b,c = f()

 

튜플이 리턴된다.

 

3.2.3 함수도 객체다

파이썬에서는 함수도 객체이므로 다른 언어에서는 힘든 객체 생성 표현을 쉽게 할 수 있다.

정형화

데이터 정제

 

 

 

3.2.4 익명함수

익명함수 anonymous함수 혹은 람다lambda 함수라고 하는 값을 반환하는 단순한 한 문장으로 이루어진 함수

lambda 예약어

lambda x: x+2

람다함수는 데이터 분석에서 특히 편리한데, 이는 앞으로 알게 되겠지만 데이터를 변형하는 함수에서 인자로 함수를 받아야 하는 경우가 매우 많기 때문이다.

 

람다 함수가 익명 함수라고 불리는 이유 중 하나는 이 함수 객체에는 명시적인 __name__속성이 없기떄문이다.

 

3.2.5 커링 : 일부 인자만 취하기

커링은 수학자인 하스켈 커리의 이름에서 따온 컴퓨터 과학 용어로, 함수에서 일부 인자만 취하는 새로운 함수를 만드는 기법이다.

 

def add_numbers(x,y):

  return x+y

add_five = lambda y : add_numbers(5,y)

add_numbers 의 두번째 인자를 커링했다.

 

functools 모듈의 partial 함수를 이용하면 이 과정을 단순화할 수 있다.

from functools import partial

add_five = partial(add_numbers,5)

 

3.2.6 제너레이터

파이썬은 리스트 내의 객체나 파일의 각 로우 같은 순차적인 자료를 순회하는 일관적인 방법을 제공한다.

이테레이터 프로토콜 

for key in some_dict:

  print(key)

 

dict_iterator = iter(some_dict)

list(dict_iterator )

 

제너레이터는 순회 가능한 객체를 생성하는 간단한 방법이다.

일반 함수는 실행되면ㄴ 단일 값을 반환하는 반면 제너레이터는 순차적인 값을 매 요청 시마다 하나씩 반환한다.

제너레이터를 생성하려면 함수에서 return을 하는 대신 yield예약어를 사용한다.

 

제너레이터 표현식

제너레이터를 생성하는 더 간단한 방법

gen = ( x** 2 for x in range(100))

 

itertools 모듈

표준 라이브러리 인 itertools모듈은 일반 데이터 알고리즘을 위한 많은 제너레이터를 포함하고 있다.

import itertools 

first_letter = lambda x: x[0]

 

3.2.7 에러와 예외처리 

에러 처리 필요

try:

 

except:

 

else:

 

finally:

 

IPython에서 예외 처리

%xmode

 

 

 

반응형
반응형

2.3.2 스칼라형

'단일 값'을 담는 자료형을 스칼라 타입이라고 한다.

  자료형 설명  
  None 파이썬의 'null'값(하나의 유일한 None으로 인스턴스만 존재한다.  
문자열 str 문자열 자료형, 유니코드(UTF-8 인코딩)문자열 ',",""",''' 변경불가능하다. , 슬라이싱, 이스케이프 \ 
  bytes Raw ASCII 바이트 (또는 바이트로 인코딩된 유니코드) b''
숫자 자료형 float 배정밀도(64비트)부동소수점수, double형이 따로 존재하지 않는다는 점을 기억하자. 부동소수점
숫자 자료형 int 부호가 있는 (음수 표현이 가능한) 정수, 값의 범위는 플랫폼에 의존한다.  
  bool 참 또는 거짓 True , True

정수 나눗셈은 정수를 반환하지 않고 부동소수점수를 반환한다.

// => 몫만을 돌려주는 

 

바이트와 유니코드

아스키와 비-아스키(아스키가 아닌)텍스트를 일관되게 다루기 위해 유니코드가 최상위 문자열 타입이 되었다.

val ="eee"

val_utf8 = val.encode('utf-8')

val_utf8.decode('utf-8')

 

utf-8 , latin1, utf-16, utf-16le

 

형변환

float()

int()

bool()

str()

 

날짜와 시간

from datetime import datetime, date, time

striptime() 포맷

timedelta(17,7179) 17일과 7179초 만큼의 시간 차이를 나타난다.

 

2.3.3 흐름제어

if, elif, else

for문

while문

pass

range :연속된 정수를 넘겨주는 이터레이터를 반환한다.

삼항 표현식: 

value = true-expr if condition else false-expr

 

 

 

03. 내장 자료구조, 함수 , 파일

3.1 자료구조와 순차 자료형

3.1.1 튜플

튜플은 1차원의 고정된 크기를 가지는 변경 불가능한 순차 자료형이다.

튜플을 생성하는 가장 쉬운 방법은 쉼표로 구분된 값을 대입하는것이다.

tup = 4,5,6

nested_tup = (4,5,6),(7,8)

tuple([4,0,2])

tup = tuple('string')

 

튜플에 저장된 객체 자체는 변경이 가능하지만 한 번 생성되면 각 슬롯에 저장된 객체를 변경하는 것은 불가능하다.

 

+ 연산자를 이용해서 튜플을 이어 붙일 수 있다.

 

튜플에서 값 분리하기

만일 튜플과 같은 표현의 변수에 튜플을 대입하면 파이썬은 등호 오른쪽에 있는 변수에서 값을 분리한다.

tup=(a,b,c)

a,b,c = tup

 

values= 1,2,3,4,5

a,b,*rest = values

 

튜플 메서드

count()

 

3.1.2 리스트

[]나 list함수를 사용해서 생성할 수 있다.

1차원 순차 자료형이며 많은 함수에 교차적으로 사용할 수 있다.

list함수는 이터레이터나 제너레이터 표현에서 실제 값을 모두 담기 위한 용도로도 자주 사용된다.

gen = range(10)

list(gen)

 

원소 추가하고 삭제하기

append()

insert(위치index,'')

insert는 append에 비해 연산 비용이 많이 든다.

 

pop()

remove()

 

리스트 이어붙이기

+

extend()

 

정렬

sort()

sorted()

 

이진 탐색과 정렬된 리스트 유지하기

import bisect

bisect.bisect메서드는 값이 추가될때 리스트가 정렬된 상태를 유지할수 있는 위치를 변환하며

bisect.insort는 실제로 정렬된 상태를 유지한 채 값을 추가한다.

import bisect

bisect 모듈 함수는 리스트가 정렬된 상태인지 검사하지 않으므로 연산 비용이 높을 수 잇다.

그리고 정렬되지 않은 리스트에 비해 모듈 함수를 수행하면 오류 없이 수행되지만 정확하지 않는 값을 반환하게 된다.

 

슬라이싱

[start:stop]

 

3.1.3 내장 순차 자료형 함수

enumerate

이 함수는 순차 자료형에서 현재 아이템의 색인을 함께 처리하고자 할 떄 흔히 사용한다.

(i,value)

 

sorted

새로운 순차 자료형을 반환한다.

 

zip

여러개의 리스트나 튜플 또는 다른 순차 자료형을 서로 짝지어서 튜플의 리스트를 생성한다.

zip함수는 여러개의 순차 자료형을 받을 수 있으며 변환되는 리스트의 크기는 넘겨받은 순차자료형 중 가장 짧은 크기로 정해진다.

 

reversed

순차 자료형을 역순으로 순회한다.

 

3.1.4 사전

해시맵 또는 연관 배열

키-값 쌍으로 

for key,vlaue in zip(my_list,my_list1):

 

기본값

유효한 사전 키

 

반응형
반응형

06-2 3과 5의 배수 구하기

입력 

출력

result = 0
for n in range(1,1000):
    if n % 3 == 0 or n % 5 == 0:
        result += n
print(result)

 

06-3 게시판 페이징하기 

함수 이름

입력 

출력

def getTotalPage(m,n):
    if m % n ==0:
        return m // n 
    else:
        return m // n +1

print(getTotalPage(5,10))
print(getTotalPage(15,10))
print(getTotalPage(25,10))
print(getTotalPage(30,10))

06-4 간단한 메모장 만들기

필요한 기능?

입력 ?

출력 ?

import sys
option = sys.argv[1]

if option == '-a':
    memo = sys.argv[2]
    f = open('memo.txt','a')
    f.write(memo)
    f.write('\n')
    f.close()
elif option == '-v':
    f = open('memo.txt')
    memo = f.read()
    f.close()
    print(memo)

 

06-5 탭을 4개의 공백으로 바꾸기

import sys
src = sys.argv[1]
dst = sys.argv[2]
print(src)
print(dst)

f = open(src)
tab_content = f.read()
f.close()

space_content = tab_content.replace("\t"," "*4)
print(space_content)

f = open(dst,'w')
f.write(space_content)
f.close()

 

06-6 하위 디렉터리 검색하기 

import os

def search(dirname):
    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        print(full_filename)
        
search("C:/")

 

특정 파일 만 출력하기

import os

def search(dirname):
    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        ext = os.path.splitext(full_filename)[-1]
        if ext == '.json':
            print(full_filename)
        
search("C:/")

하위 디렉터리 내용 출력

import os

def search(dirname):
    try:
        filenames = os.listdir(dirname)
        for filename in filenames:
            full_filename = os.path.join(dirname, filename)
            if os.path.isdir(full_filename):
                search(full_filename)
            else:
                ext = os.path.splitext(full_filename)[-1]
                if ext == '.py':
                    print(full_filename)
    except PermissionError:
        pass
    
search("C:/")

 

하위 디렉터리 검색을 쉽게 해주는 os.walk

import os

for (path, dir, files) in os.walk("C:/"):
    for filename in files:
        ext = os.path.splitext(filename)[-1]
        if ext == ".py":
            print("%s/%s" % (path, filename))

07. 정규 표현식

07-1 정규 표현식 살펴보기

복잡한 문자열을 처리 할 때 사용하는 기법으로 , 파이썬 만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다.

 

정규 표현식은 왜 필요한가 ?

data = """
park 800905-1049118
kim 700905-1059119
"""
result = []
for line in data.split("\n"):
    word_result = []
    for word in line.split(" "):
        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
            word = word[:6]+"-"+"******"
        word_result.append(word)
    result.append(" ".join(word_result))
print("\n".join(result))

import re
data = """
park 800905-1049118
kim 700905-1059119
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-******",data))

 

07-2 정규 표현식 시작하기

.^$*+?{}[]|()

 

문자 클래스 []

[] 사이의 문자들과 매치

Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.

반복 (*) 0부터 무한대로 반복 될수 있다는 의미

반복 (+) 최소 1번 이상 반복 될 때 사용

 

반복 ({m,n}, ? )

1. {m} 

2. {m,n} 범위

3. ? {0,1}

 

파이썬에서 정규 표현식을 지원한느 re모듈

import re

re.compile()

 

 정규식을 사용한 문자열 검색

match()

search()

findall()

finditer()  정규식과 매치되는 문자열을 반복 가능한 객체로 돌려준다.

import re
p = re.compile('[a-z]+')

m = p.match("python")
print(m)

m = p.match("3 python")
print(m)

p = re.compile('[a-z]+')
m = p.match("python")
if m:
    print("match found:", m.group())
else:
    print('No math')

import re
p = re.compile('[a-z]+')

m = p.search("python")
print(m)

m = p.search("3 python")
print(m)

import re
p = re.compile('[a-z]+')

m = p.findall("life is too short")
print(m)

import re
p = re.compile('[a-z]+')

m = p.finditer("life is too short")
print(m)

for r in m:
    print(r)

 

match 객체의 메소드

groun()

start()

end()

span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.

import re
p = re.compile('[a-z]+')

m = p.match("python")
print(m.group())
print(m.start())
print(m.end())
print(m.span())

import re
p = re.compile('[a-z]+')

m = p.search("3 python")
print(m.group())
print(m.start())
print(m.end())
print(m.span())

 

컴파일 옵션

DOTALL, S  : dot 문자(.) 가 줄바꿈 문자를 포함하여 모든 문자와 매치된다.

import re
p = re.compile('a.b')
m = p.match("a\nb")
print(m)

p = re.compile('a.b', re.DOTALL)
m = p.match("a\nb")
print(m)

IGNORECASET, I: 대 소문자에 관계 없이 매치한다.

import re
p = re.compile('[a-z]', re.I)
m = p.match("python")
print(m)
m = p.match("Python")
print(m)
m = p.match("PYTHON")
print(m)

 

MULTILINE, M ㅣ 여러 줄과 매치한다.

(^,$ 메타 문자의 사용과 관계가 있는 옵션이다.)

import re
p = re.compile('^python\s\w+')
data = """python one
Life is too short
python two
you need python
python three"""
print(p.findall(data))

p = re.compile('^python\s\w+',re.MULTILINE)
print(p.findall(data))

VERBOSE ,X: verbose모드를 사용한다.

(정규식을 보기 편하게 만들 수도 있고 주석 등을 사용할 수도 있다.)

import re
charref = re.compile(r'&[#](-[0-7]+|[0-9]+|[0-9a-fA-F]+);')

charref = re.compile(r"""&[#] # start of a numeric entirty reference
(
-[0-7]+ #octal form
|[0-9]+ #decimal form
|[0-9a-fA-F]+ # hexadecimal form
)
; # Trailing semicolon
""", re.VERBOSE)

 

백슬래스 문제 

\ -> \\

\\ -> \\\\

07-3 강력한 정규 표현식의 세계로

메타문자

| 메타 문자는 or과 동일한 의미

import re
p = re.compile('Crow|Servo')
m = p.match('CrowHello')
print(m)

^ 메타 문자는 문자열의 맨 처음과 일치함을 의미

import re
print(re.search('^Life','Life is too short'))
print(re.search('^Life','My Life'))

$ 문자열의 끝과 매치함을 의미한다.

import re
print(re.search('short$','Life is too short'))
print(re.search('short$','Life is too short, you need python'))

\A 문자열의 처음과 매치됨을 의미한다.

^메타 문자와 동일한 의미이지만 re.MULTILINE옵션을 사용할 경우에는 다르게 해석된다.
re.MULTILINE옵션을 사용할 경우 ^은 각 줄의 문자열의 처음과 매치되지만 \A는 줄과 상관없이 전체 문자열의 처음에고만 매치된다.

 

\Z 끝과  매침

 

\b는 단어 구분자 word boundary whitespace

import re
print(re.search(r'\bclass\b','no class at all'))
print(re.search(r'\bclass\b','the declassified algotithm'))
print(re.search(r'\bclass\b','one subclass is'))

\B \b문자와 반대의 경우

import re
print(re.search(r'\Bclass\B','no class at all'))
print(re.search(r'\Bclass\B','the declassified algotithm'))
print(re.search(r'\Bclass\B','one subclass is'))

그루핑

(ABC)+

import re
m = re.search(r'(ABC)+','ABCABCABC OK?')
print(m)
print(m.group(0))

p= re.compile(r"\w+\s+\d+[-]\d+[-]\d+")
m = p.search("park 010-1234-1234")

p= re.compile(r"(\w+)\s+\d+[-]\d+[-]\d+")
m = p.search("park 010-1234-1234")
print(m.group(1))

group(0) 매치된 전체 문자열
group(1) 첫번째 그룹에 해당하는 문자열
group(2) 두번째 그룹에 해당하는 문자열
group(n) n번쨰 그룹에 해당하는 문자열
p= re.compile(r"(\w+)\s+(\d+[-]\d+[-]\d+)")
m = p.search("park 010-1234-1234")
print(m.group(2))

p= re.compile(r"(\w+)\s+((\d+)[-]\d+[-]\d+)")
m = p.search("park 010-1234-1234")
print(m.group(3))

그룹핑된 문자열 재참조하기

그룹의 또 하나 좋은 점은 한 번 그루핑한 문자열을 재참조할 수 있다는 점이다.

p = re.compile(r'(\b\w+)\s+\1')
print(p.search('Paris in the the spring').group())

그루핑된 문자열에 이름 붙이기

?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)

import re
p= re.compile(r"(?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)")
m = p.search("park 010-1234-1234")
print(m.group("name"))

import re
p= re.compile(r"(?P<word>\b\w+)\s+(?P=word)")
print(p.search('Paris in the the spring').group())

전방 탐색

import re
p= re.compile(r".+.:")
m = p.search("http://google.com")
print(m.group())

(?=...) 긍정형 전방 탐색 ..에 해당하는 정규식과 매치되어야 하며 조건이 통과되어도 문자열이 소비되지 않는다.

(?!...) 부정형 전방 탐색 .. 에 해당하는 정규식과 매치되지 않아야 하며 조건이 통과되어도 문자열이 소비되지 않는다.

import re
p= re.compile(r".+(?=:)")
m = p.search("http://google.com")
print(m.group())

.*[.].*$  파일 이름+.+확장자

.*[.][^b].*$ bat인 파일은 제외해야 한다.

.*[.]([^b]..|.[^a].|..[^t])$

.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$

 

부정형 전방 탐색

.*[.](?!bat$).*$

.*[.](?!bat$|exe$).*$

 

문자열 바꾸기

import re
p= re.compile(r"(blue|white|red)")
m = p.sub('colour','blue socks and red shoes')
print(m)

m = p.sub('colour','blue socks and red shoes',count=1)
print(m)

m = p.subn('colour','blue socks and red shoes')
print(m)

sub메서드를 사용할 때 참조 구문 사용하기

import re
p= re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
print(p.sub("\g<phone> \g<name>","park 010-1234-1234"))

import re
p= re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
print(p.sub("\g<2> \g<1>","park 010-1234-1234"))

 

sub메소드의 매개변수로 함수 넣기

import re

def hexrepl(match):
    value = int(match.group())
    return hex(value)

p= re.compile(r"\d+")
p.sub(hexrepl,'Call 65490 for printing, 49152 for user code.')

Greedy vs Non-Greedy

import re
#greedy
s = '<html><head><title>Title</title>'
print(len(s))

print(re.match('<.*>',s).span())
print(re.match('<.*>',s).group())

#non-greedy
print(re.match('.*?>',s).group())

non-greedy문자인 ?는 *?,+?,??,{m,n}?와 같이 사용할 수 있다.

반응형
반응형

2.1 파이썬 인터프리터

파이썬은 인터프리터 언어이다.

exit()를 입력하거나 Ctrl-D를 누른다.

 

py파일 실행:

python hello.py

 

ipython

%run hello.py

 

2.2 IPython 기초 

2.2.1 IPython 셸 실행하기

ipython

 

2.2.2 jupyter notebook 실행하기

jupyter notebook

주피터 프로젝트의 주요 구성 요소 중 하나인 노트북은 코드, 텍스트, 데이터 시각화를 비롯한 다른 출력을 대화형으로 구성할 수 있는 대화형으로 구성할 수 있는 대화형 문서 형식이다.

--no-browser옵션을 지정하지 않으면 자동으로 기본 웹 브라우저를 실행한다.

새로운 노트북을 생성하려면 New버튼을 클릭하고 'Python 3'나 'conda[default]'옵션을 선택한다.

확장자 .ipynb

 

2.2.3 탭 자동완성

IPython은 표준 파이썬 인터프리터와 조금 다르게 생겼다.

탭을 통한 자동완성 기능

 

2.2.4 자기관찰

변수 이름 앞이나 뒤에 ?기호를 붙이면 그 객체에 대한 일반 정보를 출력한다.

 

2.2.5 %run명령어

IPython 세션 안에서 파이썬 프로그램 파일을 불러와서 실행할 수 있다.

 

주피터 노트북에서는 스크립트 파일을 코드 셀로 불러오는 %load 매직함수를 사용할 수도 있다.

 

2.2.6 클립보드에 있는 코드 실행하기 

%paste나 $cpaste매직함수를 사용할 수 있다.

%paste는 클립보드에 있는 텍스트를 단일 블록으로 실행한다.

%cpaste는 %paste와 유사하지만 코드를 붙여 넣을 때 특수한 프롬프트를 제공한다.

 

2.2.7 키보드 단축기

 

 

2.2.8 매직 명령어

IPython에는 파이썬 자체에는 존재하지 않는 '매직'명령어라고 하는 여러 가지 특수한 명령어를 포함하고 있다.

매직 명령어는 일반적인 작업이나 IPython 시스템의 동작을 쉽게 제어할 수 있도록 설계된 특수한 명령이다. 

%timeit

%automagic

 

2.2.9 matplotlib 통합

시각화

%matplotlib 매직함수는 IPython셸이나 주피터 노트북과  matplotlib 통합을 설정한다.

이 기능을 실행하지 않으면 노트북의 경우 그래프가 화면에 나타나지 않거나 셸의 경우 세션의 제어권을 뺏기게 되므로 중요하다.

%matplotlib

%matplotlib inline

 

2.3 파이썬 기초 

2.3.1 시맨틱

파이썬은 가독성과 명료성 그리고 명백함을 강조한다.

 

들여쓰기

중괄호 대신 공백 문자(탭이나 스페이스)를 사용해서 코드를 구조화한다.

 

모든 것을 객체

파이썬 언어의 중요한 특징 중 하나는 객체 모델의 일관성이다. 

모든 숫자, 문자열, 자료구조 , 함수 , 클래스 , 모듈 등은 파이썬 인터프리터에서 파이썬 객체라고 하는 어떤 '상자'안에 저장된다.

 

주석

# 뒤에 오는 문자는 모두 파이썬 인터프리터에서 무시된다.

실행만 되지 않도록 

 

함수와 객체 메서드 호출

함수는 순서별 인자와 키워드 인자를 동시에 받을 수 있다. 

하지만 통일 하는게 좋다.

 

변수와 인자 전달

변수에 값을 할당하는 것은 이름을 객체에 연결하는 것이므로 바인딩 이라고 부른다. 

값이 할당된 변수 이름을 때때로 바운드 변수라고 부르기도 한다.

 

동적 참조와 강한 타입

자바나 c++같은 컴파일 언어와는 달리 파이썬에서는 객체 참조에 타입이 관여하지 않는다.

비주얼 베이직 같은 언어에서는 문자열 '5'가 묵시적으로 정수형으로 변환(캐스팅)되어서 10이라는 결과를 낸다.

자바스크립트 같은 언어에서는 정수 5가 문자열로 변환되어 '55'이라는 문자열을 반환한다.

이런 측면에서 볼때 파이썬에서 모든 객체는 특정한 자료형(또는 클래스)을 가지며 다음과 같은 어떤 명백한 성황에서만 묵시적인 변환을 수행하는 자료형을 구분하는 강한 타입의 언어라고 하는것이 맞을 것이다. 

isinstance함수를 이용하면 어떤 객체가 무슨 자료형인지 검사할 수 있다.

instance는 튜플을 넘어서 객체의 자료형이 주어진 튜플 중 하나인지 검사할 수 도 있다.

 

 

 

속성과 메소드

파이썬에서 객체는 일반적으로 속성(객체 내부에 저장되는 다른 파이썬 객체)과 메서드(객체의 내부 데이터에 접근할 수 있는 함수)를 가진다. 속성과 메소드는 obj.attribute_name 문법으로 접근할 수 있다.

 

속성과 메서드는 getattr 함수를 통해 이름으로 접근하는 것도 가능하다.

 

덕 타이핑 

객체의 자료형에는 관심이 없고 그 객체가 어떤 메서드나 행동을 지원하는 지만 알고 싶은 경우가 있다. 

이를 '덕 타이핑'이라고 부르는데 

iter()

 

모듈 임포트

import 모듈이름

 

이항 연산자와 비교문

 

뮤터블, 이뮤터블 객체 

리스트, 사전 , Numpy배열 또는 사용자 정의 클래스 같은 대부분의 객체는 변경 가능하다. 뮤터블 mutable

문자열이나 튜플은 변경 불가능하다.(이뮤터블)

반응형
반응형

05-1 클래스

프로그래머들이 가장 많이 사용하는 프로그래밍 언어 중 하나인 C언어에는 클래스가 없다.

 

과자 틀 -> class

과자 틀을 사용해 만든 과자 -> 객체 object

 

def 함수 이름(매개변수):

  수행할 문장

  ...

 

생성자(Constructor)객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.

 

클래스의 상속

상속이란 물려받다 라는 뜻으로 , 재산을 상속받다 라고 할 떄의 상속과 같은 의미이다.

class 클래스 이름(상속할 클래스 이름)

 

05-2 모듈

모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다.

모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다.

from 모듈 이름 import 모듈 함수

from mod1 import add,sub

from mod1 import *

 

if __name__ =="__main__":의 의미

 

 

05-3 패키지

패키지는 도트(.)를 사용하여 파이썬 모듈을 계층적으로 (디렉터리 구조)으로 관리할 수 있게 해준다.

 

__init__.py의 용도

해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 

 

05-4 예외 처리

오류 예외 처리 기법

try, except문

try:

  ...

except [발생오류[as 오류 메시지 변수]]:

  ...

 

try ... finally

 

여러개의 오류 처리 하기 

try:

  ...

except [발생오류[as 오류 메시지 변수]]:]

  ...

except [발생오류[as 오류 메시지 변수]]:

  ...

 

오류 일부러 발생시키기 

raise명령어

 

05-5 내장 함수 

abs 절댓값 돌려주는 함수 

all(x) 반복 가능한 (iterable)자료형 x를 입력 인수로 받으며 이 x가 모두 참이면 True, 거짓이 하나라도 있으면 False를 돌려준다.

any(x)는 x중 하나라도 참이 있으면 True를 돌려주고 ,x가 모두 거짓일 때에만 False를 돌려준다. 

chr(x) ASCII코드 값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수이다.

dir 객체가 자체적으로 가지고 있는 변수나 함수를 보여준다.

divmod(a,b)는 2개의 숫자를 입력으로 받는다. 

enumerate 는 열거하다 . 이 함수는 순서가 있는 자료형(리스트, 튜플, 문자열_)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려준다.

eval(expression) 은 실행 가능한 문자열을 입력으로 받아 문자열을 실행한 결괏값을 돌려주는 함수이다.

 

filter무 엇인가를 걸러내는 뜻

hex(x)는 정수 값을 입력받아 16진수로 변환하여 돌려주는 함수이다.

id(object)는 객체를 입력받아 고유 주소 값(레퍼런스)을 돌려주는 함수이다.

input([prompt])은 사용자 입력을 받는 함수이다.

int(x)는 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수 형태로 돌려주는 함수로 , 정수 를 입력으로 받으면 그대로 돌려준다.

isinstance(object, class)는 첫 번째 인수로 인스턴스, 두번쨰 인수로 클래스 이름을 받느나. 입력으로 받은 인스턴스가 그 클래스의 인스턴스인지를 판단하여 참이면 True, 거짓이면 False를 돌려준다.

len(s)은 입력값 s의 길이(요소의 전체 개수)를 돌려주는 함수이다.

 

list(s)는 반복 가능한 자료형 s를 입력받아 리스트로 만들어 돌려주는 함수이다.

list함수에 리스트를 입력으로 주면 똑같은 리스트를 복사하여 돌려준다.

 

map(f, iterable)은 함수(f)와 반복 가능한(iterable)자료형을 입력으로 받는다. 

map은 입력 받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수이다.

 

max(iterable)는 인수로 반복 가능한 자료형을 입력받아 그 최댓값을 돌려주는 함수

min(iterable)은 max함수와 반대로 , 인수로 반복 가능한 자료형을 입력 받아 그 최솟값을 돌려주는 함수

 

oct(x)는 정수 형태의 숫자를 8진수 문자열로 바꾸어 돌려주는 함수이다.

 

open(filename,[mode])은 '파일 이름'과 '읽기 방법'을 입력받아 파일 객체를 돌려주는 함수이다.

 

ord(c)  문자의 아스키 코드 값을 돌려주는 함수이다.

 

pow(x,y)는 x의 y제곱한 결괏값을 돌려주는 함수이다.

 

 

 

range([start],step[,step])는 for문과 함께 자주 사용하는 함수이다. 이 함수는 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 돌려준다.

인수가 하나일 경우 : 0부터 시작

인수가 2개일 경우 : 시작 숫자와 끝 숫저

인수가 3개일 경우 : 숫자 사이의 거리

 

round(number[,ndigits])함수는 숫자를 입력받아 반올림해 주는 함수

 

sorted(iterable)함수는 입력 값을 정렬한 후 그 결과를 리스트로 돌려주는 함수

 

str(object)은 문자열 형태로 객체를 변화하여 돌려주는 함수

 

sum(iterable)은 입력 받은 리스트나 튜플의 모든 요소의 합을 돌려주는 함수

 

tuple(iterable)은 반복 가능한 자료형을 입력받아 튜플 형태로 바꾸어 돌려주는 함수

 

type(object)은 입력값의 자료형이 무엇인지 알려주는 함수

 

zip(*iterable)은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수

05-6 외장함수

sys

sys모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.

 

명령 행에서 인수 전달하기 - sys.argv

강제로 스크립트 종료하기 -sys.exit()

자신이 만든 모듈 불러와 사용하기 -sys.path

 

pickle

객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈이다.

import pickle

pickle.dump()

 

pickle.dump로 저장한 파일을 pickle.load를 사용해서 원래 있던 딕셔너리 객체(data)상태 그대로 불러오는 예이다.

 

 

os

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

 

내 시스템의 환경 변수 값을 알고 싶을 때 os.environ

os.environ['PATH']

 

디렉터리 위치 돌려받기 -os.getcwd()

시스템 명령어 호출하기 - os.system

os.system("dir")

실행한 시스템 명령어의 결괏값 돌려받기 -os.popen

os.popen("dir")

 

os.mkdir()

os.rmdir()

os.unlink() -> 파일을 지운다.

os.rename(src, dit)

 

shutil 

shutil은 파일을 복사해 주는 파이썬 모듈이다.

shutil.copy("src.txt","dst.txt")

 

glob

디렉터리에 있는 파일들을 리스트로 만들기 -glob(pathname)

*, ? 등 메타 문자를 써서 원하는 파일만 읽어 들일 수 도 있다.

 

tempfile

파일을 임시로 만들어서 사용할 때 유용한 모듈이 바로 tempfile이다.

tempfile.mktemp()는 중복되지 않는 임시 파일의 이름을 무작워로 만들어서 돌려준다.

 

tempfile.TemporaryFile()은 임시 저장 공간으로 사용해 파일 객체를 돌려준다.

f.close()

 

time

time.time()은 UTC를 사용하여 현재 시간을 실수 형태로 돌려주는 함수이다.

time.localtime은 time.time()이 돌려준 실수 값을 사용해서 연도, 월, 일, 시 ,분, 초, ..의 행태로 바꾸어 주는 함수이다.

time.asctime위 time.localtime에 의해서 반환된 튜플 형태의 값을 인수로 받아서 날짜와 시간을 알아보기 쉬운 형태로 돌려주는 함수이다.

time.ctime 

time.strftime('출력할 형식 포맷 코드', time.localtime(time.time())

time.sleep() 함수는 주로 루프 안에서 많이 사용한다. 이 함수를 사용하면 일정한 시간 간격을 두고 루프를 실행할 수 있다.

 

calendar

calendar는 파이썬에서 달력을 볼수 있게 해주는 모듈이다.

calendar.calendar(연도)

calendar.prmonth(연도, 월)

calendar.weekday(연도, 월, 일)

calendar.monthrange(연도, 월) 

 

random

random은 난수(규칙이 없는 임의의 수)를 발생시키는 모듈이다.

random.random()

random.randint(1,10)

random.choice()

random.shuffle(list data)

 

webbrowser

자신의 시스템에서 사용하는 기본 웹 브라우저를 자동으로 실행하는 모듈이다. 

webbrowser.open(url)

open_new함수는 이미 웹 브라우저가 실행한 상태이더라도 새로운 창으로 해당 주소가 열리게 한다.

06 파이썬 프로그래밍 어떻게 시작해야 할까?

06-1 내가 프로그램을 만들 수 있을 까?

구구단

입력과 출력 

프로그램 을 짤 순서를 생각한다.

def GuGu(n):

  result = []

  i = 1

  while i < 10:

    result.append(n * i)

    i += 1

  return result

 

 

반응형
반응형

04-1 함수

반복적으로 사용되는 가치 있는 부분을 한 뭉치로 묶어서 

어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다.

 

파이썬 함수의 구조

def 함수이름(매개변수):

  수행할 문장1

  수행할 문장2

  ...

 

 

매개변수와 인수

매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 

인수는 함수를 호출할 때 전달하는 입력값을 의미한다.

def add(a,b):

  return a+b

add(3,1)

a,b 매개변수

3,1 인수

 

입력값 -> 함수 -> 출력값

 

입력값이 몇개가 될지 모를 때는 어떻게 해야 할까?

*args는 임의의 정한 변수 이름이다.

def add_many(*args):

  result = 0

  for in in args:

    result += i

  return result

 

**kwargs : 딕셔너리 

 

함수의 결괏값은 언제나 하나이다.

 

매개변수에 초깃값 미리 설정하기

def say_myself(name, old, man = True):

초깃값 은 마지막에 해야 한다. 

 

global 명령어 사용하기

 

python lambda

lambda 매개변수1, 매개변수2,..: 매개변수를 사용한 표현식

add = lambda a,b: a+b

result = add(3,4)

 

04-2 사용자 입력과 출력

사용자 입력 

input()

input('숫자를 입력하세요:')

str 으로 인식한다.

 

04-3 파일 읽기 쓰기

파일 생성하기

f = open("새파일.txt','w')

r 읽기 모드- 파일을 읽기만 할 때 사용
w 쓰기 모드- 파일에 내용을 쓸때 사용
a 추가 모드-파일의 마지막에 새로운 내용을 추가할 때 사용

 

f.readline()

 

 

반응형

+ Recent posts