Generator Function គឺជា function ទាំងឡាយណាដែលមាន stetement yield នៅក្នុងនោះ។ យ៉ាងណាម៉ិញ គ្រប់ generator function ទាំងអស់ត្រូវបង្កើតឡើង ដោយធ្វើដូចខាងក្រោមនេះ៖
def genFunction(container): print('First step') yield container[0] + 10 print('Second step') yield container[1] + 10 print('Third step') yield container[2] + 10 myGenerator = genFunction([1,2,3]) print(myGenerator)
<generator object genFunction at 0x038CDC30>
ដូចនេះ យើងឃើញថា ការយក generator function មកប្រើ មិនបណ្តាលអោយ statement នៅក្នុងនោះ ត្រូវយកទៅអនុវត្តទេ ផ្ទុយទៅវិញ វត្ថុមួយដែលត្រូវគេចាត់ទុកថាជា Generator ត្រូវបានបង្កើតឡើង។ ហើយបើយើងយក function មានស្រាប់ next() មកប្រើដោយផ្តល់ argument ជា generator នោះ យើងនឹងបានលទ្ធផលដូចខាងក្រោមនេះ៖
def genFunction(container): print('First step') yield container[0] + 10 print('Second step') yield container[1] + 10 print('Third step') yield container[2] + 10 myGenerator = genFunction([1,2,3]) print(next(myGenerator)) print(next(myGenerator)) print(next(myGenerator)) print(next(myGenerator))
First step 11 Second step 12 Third step 13 Traceback (most recent call last): File "C:/pythonProject/main.py", line 14, in <module> print(next(myGenerator)) StopIteration
សរុបមក generator function គឺជាបណ្តា function ទាំងឡាយណា ដែលនៅក្នុងនោះមាន statement yield ហើយការ call generator function មិនបណ្តាលអោយ block នៃ statement នៅក្នុងនោះត្រូវយកទៅអនុវត្តឡើយ គឺគ្រាន់តែជាការបង្កើតឡើងនូវវត្ថុមួយប្រភេទ ដែលត្រូវហៅថាជា generator តែប៉ុណ្ណោះ។ យ៉ាងណាម៉ិញ ដើម្បីអោយ block នៃ statement នៅក្នុង generator function ត្រូវយកទៅអនុវត្ត យើងចាំបាច់ត្រូវ call function next() ដោយផ្តល់ វត្ថុដែលជា generator ជា argument អោយទៅ function ឈ្មោះ next() នោះ។
ក៏ប៉ុន្តែ ការអនុវត្ត block នៃ statement នៅក្នុង generator function ត្រូវផ្អាកនៅកន្លែងដែលមាន statement yield ដំបូងគេ ហើយបើយើងចង់អោយការអនុវត្ត block នៃ statement នោះអាចដំណើរការជាបន្តទៅទៀត យើងត្រូវ call function next() តាមរបៀបដដែលនេះជាថ្មីម្តងទៀត។
ជារួម yield គឺជា statement ស្រដៀងនឹង return ដែរ ពោលគឺវាជា statement មាននាទីតំរូវអោយបញ្ជូនវត្ថុណាមួយ ទៅកាន់កន្លែងណាដែល generator ត្រូវបានផ្តល់ជា argument អោយទៅ function ឈ្មោះ next() ។ ក៏ប៉ុន្តែ yield ខុសពី return នៅត្រង់ថា yield មិនតំរូវអោយបញ្ចប់ការអនុវត្ត block នៃ statement នៅក្នុង generator function នោះទេ វាគ្រាន់តែតំរូវអោយផ្អាកការអនុវត្ត block នៃ statement នោះមួយរយៈតែប៉ុណ្នោះ ហើយការអនុវត្ត block នៃ statement នឹងត្រូវធ្វើឡើងជាបន្តទៅទៀត នៅពេលណាដែល generator ត្រូវយកទៅផ្តល់ជា argument សំរាប់ function ឈ្មោះ next() ជាថ្មីម្តងទៀត។
ជាលទ្ធផល បើសិនណាជាយើងយក statement for មកប្រើជាមួយនឹង generator ណាមួយ function ឈ្មោះ next() នឹងត្រូវយកមកប្រើជាស្វ័យប្រវត្តិ ជាច្រើនលើកច្រើនសារ រហូតដល់ block នៃ statement នៅក្នុង generator function ត្រូវយកទៅអនុវត្តបានចប់សព្វគ្រប់។
def genFunction(container): print('First step') yield container[0] + 10 print('Second step') yield container[1] + 10 print('Third step') yield container[2] + 10 myGenerator = genFunction([1,2,3]) for x in myGenerator: print(x)
First step 11 Second step 12 Third step 13យើងឃើញថា ការយក generator មកប្រើជាមួយនឹង statement for បណ្តាលអោយវត្ថុជាច្រើនត្រូវបានបង្កើតឡើង ដូចនេះ generator ក៏អាចចាត់ទុកជាវត្ថុមានប្រភេទជា container មួយដែរ។ មួយវិញទៀត ដោយ generator អាចត្រូវយកទៅប្រើជាមួយនឹង statement for បាន ដូចនេះវាមានលក្ខណៈជា iterable object ៕