python 关键字之yield、next

时间:2021-10-01 23:32:29
包含yield 关键字的函数成为一个迭代器,yield跟return的位置一样,只不过每次返回结果后,并没有退出,而是等待下一次迭代,下一次迭代开始后从yield后的语句开始执行,直到再次遇到yield,返回新一次的结果。可以看成是一个List, 但是和list的不同的是占用内存少。

def subimage_generator(img, stride, patch_size, nb_hr_images):
for _ in range(nb_hr_images):
for x in range(0, img_size - patch_size, stride):
for y in range(0, img_size - patch_size, stride):
subimage = img[x : x + patch_size, y : y + patch_size, :]

yield subimage
当你调用生成器函数的时候,如上例中的程序subimage_generator()并不会执行函数体内的代码,它仅仅只是返回生成器.函数体内的代码只有直到每次循环迭代(for)生成器的时候才会运行。函数第一次运行时,它会从函数开始处直到碰到yield时,就返回循环的第一个值,然后,交互的运行、返回,直到没有值返回为止。如果函数在运行但是并没有遇到yield,就认为该生成器是空,原因可能是循环终止,或者没有满足任何”if/else
 访问subimage_generator()  可以借助python中的内置函数next

image_subsample_iterator = subimage_generator(img, stride, hr_patch_size, nb_hr_images)
for j in range(stride_range):
for k in range(stride_range):
hr_samples[i, :, :, :] = next(image_subsample_iterator)
i += 1