KR_Generator - somaz94/python-study GitHub Wiki

Python ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ธฐ์ดˆ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. yield ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# ๊ธฐ๋ณธ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜
def number_generator():
    yield 1
    yield 2
    yield 3

# ์‚ฌ์šฉ
gen = number_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
# print(next(gen))  # StopIteration ์˜ˆ์™ธ ๋ฐœ์ƒ

# for ๋ฃจํ”„๋กœ ์‚ฌ์šฉ
for num in number_generator():
    print(num)  # 1, 2, 3 ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ

# ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋น„๊ต
def get_numbers_list():
    return [1, 2, 3]  # ๋ชจ๋“  ๊ฐ’์„ ํ•œ๊บผ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ

def get_numbers_generator():
    yield 1
    yield 2
    yield 3  # ๊ฐ’์„ ํ•„์š”ํ•  ๋•Œ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ

โœ… ํŠน์ง•:

  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ 
  • ์ง€์—ฐ ํ‰๊ฐ€ (๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ)
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ƒ์„ฑ
  • ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒ ๊ฐ€๋Šฅ
  • ํ•จ์ˆ˜์˜ ์ƒํƒœ ๋ณด์กด


2๏ธโƒฃ yield ๋ฌธ

yield๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘๋‹จํ•˜๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋‹ค์Œ ํ˜ธ์ถœ ์‹œ ์ค‘๋‹จ๋œ ์ง€์ ๋ถ€ํ„ฐ ์‹คํ–‰์„ ์žฌ๊ฐœํ•œ๋‹ค.

def countdown(n):
    print("์นด์šดํŠธ๋‹ค์šด ์‹œ์ž‘!")
    while n > 0:
        print(f"{n} ๋ฐ˜ํ™˜ ์ค€๋น„ ์ค‘...")
        yield n
        print(f"{n} ๋ฐ˜ํ™˜ ์™„๋ฃŒ, ๊ณ„์† ์‹คํ–‰")
        n -= 1
    print("์นด์šดํŠธ๋‹ค์šด ์ข…๋ฃŒ!")

# ์‚ฌ์šฉ
counter = countdown(3)
print(next(counter))  # ์นด์šดํŠธ๋‹ค์šด ์‹œ์ž‘! / 3 ๋ฐ˜ํ™˜ ์ค€๋น„ ์ค‘... / 3
print(next(counter))  # 3 ๋ฐ˜ํ™˜ ์™„๋ฃŒ, ๊ณ„์† ์‹คํ–‰ / 2 ๋ฐ˜ํ™˜ ์ค€๋น„ ์ค‘... / 2
print(next(counter))  # 2 ๋ฐ˜ํ™˜ ์™„๋ฃŒ, ๊ณ„์† ์‹คํ–‰ / 1 ๋ฐ˜ํ™˜ ์ค€๋น„ ์ค‘... / 1
# next(counter)       # 1 ๋ฐ˜ํ™˜ ์™„๋ฃŒ, ๊ณ„์† ์‹คํ–‰ / ์นด์šดํŠธ๋‹ค์šด ์ข…๋ฃŒ! / StopIteration

# ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์ƒ์„ฑ
def fibonacci(limit):
    a, b = 0, 1
    count = 0
    while count < limit:
        yield a
        a, b = b, a + b
        count += 1

for fib in fibonacci(10):
    print(fib, end=' ')  # 0 1 1 2 3 5 8 13 21 34

โœ… ํŠน์ง•:

  • ์ƒํƒœ ์œ ์ง€ (ํ•จ์ˆ˜์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๊ฐ€ ๋ณด์กด๋จ)
  • ์‹คํ–‰ ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœ
  • ๊ฐ’ ๋ฐ˜ํ™˜
  • ์ปจํ…์ŠคํŠธ ๋ณด์กด
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์‹œํ€€์Šค ์ƒ์„ฑ


3๏ธโƒฃ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹

๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์†Œ๊ด„ํ˜ธ ()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

# ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹
squares = (x**2 for x in range(10))
print(next(squares))  # 0
print(next(squares))  # 1

# ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋น„๊ต
import sys
list_comp = [x**2 for x in range(1000000)]  # ๋ฉ”๋ชจ๋ฆฌ ๋งŽ์ด ์‚ฌ์šฉ
gen_exp = (x**2 for x in range(1000000))    # ๋ฉ”๋ชจ๋ฆฌ ์ ๊ฒŒ ์‚ฌ์šฉ

print(f"๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ: {sys.getsizeof(list_comp)} ๋ฐ”์ดํŠธ")
print(f"์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํฌ๊ธฐ: {sys.getsizeof(gen_exp)} ๋ฐ”์ดํŠธ")

# ํ•„ํ„ฐ๋ง๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ
even_squares = (x**2 for x in range(10) if x % 2 == 0)
print(list(even_squares))  # [0, 4, 16, 36, 64]

# ์ค‘์ฒฉ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹
matrix = ((i*j for j in range(3)) for i in range(3))
for row in matrix:
    print(list(row))  # [0, 0, 0], [0, 1, 2], [0, 2, 4]

โœ… ํŠน์ง•:

  • ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ
  • ์ง€์—ฐ ๊ณ„์‚ฐ
  • ํ•„ํ„ฐ๋ง ์ง€์›
  • ์ค‘์ฒฉ ๊ฐ€๋Šฅ
  • ์ผํšŒ์„ฑ ์ดํ„ฐ๋ ˆ์ด์…˜


4๏ธโƒฃ send(), throw(), close() ๋ฉ”์„œ๋“œ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” next() ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๊ณผ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

def counter():
    i = 0
    while True:
        val = (yield i)  # yield ํ‘œํ˜„์‹
        if val is not None:
            i = val
        else:
            i += 1

c = counter()
print(next(c))      # 0 (์ฒซ ๋ฒˆ์งธ yield๊นŒ์ง€ ์‹คํ–‰)
print(c.send(10))   # 10 (๊ฐ’์„ ๋ณด๋‚ด๊ณ  ๋‹ค์Œ yield๊นŒ์ง€ ์‹คํ–‰)
print(next(c))      # 11
print(next(c))      # 12

# throw() ๋ฉ”์„œ๋“œ๋กœ ์˜ˆ์™ธ ์ „๋‹ฌ
def exception_handler():
    try:
        while True:
            try:
                x = yield
            except ValueError:
                print("ValueError ์ฒ˜๋ฆฌ๋จ")
            else:
                print(f"๊ฐ’ ๋ฐ›์Œ: {x}")
    finally:
        print("์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ข…๋ฃŒ")

g = exception_handler()
next(g)  # ์ฒซ ๋ฒˆ์งธ yield๊นŒ์ง€ ์ง„ํ–‰
g.send(1)  # "๊ฐ’ ๋ฐ›์Œ: 1"
g.throw(ValueError)  # "ValueError ์ฒ˜๋ฆฌ๋จ"
g.close()  # "์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ข…๋ฃŒ"

# ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์‚ฌ์šฉ
def grep(pattern):
    print(f"ํŒจํ„ด '{pattern}' ๊ฒ€์ƒ‰ ์ค‘...")
    while True:
        line = (yield)
        if pattern in line:
            print(line)

search = grep("python")
next(search)  # ์ฒซ ๋ฒˆ์งธ yield๊นŒ์ง€ ์‹คํ–‰
search.send("hello world")  # ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ ์•ˆ ํ•จ
search.send("python is awesome")  # "python is awesome" ์ถœ๋ ฅ
search.close()  # ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ข…๋ฃŒ

โœ… ํŠน์ง•:

  • ์–‘๋ฐฉํ–ฅ ํ†ต์‹  (send)
  • ์ƒํƒœ ๋ณ€๊ฒฝ
  • ์˜ˆ์™ธ ์ฃผ์ž… (throw)
  • ์ข…๋ฃŒ ์ฒ˜๋ฆฌ (close)
  • ์ฝ”๋ฃจํ‹ด ๊ตฌํ˜„
  • ๋ณต์žกํ•œ ์ œ์–ด ํ๋ฆ„ ์ฒ˜๋ฆฌ


