43.6 연습문제: 문자열 검색 코루틴 만들기

다음 소스 코드를 완성하여 문자열에서 특정 단어가 있으면 True, 없으면 False가 출력되게 만드세요. find 함수는 코루틴으로 작성해야 합니다.

practice_coroutine.py

                                 
...
                                 
 
f = find('Python')
next(f)
 
print(f.send('Hello, Python!'))
print(f.send('Hello, world!'))
print(f.send('Python Script'))
 
f.close()

실행 결과

True
False
True

정답

def find(word):
    result = False
    while True:
        line = (yield result)
        result = word in line

해설

코루틴 find는 f = find('Python')와 같이 사용하고 있으므로 검색할 단어를 매개변수로 받습니다. 따라서 def find(word):와 같이 만들어줍니다. 그리고 send 메서드로 문자열을 보낸 뒤 반환값을 출력하고 있으므로 yield를 사용하여 값을 받아오면서 바깥으로 값을 전달하는 방식을 사용합니다. 특히 find 함수를 종료하지 않고 계속 유지시키기 위해 무한 루프를 사용합니다.

함수 안에서는 먼저 문자열 검색 결과를 저장할 변수 result를 만들고 False를 저장합니다. 그다음에 while True:로 무한 루프를 만든 뒤 line = (yield result)와 같이 바깥에서 send가 보낸 문자열은 line에 저장하고, result를 바깥으로 전달합니다. 그리고 result = word in line과 같이 in 연산자로 받아온 문자열에 특정 단어가 있는지 확인하여 결과를 할당합니다.  이 반복이 한 번 끝나면 (yield result)를 사용하여 검색 결과를 바깥으로 전달합니다.