관리 메뉴

IT journey

Python - 내장함수 2편과 이터레이터,제너레이터,코루틴,정규표현식 본문

개인공부공간/Python

Python - 내장함수 2편과 이터레이터,제너레이터,코루틴,정규표현식

step 2021. 6. 1. 21:53
728x90
반응형

직접 내용 정리하고 만든 예이니 퍼가실 때는 출처를 남겨주세요:)

1. 입출력 관련 함수

함수명 기능
print(x) 객체를 문자열로 표시합니다.
input([prompt]) 사용자 입력을 문자열로 반환합니다.
help([x]) x에 대한 도움말을 출력합니다.
globals() 전역 변수의 리스트를 반환합니다.
locals() 혹은 vars() vars([obj]) 지역 변수의 리스트를 반환합니다.
__dict__ 속성을 반환합니다.
(객체의 내부 변수가 저장된 딕셔너리)
del(x) 혹은 del x 객체를 변수 공간에서 삭제한다.
eval(expr) 값을 구합니다.
exec(obj) 파이썬 명령을 실행시킵니다.
open(filename[,mode]) 파일을 열어줍니다.

2.  기본 자료형의 생성과 변환 함수

함수명 기능
object() 새로운 object(모든 객체의 base)를 생성
bool(obj) 객체의 진리값을 반환합니다.
int(obj) 문자열 형태의 숫자나 실수를 정수로 변환합니다.
float(obj) 문자열 형태의 숫자나 실수를 실수로 변환합니다.
complex(re,[,img])  문자열이나 주어진 숫자로 복소수를 생성합니다.
str(obj) 문자열로 반환합니다.
list(seq) 순서의 리스트로 반환합니다.
tuple/range/set 이 기능을 따로 적지 않겠습니다.
아래에 나와있는 이전 발행글들을 봐주시면 됩니다.

3. 기본 자료형의 정보를 얻는 함수입니다.

함수명 기능
type(obj) 객체의 형을 반환합니다.
dir(obj) 객체가 가진 함수와 변수들을 리스트 형태로 반환합니다.
(즉,어떤 객체를 인자로 넣어주면 해당 객체가 어떤 변수와 메소드(method)를 가지고 있는지 나열해줍니다.)
repr(obj)
ascill(obj)
eval()함수로 다시 객체를 복원할 수 있는 문자열 생성 repr()과 유사하나 non-ascill 문자는 escape 합니다.
id(obj) 객체의 고유번호(int형)을 반환합니다.
hash(obj) 객체의 해시값(int형)을 반환합니다. (같은 값이면 해시도 같습니다.)
char(num)
ord(str)
ASCII 값을 문자로 반환합니다.
한 문자의 ASCII 값을 반환합니다.
instance(obj,className) 객체가 클래스의 인스턴스인지 판단합니다.
issubclass(class,classinfo) class(자식클래스)가 classinfo(부모클래스)의 서브클래스일 때 True를 반환합니다.

4. 열거형의 정보를 얻는 함수

아래에 표에 나오는 iterable란 반복 가능한 자료형(문자열, 리스트, 튜플, 딕셔너리, 집합)을 말합니다. 

함수명 기능
len(seq) 시퀀스형을 받아서 그 길이를 반환합니다.
iter(obj[,sentine]) 객체의 이터레이터(iterator)를 반환합니다.
next(iterator) 이터레이터의 현재 요소를 반환하고 포인터를 하나 넘깁니다.
enumerate(iterable,start=0) 이터레이터에서 enumerate 형을 반환합니다.
입력값으로 시퀀스 자료형(리스트, 튜플, 문자열)을 입력받습니다.
sorted(iterablep[,key][,reverse]) 정렬된 리스틀 반환합니다.
reversed(seq) 역순으로 된 iterator를 반환합니다/
filter(func,iterable) iterable의 각 요소 중 func()의 반환값이 참인 것만 묶어서
이터레이터로 반환합니다.
map(func,iterable) iterable의 각 요소를 func()의 반환값으로 매핑해서 이터레이터로 반환합니다.

5. 산술/논리 연산에 관련된 함수

