วันพุธที่ 13 พฤษภาคม พ.ศ. 2552

python yield

เห็นแว๊บ ๆ สำหรับ keyword 'yield' สำหรับ python ก็มานั่งดูว่าใช้ประโยชน์อะไรได้บ้าง พอดีเห็นตัวอย่างง่าย ๆ เอามาทำความเข้าใจ เหมือนกับว่า มันจะใช้ช่วยในการ return ข้อมูลออกมา จาก function ที่กำลังดำเนินการาอยู่ ดูตัวอย่างดีกว่า

def odds(limit):
    i = 1
    while True:
        if limit > i
            break
        print 'in odds : > %s' % str(i)
        yield i
        i += 2

for i in odds(5):
    print 'odds : %s' % str(i)

## return
in odds : > 1
odds : 1
in odds : > 3
odds : 3
in odds : > 5
odds : 5


function ดึงแต่เลขคี่ ที่ค่าไม่เกิน limit
จากที่เห็น ก็จะเห็นว่า จะมีการเรียกเข้า function odds ซึ่งยังทำการเทียบข้อมูลไม่ถึง limit ที่ตั้งไว้ก็จะมีการ return ค่าออกมาให้ function เรียกใช้งานทำงานไปก่อน

ซึ่งจะต่างจาก function ธรรมดาทั่วไป ที่ทำการ return function เมื่อทำงานเสร็จสิ้น ตามตัวอย่างนี้

def odd2(limit):
    r = []
    i = 1
    while 1:
        if i > limit:
            break
        print 'in odd2 : > %s' % str(i)
        r.append(i)
        i += 2
        return r

for i in odd2(5):
    print 'odd2 : %s' % str(i)

## return
in odd2 : > 1
in odd2 : > 3
in odd2 : > 5
odd2 : 1
odd2 : 3
odd2 : 5


โดย ดู ๆ แล้ว ในส่วนของ yield น่าจะใช้กับ function loop ที่ต้องการทำงานกับ ตัวแปร ภายนอก ที่มีการเปลี่ยนแลงเรื่อย ๆ


มาเพิ่มตัวอย่างอีกสักสองอันครับ สำหรับ สุดยอด function นี้
อันแรกเป็นการเขียนเพื่อจับคู่ loop แต่ละ list ครับ
def for_2list(l1, l2):
    for i1 in l1:
        for i2 in l2:
            yield i1, i2
เวลาเรียกใช้
ll1 = ['a', 'b', 'c']
ll2 = [1, 2, 3]

for a1, a2 in for_2list(ll1, ll2):
    print ' >> %s, %s' %(a1, a2)

ผลลัพท์
>> a, 1
>> a, 2
>> a, 3
>> b, 1
>> b, 2
>> b, 3
>> c, 1
>> c, 2
>> c, 3

มาเพิ่มเติมกันอีกสักอันครับ สำหรับตัวอย่าง แจ่ม ๆ ที่น่าจะได้ใช้กันบ่อย
คือ loop list ทีละ pack โดยกำหนด pack ได้เองว่าทีละเท่าไร

def for_list_pack(list, size):
    i=0;j=size
    while(True):
        if j > len(list):
            j = len(list)
        data = list[i:j]
        yield data
        if j == len(list):
            break
        i=j;j=i+size

เวลาเรียกใช้
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

for p in for_list_pack(l1, 3):
    print ' >> %s ' %p

ผลลัพท์

>> [1, 2, 3]
>> [4, 5, 6]
>> [7, 8, 9]
>> [0]


จริง ๆ เอาไปใช้งานได้เลยแหละครับ ^_^

ไม่มีความคิดเห็น: