Generator expression

Generator expression به شما اجازه می‌دهد که یک Generator را بدون استفاده از کلمه کلیدی yield ایجاد کنید. قوانین ساخت Generator expression دقیقاً مشابه List comprehension می‌باشد، با این تفاوت که به جای علامت [] از () در ساخت آنها استفاده می‌شود. نحوه ایجاد Generator expression به صورت زیر می‌باشد:

(Expression for item in collection)

تفاوت دیگر Generator expression و List comprehension در خروجی آنها است. به کد زیر توجه کنید:

List_comprehension   = [number for number in range(5)]
Generator_Expression = (number for number in range(5))

print(List_comprehension)
print(Generator_Expression)
[0, 1, 2, 3, 4]
<generator object <genexpr> at 0x00BCC9C8>

همانطور که در خروجی مشاهده می‌کنید، خروجی List comprehension، یک List و خروجی Generator Expression یک Generator است. این بدین معناست که List comprehension یک لیست تولید کرده و همه آیتم‌های آن را در حافظه بارگذاری می‌کند ولی Generator Expression یک Generator تولید می‌کند که در واقع یک نوع قابل پیمایش می‌باشد و در نتیجه این امکان را به ما می‌دهد که آیتم‌ها را تک تک پیمایش و در داخل حافظه بارگذاری کنیم. این باعث می‌شود که Generator Expression نسبت به List comprehension حافظه کمتری اشغال کند. برای درک بهتر این موضوع می‌توان از متد ()getsizeof مزبوط به پکیج sys استفاده کرد. به کد زیر توجه کنید:

from sys import getsizeof

list_comprehension   = [number for number in range(1000)]
Generator_Expression = (number for number in range(1000))

print(getsizeof(list_comprehension))
print(getsizeof(Generator_Expression))
4508
56

همانطور که در خروجی کد بالا مشاهده می‌کنید، خروجی Generator Expression نسبت به List comprehension فضای بسیار کمتر از حافظه را اشغال می‌کند. مقادیری که در خروجی نمایش داده شده اند، بر حسب بایت می باشند.