함수명 기능
hen(n) 정수 n의 16진수 값을 구해서 문자열로 반환합니다.
oct(n) 정수 n의 8진수 값을 구해서 문자열로 반환합니다.
bin(n) 정수 n의 1진수 값을 구해서 문자열로 반환합니다.
all(iterable) iterable의 모든 요소가 True일 경우 True를 반환합니다.
any(iterable) iterable의 하나이상 요소가 True일 경우 True를 반환합니다.
max(iterable)
max(arg1,arg2...)
최대값을 구합니다.
min(iterable)
min(arg1,arg2...)
최소값을 구합니다.

maketrans('바꿀 문자','새 문자')

바꿀 문자를 새 문자로 바꾸어주는 함수입니다.

#str.maketrans('바꿀 문자','새문자')
#translate(테이블)을 사용하면 문자를 바꾼 뒤에 결과를 반환합니다.
table = str.maketrans('akbocid','1234567')
'coconut'.translate(table)

언더스코어 의미

접근 제어자와 클래스 그리고 연산자 오버로딩에서 많이 쓰였던 언더스코어(_)의 의미에 대해 알아봅시다.

타 언어에서는 단순히 스네이크 표기법 정도로만  사용됩니다.

반면 파이썬에서는 조금 특별한 기능(마지막 변수를 저장하는 역할과 네이밍 용도,스페셜 변수 또는 메소드,맹글링을 위한 용도)을 합니다. 이 이유는 인터프리터 언어라는 속성 때문이라고 볼 수 있습니다. 

 

참고로, 언더스코어 네이밍은 위의 접근제어자와 같이 public과 private 를 구분하기 위한 용도로 사용합니다. 그리고 언더 스코어로 멤버 변수(또는 멤버 함수)를 선언하면 마치 private처럼 동작하게 됩니다.

언더 스코어를 단독으로 사용하게 되면 같은 모듈안에서 public처럼 동작하면서 사용할 수 있지만 다른 모듈에서는 private처럼 동작합니다. (다시 말해, 모듈로써 다른 곳에 사용할 때는 사용할 수 없습니다.)

__name__ 이나 __sub__과 같은 특별한 문법적 기능을 제공하는 스페셜 변수나 메서드의 구성을 언더스코어로 표현합니다.

맹글링이란 프로그램 언어 자체적으로 일정한 규칙에 의해 변수나 함수의 이름을 변경하는 것을 말합니다.

파이썬에서는 맹글링은 _class+[name]의 형식으로 이루어지고 호출할 때는 언더 스코어를 사용합니다.

 

예를 보고 싶은 분들은 아래 발행글에서 참조 부탁드립니다.


이터레이터 만들기

들어가기 전, 클래스 1편 를 먼저 봐주시면 이해하는데 수월할 수 있습니다.

이터레이터는 값을 차례대로 꺼낼 수 있는 객체입니다.

#구조
class 이터레이터 이름:
    def __iter__(self):
    	코드
       
    def __next__(self):
    	코드

#사용한 예
class Natural_multiple:
  def __init__(self,number1,number2):
    self.number1 = number1
    self.number2 = number2

  def _iter__(self):
    return self
  
  def __next__(self):
    if (self.number1>0) and (self.number2>0):
      return self.number1*self.number2
    else:
      raise ValueError

n_m = Natural_multiple(-10,50)
print(n_m.__next__())

n_m2 = Natural_multiple(10,5)
print(n_m2.__next__())

#내장함수 iter(호출가능한 객체, 반복을 끝낼 값)
import random as r
it=iter(lambda:r.randint(0,5),2)
next(it)