5๏ธโƒฃ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ฒด์ด๋‹๊ณผ ํŒŒ์ดํ”„๋ผ์ธ

์—ฌ๋Ÿฌ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

def numbers():
    for i in range(1, 4):
        yield i

def squares(nums):
    for n in nums:
        yield n**2

def add_one(nums):
    for n in nums:
        yield n + 1

# ์ฒด์ด๋‹
chain = add_one(squares(numbers()))
print(list(chain))  # [2, 5, 10]

# yield from์„ ์‚ฌ์šฉํ•œ ์ฒด์ด๋‹
def numbers_gen():
    yield from range(1, 4)

def squares_gen(nums):
    for n in nums:
        yield n**2

# ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ
def process_file(filename):
    with open(filename, 'r') as f:
        yield from f  # ํŒŒ์ผ์˜ ๊ฐ ๋ผ์ธ์„ ์ƒ์„ฑ

def grep_filter(lines, pattern):
    for line in lines:
        if pattern in line:
            yield line

def replace_text(lines, old, new):
    for line in lines:
        yield line.replace(old, new)

# ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ์˜ˆ์‹œ
# pipeline = replace_text(grep_filter(process_file('log.txt'), 'ERROR'), 'ERROR', 'CRITICAL')

โœ… ํŠน์ง•:

  • ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ
  • ๋ชจ๋“ˆํ™”๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • yield from ํ™œ์šฉ
  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ
  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ ์šฉ
  • ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋‹จ์ˆœํ™”


6๏ธโƒฃ ๋ฌดํ•œ ์‹œํ€€์Šค์™€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ๋ฌดํ•œ ์‹œํ€€์Šค ์ƒ์„ฑ์ด๋‚˜ ๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๋ฌดํ•œ ์‹œํ€€์Šค ์ƒ์„ฑ
def infinite_counter(start=0):
    while True:
        yield start
        start += 1

# ์Šฌ๋ผ์ด์‹ฑ์„ ์œ„ํ•œ itertools ์‚ฌ์šฉ
import itertools
counter = infinite_counter()
first_10 = list(itertools.islice(counter, 10))
print(first_10)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# ์—ฌ๋Ÿฌ ์‹œํ€€์Šค ๋ณ‘ํ•ฉ
def merge_sequences(*sequences):
    """์—ฌ๋Ÿฌ ์‹œํ€€์Šค๋ฅผ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ๋ณ‘ํ•ฉ"""
    iterators = [iter(seq) for seq in sequences]
    active = len(iterators)
    
    while active:
        active = 0
        for it in iterators:
            try:
                yield next(it)
                active += 1
            except StopIteration:
                pass

# ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒญํ‚น
def chunk_data(iterable, size):
    """์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ง€์ •๋œ ํฌ๊ธฐ์˜ ์ฒญํฌ๋กœ ๋ถ„ํ• """
    iterator = iter(iterable)
    while True:
        chunk = list(itertools.islice(iterator, size))
        if not chunk:
            break
        yield chunk

# ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„
def permutations(items):
    """์žฌ๊ท€์  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ˆœ์—ด ์ƒ์„ฑ"""
    if len(items) <= 1:
        yield items
    else:
        for i in range(len(items)):
            for perm in permutations(items[:i] + items[i+1:]):
                yield [items[i]] + perm

for p in permutations([1, 2, 3]):
    print(p)  # [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]

โœ… ํŠน์ง•:

  • ๋ฌดํ•œ ์‹œํ€€์Šค ์ƒ์„ฑ
  • ์ง€์—ฐ ํ‰๊ฐ€ ํ™œ์šฉ
  • itertools์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ณต์žกํ•œ ์‹œํ€€์Šค ์ฒ˜๋ฆฌ
  • ์žฌ๊ท€์  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ


