Generator Function

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