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]
จริง ๆ เอาไปใช้งานได้เลยแหละครับ ^_^
ไม่มีความคิดเห็น:
แสดงความคิดเห็น