Unit 41. 코루틴
기존에는 메인 루틴에서 서브 루틴을 호출하면 서브 루틴 코드가 실행된 뒤,
다시 메인 루틴으로 돌아와 서브 루틴의 내용이 사라지는 형태였다면
코루틴은 메인 루틴과 서브 루틴과 서로 대등한 관계이며
메인 루틴에서 코루틴으로 최초 호출 후 메인 루틴 실행,
코루틴 코드 실행을 반복하게 된다.
코루틴객체.send(값)과 변수 = (yield) 형식으로 변수에 저장한다.
코루틴 바깥으로 값을 전달하기 위해서는 변수 = (yield 변수),
next(코루틴객체), 코루틴객체.send(값) 으로 보내주게 된다.
코루틴객체.close() 메서드를 사용해서 강제로 종료하게 된다.
또, GeneratorExit 을 통해 예외처리를 할 수 있다.
코루틴 안에서 예외를 발생시키기 위해서는
코루틴객체.throw(예외이름, 에러메시지)를 사용한다.
하위 코루틴의 반환값을 가져오기 위해서는
변수 = yield from 코루틴()과 같이 사용한다.
def calc():
math = 0
while True:
expressions = (yield math)
num1, math_op, num2 = expressions.split()
if math_op == '+':
math = int(num1) + int(num2)
elif math_op == '-':
math = int(num1) - int(num2)
elif math_op == '*':
math = int(num1) * int(num2)
elif math_op == '/':
math = int(num1) / int(num2)
expressions = input().split(', ')
c = calc()
next(c)
for e in expressions:
print(c.send(e))
c.close()
Unit 42. 데코레이터
파이썬에서 제공하는 데코레이터 기능은 클래스에서 메서드를 만들 때
붙였던 @staticmethod(정적메서드), @classmethod(클래스메서드) 와
같은 @로 시작하는 것들로 함수를 장식한다고 해서 붙여진 이름이다.
데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을
구현할 때 사용한다. 함수에 입력받은 인자의 ex) func() 로 가서 함수를 호출한다.
매개변수와 반환값을 처리하기 위해선 func(a, b)처럼 작성하고
가변인수를 *args, **kwargs 처럼 언패킹하여 넣어줄 수 있다.
클래스를 활용할 때는 __call__ 메서드를 구현해서 데코레이터를 작성한다.
__init__ 으로 호출할 함수를 초깃값을 만들어준다.
데코레이터에 인수 사용이 가능하며, init 메서드에 초깃값으로 매개변수를 주고,
func의 반환값을 반환하면서 사용 가능하다.
def html_tag(tag):
def decorater(func):
def wrapper():
return ('<{0}>{1}</{0}>'.format(tag, func()))
return wrapper
return decorater
a, b = input().split()
@html_tag(a)
@html_tag(b)
def hello():
return 'Hello, world!'
print(hello())
Unit 43. 정규 표현식
일정한 패턴을 가지는 문자열을 정규표현식이라고 칭한다.
문자열을 판단하기 위해서는 re 모듈을 가져와서 re.match('패턴', '문자열')처럼
사용하게 된다. (php의 preg_match 같은 느낌..?)
문자열이 맨 앞에 오는지, 맨 뒤에 오는지 판단하기 위해서는
^문자열, 문자열$ 처럼 사용하게 된다.
이때는 match가 아닌 search 함수를 사용하게 된다.
re.search('^Hello', 'Hello world') 처럼 사용하게 된다.
|는 특정 문자열에서 지정된 문자열이 하나라도 포함되는지 판단할 수 있다.
범위를 판단하기 위해서는 [0-9]*, [0-9]+ 처럼 사용하게 된다.
숫자 범위를 표현하고, *는 문자가 0개 이상 있는지, +는 1개 이상 있는지
판단하게 된다. 문자가 한 개만 있는지 판단할 때는
?와 .을 사용하는데, ?는 앞의 문자가 0개 또는 1개인지 판단한다.
.은 .이 있는 위치에 아무 문자 혹은 숫자가 1개 있는지 판단한다.
문자 개수 판단할 때는 문자{개수}, (문자열){개수} 처럼 사용한다.
[0-9]{개수} 처럼 사용할 수도 있는데 휴대전화 번호 형식에 맞는지 사용할 수 있다.
ex) [0-9]{3}-[0-9]{4}-[0-9]{4} 처럼 사용하여 match 함수와 함께 사용한다.
숫자와 영문 문자를 조합해서 판단할 때는 a-z, A-Z와 같이 표현하고
혼합하여 [A-Z0-9]+ 처럼 작성할 수 있다. 한글은 가-힣으로 사용한다.
특정 문자 범위에 포함되지 않는지 판단할 때는
[^범위]*, [^범위]+ 처럼 작성하게 된다.
특정 문자 범위로 끝나는지 확인할 때는 [범위]*$, [범위]+$ 처럼 작성한다.
특수 문자인지 판단할때는 \특수문자와 같이 작성할 수 있다.
공백처리할 때는 \s, \S와 같이 사용하게 된다.
이러한 정규표현식을 그룹으로 묶을 때는 (정규표현식) (정규표현식) 처럼 작성하게 되고,
매치객체.group(그룹숫자)로 작성하여 각 그룹에 해당하는 숫자의 문자열을 가져오게 된다.
숫자를 작성하지 않으면 한꺼번에 반환하고, 0을 작성해도 한꺼번에 반환한다.
매치객체.groups() 메서드로 작성하면 각 그룹에 해당하는 문자열을 튜플 형태로 반환한다.
그 외에는 패턴에 매칭되는 모든 문자열을 가져오기 위해서 findall 함수를 사용한다.
문자열을 바꿀때는 re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수) 처럼 작성한다.
교체함수를 지정할 수도 있는데 교체함수(매치객체)로 지정하고
re.sub('패턴', 교체함수, '문자열', 바꿀횟수)로 사용할 수 있다.
찾은 문자열을 결과에 다시 사용할 때는 \\숫자로 사용하고,
그룹에 이름을 지었다면 \\g<이름>, \\g<숫자> 처럼 사용한다.
import re
url = re.compile('^(https?://)[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/[a-zA-Z0-9-_/.?=]*')
print(url.match(input()) != None)
http 혹은 https로 시작하는지 ^를 붙여서 판별한다.
?를 붙여서 s의 개수가 0인지 1인지 확인하게 된다.
도메인 주소에서는 영문, 대소문자, 숫자, -이고 문자가 1개 이상인지 확인한다.
중간에 \.를 넣은 것은 도메인의 형식에 맞는지 들어가게 되고,
.은 정규표현식에 사용하는 특수 문자로 \를 붙여야 한다.
맨 끝 경로는 _, ., ?, = 을 사용한다했기 때문에 같이 넣어준다.
Unit 44. 모듈과 패키지
모듈은 import 키워드로 가져올 수 있다.
모듈을 여러 개 가져올 때는 모듈을 콤마로 구분하게 된다.
모듈.변수, 모듈.함수(), 모듈.클래스()와 같이 사용할 수 있다.
대표적으로 앞에서 사용했던 import math에서
제곱근 함수인 math.sqrt() 등이 존재한다.
이러한 모듈의 이름을 줄이기 위해서 import as로 모듈 이름을 지정할 수 있다.
import math as m을 사용하면 m으로 sqrt 함수를 사용할 수 있다.
from import를 사용하면 모듈의 일부만 가져올 수 있다.
from 모듈 import 변수 as 이름으로 사용하면 지정한 이름으로 일부를 가져온다.
패키지는 import 패키지.모듈 혹은 import 패키지.모듈1, 패키지.모듈2 처럼 사용한다.
그 외에는 위에 모듈을 가져올 때처럼 이름 지정이나 일부만 가져올 수 있다.
파이썬 표준 라이브러리 외에도 파이썬 패키지 인덱스인 PyPI를 통해
다양한 패키지를 사용할 수 있고 pip를 설치하여 인스톨할 수 있다.
import math
circle = float(input())
circle_area = math.pow(circle, 2) * math.pi
print(circle_area)
꾸준히가 중요.. 화이팅 ❗
'Study > python' 카테고리의 다른 글
[Python] 코딩도장 공부 (Unit 31~40) (0) | 2022.09.29 |
---|---|
[Python] 코딩도장 공부 (Unit 21~30) (0) | 2022.09.28 |
[Python] 코딩도장 공부 (Unit 11~20) (0) | 2022.09.27 |
[Python] 코딩도장 공부 (Unit 1~10) (0) | 2022.09.26 |