ماڈیول اسباق (3/4)
جنریٹر کا اظہار
ایک جنریٹر اظہار ایک فہرست کی سمجھ کی طرح ہے، لیکن ساتھ مربع بریکٹ کے بجائے قوسین۔ فرق ڈرامائی ہے: یہ میموری میں فہرست نہیں بناتا، یہ عناصر مطالبے پر پیدا کرتا ہے، ایک وقت میں ایک.
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سستی (سست تشخیص)
جنریٹر اس وقت تک کچھ نہیں کرتا جب تک کوئی اگلی قیمت نہ پوچھے:
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یہ ختم ہو جاتا ہے: تمام عناصر کو استعمال کرنے کے بعد، یہ ہمیشہ کے لیے خالی ہوتا ہے۔ اسے دوبارہ استعمال کرنے کے لیے، آپ کو اسے دوبارہ بنانا ہوگا۔
اسے کب استعمال کرنا ہے۔
جب آپ نتائج کو کسی ایسے فنکشن میں منتقل کرتے ہیں جو انہیں ترتیب سے کھاتا ہے:
total = sum(n * n for n in range(1_000_000))
# nessuna lista intermedia, memoria costantesum, any, all, max, min, "".join(...) سبھی جنریٹر قبول کرتے ہیں۔
اگر بیرونی فنکشن کو صرف کال قوسین کی ضرورت ہوتی ہے، تو آپ کر سکتے ہیں۔
جنریٹر کے اپنے کو چھوڑ دیں:
sum((n * n for n in range(10))) # OK
sum(n * n for n in range(10)) # IDENTICO, più leggibileany اور all: شارٹ سرکٹ
any(...) اور all(...) جیسے ہی ان کے پاس جواب آتا ہے تکرار کرنا بند کر دیں۔
جنریٹر کے ساتھ، درج ذیل عناصر کی گنتی بھی نہیں کی جاتی ہے۔
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)پیٹرن: سست پائپ لائن
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()۔ اس صورت میں، آپ جنریٹر کے اظہار کے بیرونی قوسین کو چھوڑ سکتے ہیں، بس لکھ کر:
squares_sum = sum(x**2 for x in range(10))یہ آپ کے کوڈ کو صاف ستھرا اور اعلیٰ میموری کو موثر رکھتا ہے۔
اسے آزمائیں
sum() کے اندر جنریٹر ایکسپریشن کا استعمال کرتے ہوئے 1 سے 100 (مشتمل) تک کے نمبروں کے مربعوں کے مجموعہ کی گنتی کریں۔ اسے 'ٹوٹ' کو تفویض کریں۔ 'ٹوٹ' کا اندازہ لگائیں۔
اشارہ دکھائیں۔
رینج (1، 101) میں 100 شامل ہیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
الفاظ = ['ciao', 'mondo', 'PYTHON', 'java']` دیے گئے، کسی بھی () کو جنریٹر ایکسپریشن کے ساتھ استعمال کریں تاکہ یہ چیک کیا جا سکے کہ آیا کم از کم ایک لفظ بڑا ہے (.isupper())۔ نتیجہ کو 'has_uppercase' کو تفویض کریں۔ `has_uppercase` کا اندازہ کریں۔
اشارہ دکھائیں۔
الفاظ میں p کے لیے any(p.isupper()
3 کوششوں کے بعد حل دستیاب ہے۔
اضافی چیلنج
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 کوششوں کے بعد حل دستیاب ہے۔