包含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