مرکزی مواد پر جائیں
ماڈیول 6 · سبق 3 از 4کورس میں 23/36~10 min
ماڈیول اسباق (3/4)

جنریٹر کا اظہار

ایک جنریٹر اظہار ایک فہرست کی سمجھ کی طرح ہے، لیکن ساتھ مربع بریکٹ کے بجائے قوسین۔ فرق ڈرامائی ہے: یہ میموری میں فہرست نہیں بناتا، یہ عناصر مطالبے پر پیدا کرتا ہے، ایک وقت میں ایک.

Python
gen = (n * n for n in range(1_000_000))
# istantaneo, memoria costante: nessun calcolo ancora fatto

list_comp = [n * n for n in range(1_000_000)]
# alloca 1M di int in memoria

سستی (سست تشخیص)

جنریٹر اس وقت تک کچھ نہیں کرتا جب تک کوئی اگلی قیمت نہ پوچھے:

Python
gen = (n * n for n in range(5))
next(gen)    # 0    (calcolato adesso)
next(gen)    # 1
next(gen)    # 4
# ... e così via, fino a StopIteration

یہ ختم ہو جاتا ہے: تمام عناصر کو استعمال کرنے کے بعد، یہ ہمیشہ کے لیے خالی ہوتا ہے۔ اسے دوبارہ استعمال کرنے کے لیے، آپ کو اسے دوبارہ بنانا ہوگا۔

اسے کب استعمال کرنا ہے۔

جب آپ نتائج کو کسی ایسے فنکشن میں منتقل کرتے ہیں جو انہیں ترتیب سے کھاتا ہے:

Python
total = sum(n * n for n in range(1_000_000))
# nessuna lista intermedia, memoria costante

sum, any, all, max, min, "".join(...) سبھی جنریٹر قبول کرتے ہیں۔ اگر بیرونی فنکشن کو صرف کال قوسین کی ضرورت ہوتی ہے، تو آپ کر سکتے ہیں۔ جنریٹر کے اپنے کو چھوڑ دیں:

Python
sum((n * n for n in range(10)))    # OK
sum(n * n for n in range(10))      # IDENTICO, più leggibile

any اور all: شارٹ سرکٹ

any(...) اور all(...) جیسے ہی ان کے پاس جواب آتا ہے تکرار کرنا بند کر دیں۔ جنریٹر کے ساتھ، درج ذیل عناصر کی گنتی بھی نہیں کی جاتی ہے۔

Python
nums = [1, 2, 3, 4, 5]
any(n > 3 for n in nums)    # True (si ferma a 4)
all(n > 0 for n in nums)    # True
all(n > 2 for n in nums)    # False (si ferma a 1)

پیٹرن: سست پائپ لائن

Python
righe = (linea.strip() for linea in testo.splitlines())
non_vuote = (r for r in righe if r)
prime_dieci = []
for r in non_vuote:
    prime_dieci.append(r)
    if len(prime_dieci) == 10:
        break

کوئی درمیانی فہرست نہیں، یہاں تک کہ بڑے آدانوں پر بھی۔

sum, any, all کے ساتھ استعمال کرنے والے جنریٹرز

جنریٹر ایکسپریشنز ان فنکشنز کو براہ راست منتقل کرنے کے لیے بہترین ہیں جو تکراری استعمال کرتے ہیں، جیسے sum()، any()، یا all()۔ اس صورت میں، آپ جنریٹر کے اظہار کے بیرونی قوسین کو چھوڑ سکتے ہیں، بس لکھ کر:

Python
squares_sum = sum(x**2 for x in range(10))

یہ آپ کے کوڈ کو صاف ستھرا اور اعلیٰ میموری کو موثر رکھتا ہے۔

اسے آزمائیں

ورزش#python.m6.l3.e1
کوششیں: 0لوڈ ہو رہا ہے…

sum() کے اندر جنریٹر ایکسپریشن کا استعمال کرتے ہوئے 1 سے 100 (مشتمل) تک کے نمبروں کے مربعوں کے مجموعہ کی گنتی کریں۔ اسے 'ٹوٹ' کو تفویض کریں۔ 'ٹوٹ' کا اندازہ لگائیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

رینج (1، 101) میں 100 شامل ہیں۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#python.m6.l3.e2
کوششیں: 0لوڈ ہو رہا ہے…

الفاظ = ['ciao', 'mondo', 'PYTHON', 'java']` دیے گئے، کسی بھی () کو جنریٹر ایکسپریشن کے ساتھ استعمال کریں تاکہ یہ چیک کیا جا سکے کہ آیا کم از کم ایک لفظ بڑا ہے (.isupper())۔ نتیجہ کو 'has_uppercase' کو تفویض کریں۔ `has_uppercase` کا اندازہ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

الفاظ میں p کے لیے any(p.isupper()

3 کوششوں کے بعد حل دستیاب ہے۔

اضافی چیلنج

ورزش#python.m6.l3.e3
کوششیں: 0لوڈ ہو رہا ہے…

Use a generator expression passed directly to the `sum()` function to calculate the sum of the squares of all integers from 1 to 100 inclusive. Store the result in `total_sum` and evaluate it.

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

کل_سم = sum(x**2 کے لیے رینج میں x (1، 101)) لکھیں۔ ڈبل قوسین کی ضرورت نہیں ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