참고로, raise ValueError에 대해 알아보기 전에 예외처리에 대해 먼저 알아봅시다.

 

  • 예외란 프로그램에서 벌어지는 예외적인 상황을 의미합니다
  • 예외처리란 프로그램 작성 시 작성자가 의도하지 않은 동작이나, 예상치 못한 오류에 대한 처리해주는 것을 말합니다. 
  • 예외처리를 하는 이유는 비정상적인 종료를 막기 위해서입니다.
  • 오류, 예외처리를 할 때 try,except문 그리고 try,except,finally문 그리고 raise(일부러 오류를 발생시켜야 할 때 사용하는 방법) 그리고 assert(프로그래머가 의도한 대로 입력 값 또는 결과값이 정확하게 존재하는지를 확인하는 가정 설정문입니다.)가 쓰입니다.
  • 에러의 예로는파일이 없을 때 나는 에러인 FileNotFondError 와 숫자를 0으로 나누었을 때 나는 에러인 ZeroDivisionError 와 리스트에서 얻어 올 수 없는 값일 때 나오는 에러인 IndexError 와 구문 오류인 SyntaxEroor그리고 파일의 끝이라서 읽을 내용이 없을 때 나오는 에러인 EOFError 그리고 파이썬의 내장 에러로 구현되지 않았을 때 발생시키는 에러인 NotImplementedEroor가 있습니다. 이러한 에러들이 발생하면 프로그램을 중단하고 에러 메세지를 보여줍니다.
  • 기본 형식
    #이 때 [] 은 생략이 가능하다는 의미입니다.
    try:
    	수행 명령...
    except [발생에러[as 에러메세지 변수]]:
    	수행 명령
    
    #사용한 예
    try:
    	x=int(input("숫자를 입력해주세요"))
        y=5/x
        print(y)
    except:
    	print('에러 발생')
  • try~finally문 에서 finally절은 try문 수행 도중에 예외상황 발생 여부와 관계없이 항상 수행됩니다.
  • 특정 에러가 발생할 경우 통과시키는(즉,예외를 회피하는) 방법은 except 아래에 pass를 집어넣어주는 것입니다.
  • 사용자 정의 예외 만들어서 발생시키는 방법은 에러나 예외는 반드시 직접적이든 간접적이든 상과없이 Exception 클래스에서 파생된 클래스이어야 합니다.
    #구조
    class 예외이름(Exception):
    	def __init__(self):
        	super().__init__('에러메세지')
            
    #사용한 예
    class OneDivisionError(Exception):
      def __init__(self):
        Exception().__init__('1은 나누어도 그대로입니다.')
    
    try:
      number1 = int(input("정수를 입력해주세요."))
      number2 = int(input("정수를 입력해주세요."))
      if ((number1==1) or (number2==1)):
        raise OneDivisionError
    
    except OneDivisionError as OD:
      print('1은 나누어도 그대로입니다.',OD)
    
    OneDivisionError()

제너레이터(generator) 만들기

제너레이터를 만들기 앞서, 제너레이터에 대한 것을 간략히 알아봅시다.

함수 안에서 yield를 사용하게 되면 yield에는 값(변수)를 지정하게 됩니다.

dir로 제너레이터 객체를 dir 내장함수를 이용해 확인해보게 되면, 이터레이터처럼 __iter__과 __next__가 들어있습니다. 제너리터 객체를 __next__를 이용해 호출하다 호출할 것이 없으면, StopInteration이라는 예외가 발생합니다.

위 설명과 관련된 코드는 아래와 같습니다.

def fruit_generator():
  yield "apple"
  yield "coconut"

for i in fruit_generator():
  print(i)

f = fruit_generator()
f
dir(f)
f.__next__()
f.__next__()
f.__next__()

이제는 yield에서 함수를 호출해봅시다.

def icecream_generator(x):
  for i in x:
    yield i+' ice cream'

fruits = ['Apple','Cherry','Orange','Coconut','Grape']
for i in icecream_generator(fruits):
  print(i)

 #yield from에서 값을 여러 번 바깥으로 전달해봅시다.
 #yield from 반복가능한 객체(시퀀스 객체(리스트+튜플+range+문자열(str))+딕셔너리+세트)
 #yield from 이터레이터 
 #yield from 제너레이터 객체
 
def fruit_generator():
  fruits = ['Apple','Cherry','Orange','Coconut','Grape']
  yield from fruits

for i in fruit_generator():
  print(i)
 

제너레이터 표현식

같은 리스트 표현식([](대괄호))을 ()(괄호)로 묶으면 제너레이터 표현식이 됩니다. 제너레이터 표현식은 필요할 때 요소를 만들어내므로 메모리 절약에 효율적입니다.

(i for i in range(1,101) if i%5==0)

코루틴(couroutine)

코루틴(cooperative routine)은 서로 협력하는 루틴이라는 뜻입니다. 다시 말해 메인 루틴과 서브루틴처럼 종속 관계가 아닌 서로 대등한 관계이며 특정 시점에 상대방의 코드를 실행합니다.

코루틴은 제너레이터의 특별한 형태로 볼 수 있습니다.

 

먼저, 코루틴 값을 보내는 예를 봅시다.

