generator คืออะไร และสร้างอย่างไร?

ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Kirill Smirnov

Data Science Consultant, Altran

นิยาม

Generator - อ็อบเจกต์ iterable พิเศษที่สร้างจากฟังก์ชันที่มีคีย์เวิร์ด yield อยู่ในเนื้อหา

def func():
    # Return a value from super complex calculations
    return 0
result = func()
print(result)
0
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

นิยาม

Generator - อ็อบเจกต์ iterable พิเศษที่สร้างจากฟังก์ชันที่มีคีย์เวิร์ด yield อยู่ในเนื้อหา

def func():
    # Yield a value from super complex calculations
    yield 0
result = func()
print(result)
<generator object result at 0x105736e10>
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Generator ในฐานะ Iterable

def func():
    # Yield a value from super complex calculations
    yield 0

result = func()
for item in result:
    print(item)
0
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

หลาย yield!

def func():
    yield 0
    yield 1
    yield 2
result = func()
for item in result:
    print(item)
0
1
2
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

yield ในลูป

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
for item in result:
    print(item)
0
2
4
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

แปลง generator เป็น list

def func(n):
    for i in range(0, n):
        yield 2*i

result = func(5)
list(result)
[0, 2, 4, 6, 8]
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Generator ในฐานะ Iterator

Generator เป็นทั้ง Iterable และ Iterator

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
next(result)
0
next(result)
2
next(result)
4
next(result)
StopIteration
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Generator ใช้ได้ครั้งเดียว

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
for item in result:
    print(item)
0
2
4
for item in result:
    print(item)
# nothing
result = func(3)
for item in result:
    print(item)
0
2
4
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Generator ใช้ได้ครั้งเดียว

def func(n):
    for i in range(0, n):
        yield 2*i
result = func(3)
list(result)
[0, 2, 4]
list(result)
[]
result = func(3)
list(result)
[0, 2, 4]
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Generator comprehension

result = [2*i for i in range(0, 3)]
print(result)
[0, 2, 4]
result = (2*i for i in range(0, 3))
print(result)
<generator object result at 0x105736e10>
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

การวนผ่านข้อมูล

result = (2*i for i in range(0, 3))
for item in result:
    print(item)
0
2
4
next(result)
StopIteration
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

ทำไมต้องใช้ generator?

  • วิธีง่ายในการสร้างอ็อบเจกต์ iterable แบบกำหนดเอง

[1, 3, 2, 4, 3, 5]

def create_jump_sequence(n):
    for i in range(1, n-1):
        yield i
        yield i+2
jump_sequence = create_jump_sequence(5)
list(jump_sequence)
[1, 3, 2, 4, 3, 5]
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

ทำไมต้องใช้ generator?

  • วิธีง่ายในการสร้างอ็อบเจกต์ iterable แบบกำหนดเอง
  • lazy initialization

[1, 3, 2, 4, 3, 5, 4, 6, 5, 7, ...]

def create_jump_sequence(n):
    for i in range(1, n-1):
        yield i
        yield i+2
jump_sequence = create_jump_sequence(500)
next(jump_sequence)
1
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

ทำไมต้องใช้ generator?

  • วิธีง่ายในการสร้างอ็อบเจกต์ iterable แบบกำหนดเอง
  • lazy initialization
  • สร้างอ็อบเจกต์ iterable แบบไม่มีที่สิ้นสุดได้
def create_inf_generator():
    while True:
        yield 'I am infinite!'
inf_generator = create_inf_generator()
next(inf_generator)
I am infinite
ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

มาฝึกกันเถอะ!

ฝึกทำโจทย์สัมภาษณ์งานเขียนโค้ดด้วย Python

Preparing Video For Download...