Generators in Python
Last updated
Last updated
References: Python Wiki, WikiDocs, [์ฑ ] ํ์ด์ฌ ์ฝ๋ฉ์ ๊ธฐ์
Iterator๋ฅผ ์ง์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ๊ตฌ๋ฌธ
ํจ์ ๋ด๋ถ์
yield
keyword๊ฐ ํฌํจ๋๋ฉด ํด๋น ํจ์๋ Generator๊ฐ ๋๋ค
์ ๋๋ ์ดํฐ ํจ์
๊ฐ ํธ์ถ๋ ๋ ๋ฐํ๋๋ iterator์ ์ผ์ข
์ ๋ค๋ ์ดํฐ ํจ์๋ ์ผ๋ฐ์ ์ธ ํจ์์ ๋น์ทํ๊ฒ ์๊ฒผ์ง๋ง yield ๊ตฌ๋ฌธ
์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์์ ์ ๋ฐํํ๊ณ ์ฒ๋ฆฌ๋ฅผ ๋ค์ ์์
ํ ์ ์๋ค
์ผ๋ฐ์ ์ธ ํจ์๋ ์ง์ ์ ์ด ํ๋๋ผ๋ฉด ์ ๋ค๋ ์ดํฐ๋ ์ง์ ์ ์ด ์ฌ๋ฌ๊ฐ๋ผ๊ณ ์๊ฐํ ์ ์๋ค
์ ๋ค๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ์์ ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๊ฒ๋๋ค.
Iterator๋ class ์ __iter__
, __next__
๋๋ __getitem__
method๋ฅผ ๊ตฌํํด์ผ ํ์ง๋ง,
Generator๋ ํจ์ ์์์ yield
keyword ๋ง ์ฌ์ฉํ๋ฉด ๋์
Generator๋ Iterator๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์
Generator๋ฅผ ๋ฐ์์ ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ
Generator ํจ์๋ฅผ ํธ์ถํ๋ฉด Generator ๊ฐ์ฒด๋ฅผ return ํ๋ค
ex)
Result
ํจ์ ์์์ yield
๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๋ Generator๊ฐ ๋๋ฉฐ, yield
์๋ ๊ฐ(๋ณ์)๋ฅผ ์ง์ ํ๋ค
ex)
Result
ํจ์์ yield
๋ง ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ iterator๋ฅผ ๊ตฌํํ ์ ์์
Iterator๋ __next__
method์์์ ์ง์ return์ผ๋ก ๊ฐ์ ๋ฐํํ์ง๋ง,
Generator๋ yield
์ ์ง์ ํ ๊ฐ์ด __next__
method์ ๋ฐํ๊ฐ์ผ๋ก ๋์ด
Iterator๋ raise๋ก StopIteration ์์ธ๋ฅผ ์ง์ ๋ฐ์์์ผฐ์ง๋ง,
Generator๋ ํจ์์ ๋๊น์ง ๋๋ฌํ๋ฉด StopIteration ์์ธ๊ฐ ์๋์ผ๋ก ๋ฐ์ํจ
Generator๋ generator ๊ฐ์ฒด์์ ๋ด์ฅํจ์ __next__
method ๋ฅผ ํธ์ถํ ๋๋ง๋ค ํจ์ ์์ yield
์ฝ๋๋ฅผ ์คํํ๋ฉฐ, yield์์ ๊ฐ์ ๋ฐ์์ํด
๊ทธ๋์ ์ด๋ฆ์ด Generator!!
generator์์ yield
์ ์ ๋ฌํ ๊ฐ์ iterator๊ฐ ํธ์ถํ๋ ์ชฝ์ ๋ฐํํ๋ค
Generator์์ ๋ฐํํ iterator๋ gerator ํจ์์ ์์ ์๋ yield
ํํ์์ ์ ๋ฌ๋ ๊ฐ๋ค์ ์งํฉ์ด๋ค
Generator๋ ํจ์๋ฅผ ๋๋ด์ง ์์ ์ํ์์ yield
๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๋ฐ์ผ๋ก ์ ๋ฌ ํ ์ ์๋ค
return์ ๋ฐํ ์ฆ์ ํจ์๊ฐ ๋๋์ง๋ง,
yield๋ ์ ์ ํจ์ ๋ฐ์ ์ฝ๋๊ฐ ์คํ๋ ์ ์๋๋ก ์๋ณด๋ฅผ ํด์ ๊ฐ์ ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ํ ๋ค, ๋ค์ Generator ์์ ์๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ์
yield ๋ฌธ์ด ํฌํจ๋ ์ ๋ค๋ ์ดํฐ ํจ์๋ฅผ ์คํํ๋ฉด ์ ๋ค๋ ์ดํฐ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋๋ฐ ์ด ๋๋ ํจ์์ ๋ด์ฉ์ด ์คํ๋์ง ์๋๋ค.
next()
๋ผ๋ ๋นํธ์ธ ๋ฉ์๋๋ฅผ ํตํด ์ ๋ค๋ ์ดํฐ๋ฅผ ์คํ์ํฌ ์ ์์ผ๋ฉฐ next()
๋ฉ์๋ ๋ด๋ถ์ ์ผ๋ก iterator ๋ฅผ ์ธ์๋ก ๋ฐ์ ์ดํฐ๋ ์ดํฐ์ __next__()
๋ฉ์๋๋ฅผ ์คํ์ํจ๋ค.
์ฒ์ __next__()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํจ์์ ๋ด์ฉ์ ์คํํ๋ค yield ๋ฌธ์ ๋ง๋ฌ์ ๋ ์ฒ๋ฆฌ๋ฅผ ์ค๋จํ๋ค.
์ด ๋ ๋ชจ๋ local state ๋ ์ ์ง๋๋๋ฐ ๋ณ์์ ์ํ, ๋ช ๋ น์ด ํฌ์ธํฐ, ๋ด๋ถ ์คํ, ์์ธ ์ฒ๋ฆฌ ์ํ๋ฅผ ํฌํจํ๋ค.
๊ทธ ํ ์ ์ด๊ถ์ ์์ ์ปจํ
์คํธ๋ก ์๋ณด(yield)ํ๊ณ ๋ __next__()
๊ฐ ํธ์ถ๋๋ฉด ์ ๋ค๋ ์ดํฐ๋ ์ค๋จ๋ ์์ ๋ถํฐ ๋ค์ ์์ํ๋ค.
Generator๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋์ ๋ ๊ฒฐ๊ณผ์ list๋ฅผ ๋ฐํํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ์ดํดํ๊ธฐ์ ๋ช ํํ๋ค
Generator๋ ๋ชจ๋ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ memory์ ์ ์ฅํ์ง ์์ผ๋ฏ๋ก, ์ ๋ ฅ๊ฐ์ ์์ ์๊ธฐ ์ด๋ ค์ธ ๋๋ ์ฐ์๋ ์ถ๋ ฅ์ ๋ง๋ค ์ ์๋ค
์ ๋ค๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด yield ๋ฅผ ํตํด ๊ทธ๋๊ทธ๋ ํ์ํ ๊ฐ๋ง์ ๋ฐ์ ์ฐ๊ธฐ๋๋ฌธ์ ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๊ณ ์์ ํ์๊ฐ ์๊ฒ๋๋ค
๋ค๋ง ์ ๋ค๋ ์ดํฐ๋ ๊ทธ๋๊ทธ๋ ํ์ํ ๊ฐ์ ๋์ ธ์ฃผ๊ณ ๊ธฐ์ตํ์ง๋ ์๊ธฐ ๋๋ฌธ์ a ๋ฆฌ์คํธ
๊ฐ ์ฌ๋ฌ๋ฒ ์ฌ์ฉ๋ ์ ์๋ ๋ฐ๋ฉด b ์ ๋ค๋ ์ดํฐ
๋ ํ๋ฒ ์ฌ์ฉ๋ ํ ์์ง๋๋ค
์ด๋ ๋ชจ๋ ์ดํฐ๋ ์ดํฐ๊ฐ ๋ง์ฐฌ๊ฐ์ง์ธ๋ฐ List, Set ์ ์ดํฐ๋ฌ๋ธํ์ง๋ง ์ดํฐ๋ ์ดํฐ๋ ์๋๊ธฐ์ ์์ง๋์ง ์๋๋ค