def fruit_couroutine():
  while True : #종료하지 않고 계속 코루틴을 유지하기 위해 무한루프를 사용합니다.
    fruit = (yield) #코루틴 바깥에서 값을 받아옵니다. 
    print(fruit)

fc = fruit_couroutine()
next(fc) #코루틴 안의 yield까지 코드를 최초로 실행합니다.
fc.send("apple")
fc.send("coconut")

fc.close() #코루틴을 종료합니다.

이번엔, 코루틴 바깥으로 값을 전달하는 예를 봅시다.

def icecream_coroutine():
  ic = " ice cream"
  while True:
    x = (yield ic)
    ic = x+ic

co = icecream_coroutine() #코루틴 객체를 생성
print(next(co))
print(co.send('apple'))
print(co.send('cherry'))

하위 코루틴의 반환값 가져오는 예를 봅시다.

def icecream():
  ic = " ice cream"
  while True:
    x = (yield ic)
    if x is None:
      return ic
    ic = x+ic

def icecream_coroutine():
  while True:
    ic = yield from icecream() #icecream의 반환값을 가져옵니다. 
    print(ic)
  
co = icecream_coroutine() #코루틴 객체를 생성
next(co)
co.send('apple')

StopIteration 예외 발생시키는 예를 만들어봅시다.

코루틴도 제너레이터이므로 return을 사용하게 되면 StopIteration이 발생합니다.

코루틴에서 return  값은 raise StopIteration(값)과 동작이 같습니다.

그러므로 raise로 예외를 직접 발생시키고 값을 지정하면 yield from 으로 값을 가져올 수 있습니다.

def icecream():
  ic = " ice cream"
  while True:
    x = (yield ic)
    if x is None:
      raise StopIteration()
    ic = x+ic

def icecream_coroutine():
  while True:
    ic = yield from icecream()
    print(ic)
  
co = icecream_coroutine() #코루틴 객체를 생성
next(co)
co.send('apple')

정규 표현식(regular expression)

  • 일정한 규칙이나 패턴을 가진 문자열을 표현하는 방법입니다.
  • 복잡한 문자열 속에서 특정한 규칙으로 된 문자열을 검색한 뒤 추출하거나 바꿀 때나 문자열이 정해진 규칙이 맞는지 판단할 때 사용합니다.
  • re.match('패턴','문자열') 문자열의 처음부터 정규식과 매치되는지 조사합니다.
  • re.search('패턴','문자열') 문자열 전체를 검색하여 정규식과 매치되는지 조사합니다.
  • re.complie('패턴') 은 정규표현식 객체(complie 객체)를 만듭니다.
  • re.findall('패턴','문자열')은 패턴에 매칭되는 모든 문자열을 가져옵니다.

문자열 판단하기

  • re모듈을 가져와서 사용하며 match함수에 정규표현식 패턴과 판단할 문자를 넣습니다.
  • import re 
    re.match('IT','IT journey') #문자열이 있으므로 정규표현식 매치 객체가 반환됩니다. 
    re.match('trip','IT journey') #문자열이 없으므로 그냥 넘어갑니다.
  •  문자열이 맨 앞(^문자열)에 오는지 맨 뒤(문자열$)에 오는지 판단해봅시다.
  • import re re.search('^IT','IT journey') re.search('journey$','IT journey')
  • 지정된 문자열이 하나라도 포함되는지 판단해봅시다. (or 연산자와 같다고 보면 이해하기 쉽습니다.)
  • 문자열 | 문자열
  • import re
    re.match('IT|journey','journey') 

문자 클래스

  • re모듈을 가져와서 사용하며 match함수에 정규표현식 패턴과 판단할 문자를 넣습니다.
  • []사이의 문자들과 매치되는지 판단합니다.
  • import re
    re.match('[0-9]*','5678') #0~9까지 중 5,6,7,8이 0개 이상이 있으므로 패턴에 매치
    re.match('[a-z]*','banana')  #a~Z까지 중 b,a,n,a,n,a이 0개 이상이 있으므로 패턴에 매치
    re.match('[0-9]+','5678') #0~9까지 중 5,6,7,8이 1개 이상이 있으므로 패턴에 매치됨
    re.match('[a-z]+','banana') #a~Z까지 중 b,a,n,a,n,a이 1개 이상이 있으므로 패턴에 매치