7๏ธโƒฃ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์„ฑ๋Šฅ๊ณผ ์ตœ์ ํ™”

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‹ค์ œ ์‘์šฉ ์‚ฌ๋ก€๋ฅผ ์•Œ์•„๋ณธ๋‹ค.

import time
import sys

# ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ • ์˜ˆ์ œ
def memory_usage_comparison():
    # ํฐ ๋ฆฌ์ŠคํŠธ vs ์ œ๋„ˆ๋ ˆ์ดํ„ฐ
    start = time.time()
    big_list = [i for i in range(10000000)]
    list_memory = sys.getsizeof(big_list)
    list_time = time.time() - start
    
    start = time.time()
    big_gen = (i for i in range(10000000))
    gen_memory = sys.getsizeof(big_gen)
    gen_time = time.time() - start
    
    print(f"๋ฆฌ์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ: {list_memory:,} ๋ฐ”์ดํŠธ, ์ƒ์„ฑ ์‹œ๊ฐ„: {list_time:.4f}์ดˆ")
    print(f"์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ: {gen_memory:,} ๋ฐ”์ดํŠธ, ์ƒ์„ฑ ์‹œ๊ฐ„: {gen_time:.4f}์ดˆ")
    print(f"๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ: {list_memory/gen_memory:.0f}๋ฐฐ")

# ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ตœ์ ํ™”
def process_large_file(filename, process_line):
    """๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ"""
    with open(filename, 'r') as file:
        for line in file:  # ํŒŒ์ผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ™œ์šฉ
            yield process_line(line.strip())

# ์ง€์—ฐ ๊ณ„์‚ฐ์œผ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ
def lazy_evaluation_example(n):
    """ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ณ„์‚ฐ ์ˆ˜ํ–‰"""
    print("์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ƒ์„ฑ ์‹œ์ž‘")
    
    def expensive_calculation(x):
        print(f"{x}์— ๋Œ€ํ•œ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ ์ˆ˜ํ–‰ ์ค‘...")
        time.sleep(0.1)  # ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜
        return x**2
    
    # ๋ชจ๋“  ๊ณ„์‚ฐ์„ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
    for i in range(n):
        yield expensive_calculation(i)

# ์‚ฌ์šฉ ์˜ˆ:
# for result in lazy_evaluation_example(100):
#     if result > 50:  # ์กฐ๊ฑด์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋งŒ ํ•„์š”
#         print(f"๊ฒฐ๊ณผ ์ฐพ์Œ: {result}")
#         break

โœ… ํŠน์ง•:

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ์ง€์—ฐ ๊ณ„์‚ฐ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๋ฐฉ์ง€
  • ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๊ณ„์‚ฐ (์ค‘๊ฐ„์— ์ค‘๋‹จ ๊ฐ€๋Šฅ)
  • IO ๋ฐ”์šด๋“œ ์ž‘์—… ์ตœ์ ํ™”
  • ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ


์ฃผ์š” ํŒ

โœ… ๋ชจ๋ฒ” ์‚ฌ๋ก€:

  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉ
  • ๋ฌดํ•œ ์‹œํ€€์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒ ๊ฐ€๋Šฅํ•จ์„ ์ฃผ์˜
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ฒด์ด๋‹ ํ™œ์šฉ
  • ์ƒํƒœ ๊ด€๋ฆฌ ์ฃผ์˜
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  • ํฐ ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ์— ํ™œ์šฉ
  • yield from์œผ๋กœ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์œ„์ž„
  • ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ์— ์ ํ•ฉ
  • itertools ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ
  • ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐํ•˜๋Š” ์ง€์—ฐ ํ‰๊ฐ€ ํ™œ์šฉ
  • ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ ๊ณ ๋ ค
  • ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹จ๊ณ„๋ณ„ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰
  • ๋ณต์žกํ•œ ์ฝ”๋ฃจํ‹ด๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ถ€ํ„ฐ ์‹œ์ž‘


โš ๏ธ **GitHub.com Fallback** โš ๏ธ