문자가 한 개 만 있는지 판단하기

  • re모듈을 가져와서 사용하며 match함수에 정규표현식 패턴과 판단할 문자를 넣습니다.
  • import re
    re.match('I?','IT journey') #? 앞의 문자(I)를 0개 이상 표현했으므로 패턴에 매치
    re.match('I?T','IT journey') #? 앞의 문자(I 또는 IT)를 0개이상 표현했으므로 패턴에 매치
    re.match('IT.','IT journey') #IT 뒤에 문자 1개가 있으므로 패턴에 매치

숫자와 영문 문자를 조합해서 판단하기

  • re모듈을 가져와서 사용하며 match함수에 정규표현식 패턴과 판단할 문자를 넣습니다.
  • import re
    #a-z, A-Z, 0-9까지 1개 이상의 패턴이 있으므로 매칭
    re.match('[a+zA-Z0-9]+','IT journey20')

그룹 사용하기

매치객체.group(그룹숫자)

: 공백으로 구분된 숫자를 두 그룹으로 나누어서 찾은 뒤 각 그룹에 해당하는 문자열(숫자) 가져옵니다.

import re
g = re.match('([0-9]+) ([0-9]+)', '120 15')
g.group(1) #첫번째 그룹(그룹 1)에 매칭된 문자열을 반환합니다.
g.group(2)    # 두 번째 그룹(그룹 2)에 매칭된 문자열을 반환
g.group() #매칭된 문자열을 한꺼번에 반환합니다.(g.group(0)도 같은 의미입니다.)

 

정규표현식으로 특정문자열을 찾은 뒤 다른 문자열로 바꾸는 방법

#re.sub('패턴','바꿀문자열','문자열','문자열','바꿀횟수')
import re
re.sub('apple | coconut', 'fruit', 'apple box coconut box')
re.sub('[a-z]+','1', 'a b 2 3 c d 4 5')

#더 나아가 교체함수(매치객체)를 지정해보겠습니다.
#re.sub('패턴',교체함수,'문자열','바꿀횟수')
import re
def sub(m):
  n = int(m.group())
  return str(n-1)

re.sub('[0-9]+',sub, 'a b 2 3 c d 4 5')

 

정규표현식 메타 문자

메타문자 설명 예시
[] 문자, 숫자, 특수문자, 공백 등의 범위를 표현
[a-zA-Z0-9가-힣_-+^/:]
{개수} 특정 개수의 문자, 숫자를 표현 journey{2}=journeyjourney
{시작개수 끝개수} 특정 개수 범위의 문자, 숫자를 표현 [0-9]{1-2}
+ 1개 이상의 문자를 표현(필수) [0-9]+
* 0개 이상의 문자를 표현 [A-Z]*
? 앞의 문자를 0개 이상 표현 a?c=ac 또는 c
. 해당 위치에 문자 1개 표현 a.c = a문자c
^ [] 앞에 붙이면 해당 문자 범위로 시작하는지 판단 ^[0-9]= 문자열이 숫자로 시작
[] 안에 넣으면 해당 문자 범위를 제외 [^0-9] = 숫자를 제외한 문자열
$ 해당 문자로 끝나는지 판단 [A-Z]+$ = 대문자로 끝난다.
| 여러 문자열 중 하나라도 포함되는지 판단 IT|journey = IT 또는 journey
() 그룹으로 묶음 (정규표현식)
(?P<이름>형식) 그룹 이름 지정하기 (?P[0-9])

정규표현식 특수 문자

특수 문자 설명
\d [0-9]와 같습니다. (즉, 모든 숫자)
\D [^0-9]와 같습니다. (즉, 숫자를 제외한 모든 문자)
\w [a-zA-Z0-9_]와 같습니다. (즉, 영문대소문자, 숫자, 밑줄문자)
\W [^a-zAZ0-9_]와 같습니다.
(즉, 영문대소문자, 숫자, 밑줄문자를 제외한 모든 문자)
\ 정규 표현식에서 사용하는 문자를 그대로 표현하려면 앞에 붙여야합니다.

 

이전 발행 글

Python - 모듈(외장함수) 1편

Python - 클래스 2편

Python - 클래스 1편

Python-함수

Python - 제어문

Python-자료형(사전형,집합)

Python-자료형(리스트,튜플)

Python - 자료형 (숫자형,문자열,불린형)

Python - 내장함수 1편

728x90
반응형
Comments