for اسٹیٹمنٹ کے ساتھ else کلاز لگانے والا درج ذیل کوڈ چلایا جائے تو کیا دکھائی دے گا؟
for n in range(4):if n == 9: breakelse: print("done")print(n)
صرف 3 دکھائی دیتا ہے، اور done نہیں آتا
صرف done دکھائی دیتا ہے، اور 3 نہیں آتا
3 اور done اسی ترتیب سے دکھائی دیتے ہیں
done اور 3 اسی ترتیب سے دکھائی دیتے ہیں
درست جوابD. done اور 3 اسی ترتیب سے دکھائی دیتے ہیں
for اسٹیٹمنٹ کے ساتھ لگا else کلاز (else節) تب چلتا ہے جب لوپ break سے توڑے بغیر ختم ہو۔ range(4) میں 9 نہیں ہے، اس لیے break کبھی نہیں ہوتا، اور لوپ آخر تک چلنے کے بعد else کا print چلتا ہے، چنانچہ done آتا ہے۔ اس کے بعد والا print(n) لوپ سے نکلنے کے بعد n میں بچی ہوئی آخری قدر 3 دکھاتا ہے۔ ترتیب الٹ سمجھنے سے وہ شکل بنتی ہے جس میں 3 پہلے آتا ہے؛ یہ غلط فہمی کہ لوپ کے اختتام پر else ہمیشہ چھوڑ دیا جاتا ہے، وہ شکل دیتی ہے جس میں done نہیں آتا؛ اور یہ نظر انداز کرنا کہ لوپ سے نکلنے کے بعد بھی n باقی رہتا ہے، وہ شکل دیتا ہے جس میں 3 نہیں آتا۔
سوال 2 | break اور else
دیکھیے کہ break سے لوپ سے نکلنے پر else کلاز کے ساتھ کیا ہوتا ہے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
for c in "abc": if c == "b": breakprint(c)else: print("no break")
a b c اور no break سب دکھائی دیتے ہیں
a اور no break اسی ترتیب سے دکھائی دیتے ہیں
a اور b، یہ دونوں اسی ترتیب سے دکھائی دیتے ہیں
a دکھائی دیتا ہے، اور no break نہیں دکھائی دیتا
درست جوابD. a دکھائی دیتا ہے، اور no break نہیں دکھائی دیتا
پہلے چکر میں c کی قدر a ہے، اس لیے print(c) چلتا ہے اور a نکلتا ہے۔ دوسرے چکر میں c کی قدر b ہو جاتی ہے، اور break لوپ کو توڑ دیتا ہے۔ for اسٹیٹمنٹ کا else کلاز صرف تب چلتا ہے جب لوپ break سے توڑے بغیر ختم ہو، اس لیے یہاں وہ چھوڑ دیا جاتا ہے اور no break نہیں آتا۔ یہ فرض کرنا کہ لوپ ختم ہونے پر else ہمیشہ چلتا ہے، وہ شکل دیتا ہے جس میں no break بھی آتا ہے؛ یہ غلط پڑھنا کہ print(c)، break سے پہلے ہے، وہ شکل دیتا ہے جس میں b بھی آتا ہے؛ اور خود break کو نظر انداز کرنا وہ شکل دیتا ہے جس میں a b c سب دکھائی دیتے ہیں۔
سوال 3 | خالی ہو تب بھی else
غور کیجیے کہ جس چیز پر تکرار کی جا رہی ہو وہ خالی ہو تو for اسٹیٹمنٹ کے else کلاز کا کیا ہوتا ہے۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
items = []for it in items:print(it)else: print("finished")
else کلاز نظر انداز ہو جاتا ہے اور TypeError آتا ہے
چونکہ تکرار 0 بار ہوتی ہے، اس لیے StopIteration آتا ہے
کچھ بھی دکھائے بغیر لوپ سے نکل کر عمل ختم ہو جاتا ہے
finished صرف ایک بار دکھائی دیتا ہے
درست جوابD. finished صرف ایک بار دکھائی دیتا ہے
for اسٹیٹمنٹ کے else کلاز کے چلنے کی شرط "لوپ break سے توڑے بغیر ختم ہوا" ہے، نہ کہ "کم از کم ایک بار تکرار ہوئی"۔ چونکہ items خالی ہے، لوپ کا جسم کبھی نہیں چلتا، لیکن چونکہ break بھی نہیں ہوا، else حسبِ معمول چلتا ہے اور finished دکھائی دیتا ہے۔ اگر آپ سمجھیں کہ خالی ہونے پر بھی else چھوڑ دیا جاتا ہے تو وہ شکل بنتی ہے جس میں کچھ نہیں دکھائی دیتا۔ for اسٹیٹمنٹ کو خالی لسٹ دینا بذاتِ خود درست سنٹیکس ہے، اس لیے کوئی ایکسیپشن (例外) نہیں آتا، اور نہ TypeError آتا ہے نہ StopIteration۔
سوال 4 | while/else
غور کیجیے کہ while اسٹیٹمنٹ کے ساتھ else کلاز لگا کر درمیان میں break سے نکلا جائے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
n = 5while n > 0:n -= 1if n == 2: breakelse: print("loop ended")print(n)
0 دکھائی دیتا ہے، اور loop ended نہیں دکھائی دیتا
2 دکھائی دیتا ہے، اور loop ended نہیں دکھائی دیتا
loop ended اور 2 اسی ترتیب سے دکھائی دیتے ہیں
loop ended اور 0 اسی ترتیب سے دکھائی دیتے ہیں
درست جوابB. 2 دکھائی دیتا ہے، اور loop ended نہیں دکھائی دیتا
n کی قدر 5 سے ایک ایک کر کے گھٹتی ہے، 4، 3، اور 2 تک پہنچتے ہی break ہو جاتا ہے۔ while اسٹیٹمنٹ کا else کلاز بھی، for اسٹیٹمنٹ کی طرح، صرف تب چلتا ہے جب لوپ break سے توڑے بغیر ختم ہو، اس لیے یہاں وہ چھوڑ دیا جاتا ہے اور loop ended نہیں آتا۔ باقی صرف print(n) کا 2 رہ جاتا ہے۔ یہ سمجھنا کہ else ہمیشہ چلتا ہے، وہ شکل دیتا ہے جس میں loop ended بھی آتا ہے، اور break کو نظر انداز کر کے یہ سمجھنا کہ لوپ شرط غلط ہونے تک چلتا ہے، وہ شکل دیتا ہے جس میں n کی قدر 0 ہو جاتی ہے۔
سوال 5 | continue
ایک ہی لوپ میں continue اور break دونوں استعمال کرنے والا درج ذیل کوڈ چلایا جائے تو آخر میں کون سی لسٹ دکھائی دے گی؟
out = []for i in range(6):if i == 3: continueif i == 5: breakout.append(i)print(out)
[0, 1, 2, 4, 5]
[0, 1, 2, 3]
[0, 1, 2, 4]
[0, 1, 2, 3, 4]
درست جوابC. [0, 1, 2, 4]
جب i کی قدر 0، 1 یا 2 ہو تو دونوں if اسٹیٹمنٹس سے گزر کر قدر شامل (append) ہو جاتی ہے۔ جب i کی قدر 3 ہو تو continue کام کرتا ہے اور اس چکر کا باقی حصہ، یعنی append، چھوڑ دیا جاتا ہے۔ جب i کی قدر 4 ہو تو دوبارہ شامل ہوتی ہے، اور جب i کی قدر 5 ہو تو break لوپ کو توڑ دیتا ہے، اس لیے append نہیں ہوتا۔ چنانچہ نتیجہ [0, 1, 2, 4] ہے۔ یہ سمجھنا کہ break والا چکر بھی شامل ہوتا ہے، وہ شکل دیتا ہے جو 5 تک جاتی ہے، اور continue کو pass جیسا سمجھنا وہ شکل دیتا ہے جس میں 3 باقی رہتا ہے۔
سوال 6 | الٹی ترتیب میں range
غور کیجیے کہ range کو منفی قدم (step) دینے سے کون سی ترتیب بنتی ہے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
print(list(range(10, 0, -3)))
[9, 6, 3, 0]
[7, 4, 1, -2]
[10, 7, 4, 1, 0]
[10, 7, 4, 1]
درست جوابD. [10, 7, 4, 1]
range(start, stop, step)، start سے شروع ہو کر step کے حساب سے آگے بڑھتا ہے اور stop تک پہنچنے سے پہلے رک جاتا ہے۔ یہاں 10 سے بار بار 3 گھٹانے پر 10، 7، 4، 1 بنتے ہیں، اور اگلی قدر -2، 0 یا اس سے کم ہونے کی وجہ سے شامل نہیں ہوتی۔ چونکہ اختتامی قدر 0 شامل نہیں ہوتی، اس لیے آخر میں 0 والا سلسلہ نہیں بنتا۔ یہ غلط فہمی کہ start شامل نہیں ہوتا، 7 سے شروع ہونے والی شکل دیتی ہے، اور یہ سمجھنا کہ گنتی start سے ایک قدم پہلے شروع ہوتی ہے، 9 سے شروع ہونے والی شکل دیتا ہے۔ stop کے شامل نہ ہونے کا نکتہ وہی ہے جو قدم مثبت ہونے پر ہوتا ہے۔
سوال 7 | range کی قسم
درج ذیل میں سے کون سا بیان بلٹ اِن فنکشن range بلانے سے ملنے والے آبجیکٹ کو درست طور پر بیان کرتا ہے؟
generator قسم کا آبجیکٹ جو ایک بار تکرار کے بعد خالی ہو جاتا ہے
range قسم کا آبجیکٹ جو list() کو دینے پر لسٹ بن جاتا ہے
tuple قسم کا آبجیکٹ جس کے عناصر بدلے نہیں جا سکتے
list قسم کا آبجیکٹ جو مربع بریکٹس کے ساتھ جوں کا توں دکھائی دیتا ہے
درست جوابB. range قسم کا آبجیکٹ جو list() کو دینے پر لسٹ بن جاتا ہے
range جو واپس کرتا ہے وہ range قسم کا آبجیکٹ ہے، جو ہر بار مانگے جانے پر ضروری انٹیجر کا حساب کرتا ہے۔ یہ لسٹ کی طرح تمام عناصر پہلے سے نہیں رکھتا، اس لیے بڑی حد کے لیے بھی میموری خرچ نہیں کرتا۔ مواد کو ترتیب سے دیکھنے کے لیے اسے list() سے گزارا جاتا ہے۔ type(range(3)) کا نتیجہ range ہے، list یا tuple نہیں، اور اسے صرف دکھانے سے عناصر کا سلسلہ نہیں بلکہ range(0, 3) دکھائی دیتا ہے۔ یہ جنریٹر (ジェネレータ) بھی نہیں، کیونکہ یہ ایک بار کے استعمال والا نہیں اور اس پر جتنی بار چاہیں تکرار کی جا سکتی ہے۔ یاد رہے کہ انڈیکس سے پڑھا جا سکنا اور عناصر کا نہ بدلا جا سکنا ٹپل جیسی خاصیت ہے، اس لیے صرف اس خاصیت سے اسے ٹپل سے الگ نہیں پہچانا جا سکتا۔
سوال 8 | شارٹ سرکٹ ایویلیویشن
دیکھیے کہ منطقی آپریٹرز or اور and کیا واپس کرتے ہیں۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
print([] or 0 or "z")print(1 and 0 and 2)
True اور False اسی ترتیب سے دکھائی دیتے ہیں
False اور 0 اسی ترتیب سے دکھائی دیتے ہیں
z اور 0 اسی ترتیب سے دکھائی دیتے ہیں
z اور 2 اسی ترتیب سے دکھائی دیتے ہیں
درست جوابC. z اور 0 اسی ترتیب سے دکھائی دیتے ہیں
or بائیں سے جانچتا ہے اور سب سے پہلی سچ (true) قدر جوں کی توں واپس کرتا ہے۔ چونکہ خالی لسٹ اور 0 دونوں جھوٹ (false) ہیں، اس لیے آخری قدر "z" واپس آتی ہے۔ and اس کے برعکس سب سے پہلی جھوٹ قدر واپس کرتا ہے، اس لیے 1 سچ ہے، پھر اگلی قدر 0 پر نتیجہ جھوٹ طے ہو جاتا ہے اور 0 واپس آتا ہے، اور سب سے دائیں والا 2 کبھی جانچا ہی نہیں جاتا (短絡評価)۔ جو واپس آتا ہے وہ بولین نہیں بلکہ وہ قدر ہے جس پر جانچ رکی، اس لیے True یا False کبھی نہیں نکلتا۔ and سب سے دائیں والا 2 صرف تب واپس کرتا ہے جب راستے کی ہر قدر سچ ہو۔
سوال 9 | زنجیری موازنہ
زنجیری موازنے (連鎖比較) کو ٹرنری ایکسپریشن کے ساتھ ملانے والا درج ذیل کوڈ چلایا جائے تو کیا دکھائی دے گا؟
x = 3print(1 < x < 5)print("yes" if x % 2 else "no")
True اور yes اسی ترتیب سے دکھائی دیتے ہیں
True اور no اسی ترتیب سے دکھائی دیتے ہیں
False اور no اسی ترتیب سے دکھائی دیتے ہیں
False اور yes اسی ترتیب سے دکھائی دیتے ہیں
درست جوابA. True اور yes اسی ترتیب سے دکھائی دیتے ہیں
1 < x < 5 کا مطلب وہی ہے جو (1 < x) and (x < 5) کا ہے؛ اگر x کی قدر 3 ہو تو دونوں درست ہیں، اس لیے نتیجہ True ہے۔ ٹرنری ایکسپریشن (三項演算子) کی ترتیب یوں ہے: سچ ہونے پر قدر if شرط else جھوٹ ہونے پر قدر، اور یہاں شرط x % 2 یعنی 1 ہے۔ Python میں صفر کے سوا ہر انٹیجر سچ مانا جاتا ہے، اس لیے yes چنا جاتا ہے۔ زنجیری موازنے کو پیچھے سے جڑنے والا سمجھ کر 1 < (x < 5) کی طرح پڑھنے سے یہ غلط جواب آتا ہے کہ x < 5 کا نتیجہ True یعنی 1 ہے، اور پھر 1 < 1 کا نتیجہ False ہے۔ اسی طرح 1 کو جھوٹ سمجھنے سے no چنا جاتا ہے۔
سوال 10 | pass کا کردار
درج ذیل میں سے کون سا بیان Python کے pass اسٹیٹمنٹ کو درست طور پر بیان کرتا ہے؟
یہ خود لوپ کو توڑ کر اس سے نکلنے کو ظاہر کرتا ہے
یہ ایسی جگہ پر جہاں سنٹیکس کے لحاظ سے بلاک ضروری ہو، کچھ نہ کرنے کو ظاہر کرتا ہے
یہ لوپ کا باقی حصہ چھوڑ کر اگلی تکرار پر جانے کو ظاہر کرتا ہے
یہ ظاہر کرتا ہے کہ فنکشن کا چلنا ختم ہو گیا اور بلانے والے کو قدر واپس کرتا ہے
درست جوابB. یہ ایسی جگہ پر جہاں سنٹیکس کے لحاظ سے بلاک ضروری ہو، کچھ نہ کرنے کو ظاہر کرتا ہے
چونکہ Python بلاک کو انڈینٹیشن سے ظاہر کرتا ہے، اس لیے خالی بلاک نہیں لکھا جا سکتا۔ pass وہ چیز ہے جو اس جگہ کو پُر کرتی ہے، جب آپ کلاس یا فنکشن کا مواد بعد میں لکھنا چاہتے ہوں، یا جب جان بوجھ کر کسی شرط کے پورا ہونے پر کچھ نہ کرنا چاہتے ہوں۔ اس کا عمل کے بہاؤ پر کوئی اثر نہیں ہوتا۔ اگلی تکرار پر جانا continue ہے، لوپ توڑنا break ہے، اور بلانے والے کو قدر واپس کرنا return ہے — ہر ایک کا کردار pass سے مختلف ہے۔
سوال 11 | enumerate
enumerate کو دوسرا آرگیومنٹ دینے والا درج ذیل کوڈ چلایا جائے تو اسکرین پر کیا دکھائی دے گا؟
for i, name in enumerate(["gu", "choki", "pa"], 1):print(i, name)
1 gu / 2 choki / 3 pa کی 3 سطریں دکھائی دیتی ہیں
0 gu / 1 choki / 2 pa کی 3 سطریں دکھائی دیتی ہیں
gu 1 / choki 2 / pa 3 کی 3 سطریں دکھائی دیتی ہیں
صرف 1 gu / 2 choki کی 2 سطریں دکھائی دیتی ہیں
درست جوابA. 1 gu / 2 choki / 3 pa کی 3 سطریں دکھائی دیتی ہیں
enumerate ترتیب سے (نمبر، عنصر) کے ٹپل (タプル) واپس کرتا ہے، اور دوسرے آرگیومنٹ start سے یہ متعین کیا جا سکتا ہے کہ گنتی کس قدر سے شروع ہو۔ یہاں 1 دیا گیا ہے، اس لیے نمبر 1، 2، 3 بنتے ہیں۔ اسے اس ڈیفالٹ سے ملا دینا کہ start چھوڑنے پر گنتی 0 سے شروع ہوتی ہے، 0 سے شروع ہونے والی شکل دیتا ہے۔ چونکہ واپس آنے والے ٹپل میں پہلے نمبر اور پھر عنصر ہوتا ہے، اس لیے print(i, name) کی ترتیب بھی وہی رہتی ہے، اور نام کبھی پہلے نہیں آتا۔ تمام 3 عناصر نکالے جاتے ہیں، اس لیے 2 سطروں کے بعد بھی نہیں رکتا۔
سوال 12 | zip کی لمبائی
مختلف لمبائی کی دو لسٹیں zip کو دی گئیں۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
print(list(zip([1, 2, 3], [10, 20])))
[(1, 10), (2, 20)]
[(1, 10), (2, 20), (3,)]
[(1, 10), (2, 20), (3, 0)]
[(10, 1), (20, 2)]
درست جوابA. [(1, 10), (2, 20)]
zip دیے گئے ہر iterable سے ایک ایک عنصر لے کر جوڑے بناتا ہے، اور سب سے چھوٹا iterable ختم ہوتے ہی رک جاتا ہے۔ یہاں دوسری لسٹ میں 2 عناصر ہیں، اس لیے صرف 2 جوڑے بنتے ہیں، اور بچا ہوا 3 خاموشی سے چھوڑ دیا جاتا ہے۔ نہ کوئی ایرر آتا ہے، نہ کمی کو 0 سے پُر کیا جاتا ہے، اور نہ صرف ایک عنصر والا ٹپل بنتا ہے۔ ہر جوڑے کا مواد اسی ترتیب میں ہوتا ہے جس میں دیا گیا، اس لیے 10 اور 1 کی طرح الٹا نہیں ہوتا۔
سوال 13 | zip سے ان زِپ کرنا
جوڑوں والا ڈیٹا ستارہ لگا کر دوبارہ zip کو دیا گیا۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
[1, 2, 3] دکھائی دیتا ہے، اس کے بعد ['a', 'b', 'c']
(1, 2, 3) دکھائی دیتا ہے، اس کے بعد ('a', 'b', 'c')
((1, 'a'),) دکھائی دیتا ہے، اس کے بعد ((2, 'b'),)
(1, 'a') دکھائی دیتا ہے، اس کے بعد (2, 'b')
درست جوابB. (1, 2, 3) دکھائی دیتا ہے، اس کے بعد ('a', 'b', 'c')
ستارہ لگانے سے لسٹ کے اندر کا ہر جوڑا zip کو الگ آرگیومنٹ کے طور پر جاتا ہے (アンパック)۔ یعنی یہ zip((1, 'a'), (2, 'b'), (3, 'c')) بلانے کے برابر ہے، اور ہر جوڑے کے پہلے عناصر ایک ساتھ اور دوسرے عناصر ایک ساتھ جمع ہو کر دو سلسلوں (1, 2, 3) اور ('a', 'b', 'c') میں بٹ جاتے ہیں۔ جوڑوں والے ڈیٹا کو واپس اس کے اصل دو سلسلوں میں بدلنے کا یہ معیاری طریقہ ہے، اور دو بار zip سے گزارنے پر اصل حالت واپس آ جاتی ہے۔ جو واپس آتا ہے وہ لسٹیں نہیں بلکہ ٹپل ہیں، اس لیے مربع بریکٹس والی شکل نہیں نکلتی۔ ستارہ بھول کر zip(pairs) لکھا جائے تو ہر جوڑا خود ایک آرگیومنٹ کے طور پر جاتا ہے، اور ((1, 'a'),) کی طرح ایک عنصر والے ٹپلز کی قطار والی شکل بنتی ہے۔
سوال 14 | dict اور zip
کلیدوں (keys) کے سلسلے اور قدروں کے سلسلے سے ایک ڈکشنری بنائی گئی۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
zip(keys, vals) ترتیب سے (کلید، قدر) کے ٹپل واپس کرتا ہے، اور dict() جوڑوں کے اس سلسلے سے ڈکشنری (辞書) بناتا ہے۔ ہر جوڑے کا پہلا حصہ کلید اور دوسرا قدر بنتا ہے، اس لیے اعداد کلید بن کر نہیں آتے۔ چونکہ اسے dict() سے گزارا گیا ہے، اس لیے یہ ٹپلز کی لسٹ بھی نہیں رہتا۔ اگرچہ یہ کرلی بریکٹس میں دکھائی دیتا ہے، کسی چیز کو ڈکشنری بنانے والی بات کولن سے جڑے جوڑوں کا ہونا ہے؛ صرف قدروں کی قطار ہو تو وہ سیٹ ہو گا۔
سوال 15 | لسٹ کمپری ہینشن
لسٹ کمپری ہینشن استعمال کرنے والا درج ذیل کوڈ چلایا جائے تو کون سی لسٹ دکھائی دے گی؟
print([n * n for n in range(1, 5)])
[0, 1, 4, 9]
[2, 4, 6, 8]
[1, 4, 9, 16]
[1, 4, 9, 16, 25]
درست جوابC. [1, 4, 9, 16]
range(1, 5)، 1، 2، 3، 4 واپس کرتا ہے؛ متعین کی گئی اختتامی قدر 5 شامل نہیں ہوتی۔ ہر ایک کا مربع لینے سے 1، 4، 9، 16 بنتے ہیں۔ یہ فرض کرنا کہ range، 0 سے شروع ہوتا ہے، 0 سے شروع ہونے والا سلسلہ دیتا ہے، اور یہ غلط فہمی کہ stop شامل ہوتا ہے، 25 تک جانے والا سلسلہ دیتی ہے۔ n * n کو n * 2 پڑھنے کی غلطی ہر بار 2 بڑھنے والا سلسلہ دیتی ہے۔ کمپری ہینشن (内包表記) کو یوں پڑھنے کی عادت ڈالنا مفید ہے کہ ہر عنصر کے لیے سب سے بائیں والا ایکسپریشن جانچا جاتا ہے اور نتائج سے نئی لسٹ بنتی ہے۔
سوال 16 | ڈکشنری کمپری ہینشن
کرلی بریکٹس کے اندر کولن والا کمپری ہینشن چلائیے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
words = ["sun", "moon"]print({w: len(w) for w in words})
{'sun': 3, 'moon': 4}
[('sun', 3), ('moon', 4)]
{3: 'sun', 4: 'moon'}
{'sun', 'moon', 3, 4}
درست جوابA. {'sun': 3, 'moon': 4}
کرلی بریکٹس کے اندر کولن والا کمپری ہینشن ڈکشنری کمپری ہینشن (辞書内包表記) ہے، جس میں کولن کے بائیں والا حصہ کلید اور دائیں والا حصہ قدر بنتا ہے۔ یہاں یہ ایسی ڈکشنری بناتا ہے جس میں ہر لفظ کلید اور اس کے کیریکٹرز کی تعداد قدر ہے۔ کلید اور قدر کو الٹا پڑھنے سے ایسی ڈکشنری بنے گی جس میں کیریکٹرز کی تعداد کلید ہو۔ مربع بریکٹس میں بند کیا جاتا تو ٹپلز کی لسٹ بنتی، لیکن یہاں کرلی بریکٹس ہیں، اس لیے ایسا نہیں ہوتا۔ کولن کے بغیر یہ سیٹ کمپری ہینشن ہوتا اور صرف قدروں کی قطار کے طور پر نکلتا، لیکن چونکہ کولن موجود ہے، اس لیے نتیجہ ڈکشنری ہے۔
سوال 17 | قوسین سے بننے والی قسم
کمپری ہینشن جیسی نظر آنے والی چیز کو قوسین (parentheses) میں بند کیا گیا۔ درج ذیل کوڈ چلانے پر کون سی قسم دکھائی دے گی؟
g = (n for n in range(3))print(type(g))
<class 'range'>
<class 'list'>
<class 'generator'>
<class 'tuple'>
درست جوابC. <class 'generator'>
Python میں ٹپل کمپری ہینشن نام کی کوئی چیز نہیں، اور قوسین میں بند یہ شکل اس کے بجائے جنریٹر ایکسپریشن (ジェネレータ式) بن جاتی ہے۔ اس کی قسم generator ہے؛ یہ تمام قدریں پہلے سے بنانے کے بجائے مانگے جانے پر ایک ایک کر کے حساب کرتا ہے، اس لیے میموری بچاتا ہے، لیکن چونکہ یہ ایک iterator ہے، ایک بار استعمال کے بعد ختم ہو جاتا ہے۔ ٹپل چاہیے ہو تو اسے tuple() میں لپیٹیں۔ مربع بریکٹس سے لکھنے پر یہ لسٹ کمپری ہینشن بن کر list دیتا ہے، اور range(3) براہِ راست اسائن کرنے پر range ملتا ہے۔ اس انداز سے لکھنے پر tuple حاصل نہیں ہوتا۔
سوال 18 | سیٹ کمپری ہینشن
سیٹ کمپری ہینشن سے بننے والے کنٹینر کے عناصر کی تعداد گنیے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
print(len({n % 4 for n in range(10)}))
3 دکھائی دیتا ہے
0 دکھائی دیتا ہے
10 دکھائی دیتا ہے
4 دکھائی دیتا ہے
درست جوابD. 4 دکھائی دیتا ہے
range(10) کی ہر قدر کو 4 سے تقسیم کرنے پر باقی 0، 1، 2، 3، 0، 1، 2، 3، 0، 1 آتے ہیں۔ کرلی بریکٹس والا اور کولن کے بغیر کمپری ہینشن سیٹ کمپری ہینشن (集合内包表記) ہے، اس لیے دہرائی گئی قدریں ایک میں جمع ہو جاتی ہیں، اور 4 مختلف قدریں 0، 1، 2، 3 باقی رہتی ہیں۔ یہ نظر انداز کر کے کہ دہری قدریں ختم ہو جاتی ہیں، صرف قدروں کی تعداد گننے سے 10 آتا ہے۔ یہ نظر انداز کر کے کہ باقیوں میں 0 بھی شامل ہے، صرف 1، 2، 3 گننے سے 3 آتا ہے۔ 0 وہ قدر ہے جو یہ غلط فہمی دیتی ہے کہ کمپری ہینشن کچھ بھی نہیں بناتا، لیکن جب تک یہ range(10) سے گزرتا ہے، مواد کبھی خالی نہیں ہوتا۔ سیٹ کی ڈسپلے ترتیب مقرر نہیں ہوتی، اس لیے عناصر کی تعداد سے جانچنا قابلِ اعتماد طریقہ ہے۔
سوال 19 | اندر اندر (nested) کمپری ہینشن
غور کیجیے کہ کمپری ہینشن میں دو for کلاز ساتھ ساتھ ہوں تو ترتیب کیا ہوتی ہے۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
جب کمپری ہینشن میں دو for کلاز ساتھ ساتھ ہوں تو بائیں طرف لکھا گیا بیرونی لوپ بنتا ہے۔ یہ بالکل وہی ترتیب ہے جو دو عام for اسٹیٹمنٹس کو ایک دوسرے کے اندر لکھنے سے ہوتی ہے: x کی قدر 1 پر قائم رہتی ہے جبکہ y باری باری a اور b بنتا ہے، اور پھر x کی قدر 2 ہو کر یہی عمل دہرایا جاتا ہے۔ دائیں والے for کلاز کو بیرونی سمجھنے سے وہ ترتیب بنتی ہے جس میں x پہلے بدلتا ہے۔ ہر جوڑے کا مواد ایکسپریشن میں لکھی گئی ترتیب (x, y) کے مطابق ہوتا ہے، اس لیے حرف کبھی پہلے نہیں آتا۔
سوال 20 | start آرگیومنٹ
درج ذیل میں سے کون سا بیان بلٹ اِن فنکشن enumerate کے دوسرے آرگیومنٹ start کو درست طور پر بیان کرتا ہے؟
یہ وہ نمبر متعین کرتا ہے جس سے گنتی شروع ہو؛ اسے چھوڑنے پر گنتی 0 سے ہوتی ہے
یہ متعین کرتا ہے کہ کس عنصر سے نکالنا شروع ہو؛ اسے چھوڑنے پر شروع سے نکالا جاتا ہے
یہ متعین کرتا ہے کہ ہر بار کتنے چھوڑے جائیں؛ اسے چھوڑنے پر ایک ایک کر کے آگے بڑھا جاتا ہے
یہ متعین کرتا ہے کہ کتنے تک گنا جائے؛ اسے چھوڑنے پر آخر تک گنا جاتا ہے
درست جوابA. یہ وہ نمبر متعین کرتا ہے جس سے گنتی شروع ہو؛ اسے چھوڑنے پر گنتی 0 سے ہوتی ہے
enumerate کا دوسرا آرگیومنٹ start صرف یہ طے کرتا ہے کہ نمبر کس عدد سے لگنا شروع ہوں۔ ڈیفالٹ 0 ہے، اس لیے 1 دینے سے انسانوں کے لیے آسان مسلسل گنتی ملتی ہے۔ صرف نمبر لگانے کا انداز بدلتا ہے؛ اہم نکتہ یہ ہے کہ نکالے جانے والے عناصر کی حد اور تعداد نہیں بدلتی۔ اس کا نہ گنتی کو محدود کرنے یا چھوڑنے کا کوئی اثر ہے، اور نہ یہ نکالنے کے آغاز کی جگہ کو کھسکاتا ہے۔ یہ سب دوسرے اوزاروں، جیسے سلائسنگ، کی وضاحتیں ہیں۔
سوال 21 | sort کی ریٹرن ویلیو
لسٹ کے sort میتھڈ کی ریٹرن ویلیو ایک متغیر میں رکھی گئی۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
[3, 5, 9] اور [3, 5, 9] اسی ترتیب سے دکھائی دیتے ہیں
None اور [5, 3, 9] اسی ترتیب سے دکھائی دیتے ہیں
[3, 5, 9] اور [5, 3, 9] اسی ترتیب سے دکھائی دیتے ہیں
None اور [3, 5, 9] اسی ترتیب سے دکھائی دیتے ہیں
درست جوابD. None اور [3, 5, 9] اسی ترتیب سے دکھائی دیتے ہیں
sort ایسا میتھڈ ہے جو لسٹ کو اپنی جگہ پر ترتیب دیتا ہے، اور اس کی ریٹرن ویلیو (戻り値) None ہے۔ چنانچہ result میں None ہوتا ہے، اور ترتیب شدہ نتیجہ nums میں باقی رہتا ہے۔ یہ فرض کرنا کہ نئی ترتیب شدہ لسٹ واپس آتی ہے، وہ شکل دیتا ہے جس میں result میں لسٹ ہو۔ یہ نظر انداز کرنا کہ sort اصل لسٹ بدل دیتا ہے، وہ شکل دیتا ہے جس میں nums اپنی اصل ترتیب میں رہے۔ اصل کو برقرار رکھتے ہوئے ترتیب شدہ لسٹ چاہیے ہو تو بلٹ اِن فنکشن sorted استعمال کریں۔
سوال 22 | sorted سے فرق
درج ذیل میں سے کون سا بیان لسٹ کے sort میتھڈ اور بلٹ اِن فنکشن sorted کے فرق کو درست طور پر بیان کرتا ہے؟
sort نئی لسٹ واپس کرتا ہے، اور sorted اپنی جگہ پر ترتیب دے کر None واپس کرتا ہے
sort اپنی جگہ پر ترتیب دے کر None واپس کرتا ہے، اور sorted نئی لسٹ واپس کرتا ہے
دونوں نئی لسٹ واپس کرتے ہیں، اور کسی کی بھی اصل لسٹ نہیں بدلتی
دونوں اپنی جگہ پر ترتیب دیتے ہیں اور ترتیب شدہ لسٹ بھی واپس کرتے ہیں
درست جوابB. sort اپنی جگہ پر ترتیب دے کر None واپس کرتا ہے، اور sorted نئی لسٹ واپس کرتا ہے
sort لسٹ کا میتھڈ ہے، اور یہ خود اسی لسٹ کو ترتیب دیتا ہے اور ریٹرن ویلیو کے طور پر None واپس کرتا ہے۔ sorted بلٹ اِن فنکشن ہے، اور یہ اصل ترتیب کو بالکل بدلے بغیر نئی ترتیب شدہ لسٹ واپس کرتا ہے۔ کس کا انتخاب کیا جائے، یہ اس پر منحصر ہے کہ آپ اصل کو برقرار رکھنا چاہتے ہیں یا نہیں۔ دونوں کے کردار الٹ دینے سے یہ وضاحت بنتی ہے کہ sort نئی لسٹ واپس کرتا ہے۔ اصل کو بدلنے (破壊的) یا نہ بدلنے کے معاملے میں کسی ایک طرف جھک جانے سے یہ وضاحتیں بنتی ہیں کہ دونوں اپنی جگہ پر ترتیب دیتے ہیں، یا کوئی بھی اصل کو نہیں بدلتا۔ یاد رہے کہ sorted لسٹ کے علاوہ کوئی بھی iterable لے سکتا ہے، اور اس کا نتیجہ ہمیشہ لسٹ ہوتا ہے۔
سوال 23 | append سے فرق
ایک لسٹ کو دوسری میں شامل کرنے کے دو طریقوں کا موازنہ کیجیے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
a = [1, 2]a.append([3, 4])b = [1, 2]b.extend([3, 4])print(a, b)
[1, 2, [3, 4]] [1, 2, [3, 4]]
[1, 2, 3, 4] [1, 2, [3, 4]]
[1, 2, 3, 4] [1, 2, 3, 4]
[1, 2, [3, 4]] [1, 2, 3, 4]
درست جوابD. [1, 2, [3, 4]] [1, 2, 3, 4]
append اپنے آرگیومنٹ کو ایک مکمل عنصر کے طور پر آخر میں شامل کرتا ہے، اس لیے لسٹ دینے پر وہ اندر اندر (nested) ہو جاتی ہے اور لمبائی 1 بڑھتی ہے۔ extend اپنے آرگیومنٹ پر تکرار سے ملنے والی قدریں ایک ایک کر کے شامل کرتا ہے، اس لیے مواد کھل جاتا ہے اور لمبائی 2 بڑھتی ہے۔ دونوں کے کردار الٹ دینے سے a اور b کے نتائج الٹ جاتے ہیں۔ یہ فرض کرنا کہ دونوں ایک ہی کام کرتے ہیں، یا وہ شکل دیتا ہے جس میں دونوں nested ہوں یا وہ جس میں دونوں ہموار ہو جائیں۔ دونوں میتھڈز کی ریٹرن ویلیو بھی None ہے، اس لیے یاد رکھنا مفید ہے کہ نتیجہ کسی متغیر میں نہ رکھا جائے۔
سوال 24 | سطحی کاپی
nested لسٹ کو سلائس سے نقل کیا گیا اور اندرونی حصہ دوبارہ لکھا گیا۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
سلائسنگ سے نقل کرنا سطحی کاپی (浅いコピー) ہے: بیرونی لسٹ نئی بنتی ہے، لیکن اس کے اندر کے عناصر اصل کے ساتھ انہی آبجیکٹس کے طور پر مشترک رہتے ہیں۔ copy1[0] اور orig[0] ایک ہی لسٹ کی طرف اشارہ کرتے ہیں، اس لیے اس میں append کرنا اصل کی طرف بھی ظاہر ہوتا ہے۔ یہ فرض کرنا کہ یہ مکمل طور پر الگ ہے، وہ شکل دیتا ہے جس میں اصل نہیں بدلتی۔ صرف پہلی اندرونی لسٹ دوبارہ لکھی گئی، اس لیے اثر بعد والے عنصر تک نہیں پہنچتا، اور بیرونی لسٹ میں کچھ شامل نہیں ہوا، اس لیے 9 بیرونی لسٹ کی قطار میں بھی نہیں آتا۔ اندرونی حصوں کو بھی الگ کرنا ہو تو copy.deepcopy استعمال کریں۔
سوال 25 | گہری کاپی
ایک ہی کوڈ میں گہری کاپی اور سطحی کاپی کا موازنہ کیجیے۔ چلنے کے بعد base کیا بن جاتا ہے؟
copy.deepcopy اندر کے nested مواد تک سب کچھ نقل کرتا ہے (深いコピー)، اس لیے d[0]، base[0] سے الگ لسٹ بن جاتی ہے، اور اس میں append کرنا base تک نہیں پہنچتا۔ دوسری طرف s سطحی کاپی ہے، اس لیے s[1] اور base[1] ایک ہی لسٹ ہیں، اور اس میں append کرنا base میں بھی ظاہر ہوتا ہے۔ چنانچہ صرف بعد والا عنصر بڑھتا ہے۔ یہ فرض کرنا کہ دونوں base تک پہنچتے ہیں، وہ شکل دیتا ہے جس میں دونوں اندرونی لسٹیں بڑھیں، اور یہ فرض کرنا کہ کوئی بھی نہیں پہنچتا، بغیر تبدیلی والی شکل دیتا ہے۔ گہری کاپی اور سطحی کاپی کو آپس میں ملا دینا وہ شکل دیتا ہے جس میں صرف پہلا عنصر بڑھے۔
سوال 26 | ضرب کا ایک دھوکا
لسٹ کی ضرب سے دو جہتی جدول بنانے کی کوشش کی گئی۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
grid = [[0] * 3] * 2grid[0][1] = 5print(grid)
[[0, 0, 0], [0, 5, 0]]
[[5, 0, 0], [5, 0, 0]]
[[0, 5, 0], [0, 0, 0]]
[[0, 5, 0], [0, 5, 0]]
درست جوابD. [[0, 5, 0], [0, 5, 0]]
باہر ضرب دینے سے نئی قطاریں نہیں بنتیں؛ یہ صرف ایک ہی لسٹ کے دو حوالے (参照) قطار میں رکھ دیتا ہے۔ grid[0] اور grid[1] ایک ہی آبجیکٹ ہیں، اس لیے ایک میں انڈیکس 1 والا مقام دوبارہ لکھنے سے دوسری میں بھی وہی مقام بدلا ہوا نظر آتا ہے۔ اگر آپ سمجھیں کہ قطاریں آزاد ہیں تو وہ شکل بنتی ہے جس میں صرف ایک قطار بدلتی ہے۔ چونکہ دوبارہ لکھا گیا مقام انڈیکس 1 ہے، اس لیے وہ شکل بھی نہیں بنتی جس میں پہلا مقام 5 ہو۔ ہر قطار کو آزاد بنانا ہو تو [[0] * 3 for _ in range(2)] لکھیں۔
سوال 27 | ایک عنصر والا ٹپل
صرف قوسین میں بند قدر اور آخر میں کوما والی قدر کی اقسام کا موازنہ کیجیے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
x = (7)y = (7,)print(type(x).__name__, type(y).__name__)
int اور int اسی ترتیب سے دکھائی دیتے ہیں
tuple اور tuple اسی ترتیب سے دکھائی دیتے ہیں
tuple اور int اسی ترتیب سے دکھائی دیتے ہیں
int اور tuple اسی ترتیب سے دکھائی دیتے ہیں
درست جوابD. int اور tuple اسی ترتیب سے دکھائی دیتے ہیں
ٹپل کو طے کرنے والی چیز قوسین نہیں بلکہ کوما ہے۔ (7) محض حساب کی ترجیح دکھانے کے لیے قوسین میں بند ایک انٹیجر ہے، اس لیے اس کی قسم int ہے، اور صرف آخر میں کوما والا (7,) ایک عنصر والا ٹپل (タプル) بنتا ہے۔ یہ فرض کرنا کہ قوسین میں بند کرنے سے ٹپل بن جاتا ہے، وہ شکل دیتا ہے جس میں دونوں tuple ہوں؛ دونوں کو آپس میں ملا دینا الٹی ترتیب والی شکل یا وہ شکل دیتا ہے جس میں دونوں int ہوں۔ یاد رہے کہ خالی ٹپل ایک استثنا ہے اور بغیر کوما کے () لکھا جاتا ہے۔
سوال 28 | ٹپل کا مواد
ٹپل کے اندر رکھی گئی لسٹ میں عنصر شامل کرنے کی کوشش کی گئی۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
t = (1, [2, 3], 4)t[1].append(5)print(t)
TypeError آتا ہے
(1, [2, 3], 4, 5)
(1, [2, 3, 5], 4)
(1, [2, 3], 4)
درست جوابC. (1, [2, 3, 5], 4)
ٹپل جس چیز کو منجمد کرتا ہے وہ یہ ہے کہ ہر خانہ کس آبجیکٹ کی طرف اشارہ کرتا ہے، نہ کہ اشارہ کیے گئے آبجیکٹ کا مواد۔ t[1] ایک لسٹ ہے، اور وہ لسٹ خود قابلِ تبدیل (mutable) ہے، اس لیے اس میں append کیا جا سکتا ہے۔ t[1] = [] جیسا کچھ لکھنا، جو ٹپل کے خانے میں ہی اسائن کرتا ہے، TypeError دیتا، لیکن یہاں کوئی خانہ بدلا نہیں جا رہا۔ چونکہ جس چیز میں اضافہ ہوا وہ لسٹ کے اندر ہے، اس لیے ٹپل کی لمبائی نہ بڑھتی ہے اور نہ یہ مکمل طور پر بغیر تبدیلی کے رہتا ہے۔
سوال 29 | سلائس اسائنمنٹ
لسٹ کے ایک سلائس میں مختلف لمبائی کی لسٹ اسائن کی گئی۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
x = [1, 2, 3, 4, 5]x[1:3] = [9]print(x)
[1, 9, 4, 5]
[1, 9, 3, 4, 5]
[1, 9, 9, 4, 5]
[1, 2, 9, 4, 5]
درست جوابA. [1, 9, 4, 5]
سلائس میں اسائن کرنا ایسا عمل ہے جو متعین کی گئی پوری حد کو دائیں جانب کے مواد سے بدل دیتا ہے (スライス代入)۔ x[1:3]، 2 اور 3 کے 2 عناصر کی طرف اشارہ کرتا ہے، اس لیے وہ ایک عنصر 9 سے بدل جاتے ہیں، اور کل لمبائی 5 سے گھٹ کر 4 ہو جاتی ہے۔ اگر آپ سمجھیں کہ صرف ایک عنصر بدلتا ہے تو وہ شکل بنتی ہے جس میں لمبائی 5 ہی رہے، اور اگر سمجھیں کہ دائیں جانب کو چوڑائی کے مطابق کھینچا جاتا ہے تو وہ شکل بنتی ہے جس میں دو 9 قطار میں ہوں۔ حد کے آغاز کو ایک خانہ کھسکا کر پڑھنے سے وہ شکل بنتی ہے جس میں 2 باقی رہے۔ بائیں جانب کی چوڑائی اور دائیں جانب کی لمبائی کا مختلف ہو سکنا ہی سلائس اسائنمنٹ کی خصوصیت ہے۔
سوال 30 | داخل کرنا اور حذف کرنا
صفر چوڑائی والی سلائس اسائنمنٹ اور ایک del یکے بعد دیگرے کیے جاتے ہیں۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
y = [1, 2, 3]y[1:1] = [7, 8]del y[0]print(y)
[7, 8, 3]
[1, 7, 8, 3]
[7, 8, 2, 3]
[2, 3, 7, 8]
درست جوابC. [7, 8, 2, 3]
y[1:1] صفر چوڑائی کی حد ہے، اس لیے اس میں اسائنمنٹ بغیر کچھ ہٹائے داخل کرنا بن جاتی ہے، اور لسٹ [1, 7, 8, 2, 3] بن جاتی ہے۔ اس کے بعد del y[0] شروع والا 1 ہٹا دیتا ہے، اور [7, 8, 2, 3] باقی رہتی ہے۔ اگر آپ یہ سمجھیں کہ داخل کرتے وقت اصل عناصر میں سے بھی ایک غائب ہو جاتا ہے تو 7 8 3 والی شکل بنتی ہے، اور اگر سمجھیں کہ del کوئی اور مقام ہٹاتا ہے تو وہ شکل بنتی ہے جس میں شروع والا 1 باقی رہے۔ قدروں کو آخر میں شامل ہونے والا سمجھنے سے وہ شکل بنتی ہے جس میں 2 اور 3 پہلے آئیں۔ یہ بھی یاد رکھنا مفید ہے کہ del ایک اسٹیٹمنٹ ہے، اس لیے اس کی کوئی ریٹرن ویلیو نہیں، اور یہ قدر نکالے بغیر ہی ہٹا دیتا ہے۔
سوال 31 | get کی ڈیفالٹ قدر
ڈکشنری میں موجود نہ ہونے والی کلید get سے تلاش کی گئی۔ درج ذیل کوڈ چلانے پر کیا دکھائی دے گا؟
d = {"a": 1, "b": 2}print(d.get("z"), d.get("z", 0))
None اور 0 اسی ترتیب سے دکھائی دیتے ہیں
پہلے والے پر KeyError آتا ہے
None اور None اسی ترتیب سے دکھائی دیتے ہیں
0 اور 0 اسی ترتیب سے دکھائی دیتے ہیں
درست جوابA. None اور 0 اسی ترتیب سے دکھائی دیتے ہیں
get کلید موجود نہ ہونے پر ایکسیپشن نہیں اٹھاتا؛ دوسرا آرگیومنٹ چھوڑا جائے تو None اور دیا جائے تو وہی قدر واپس کرتا ہے۔ چنانچہ پہلا None ہے اور دوسرا 0۔ اگر آپ سمجھیں کہ دوسرے آرگیومنٹ کے بغیر بھی 0 واپس آتا ہے تو دونوں 0 بنتے ہیں، اور اگر سمجھیں کہ دوسرا آرگیومنٹ نظر انداز ہوتا ہے تو دونوں None بنتے ہیں۔ مربع بریکٹس سے d["z"] لکھا جاتا تو KeyError آتا، اور get اسی سے بچنے کا اوزار ہے۔
سوال 32 | setdefault
setdefault کو پہلے سے موجود کلید اور غیر موجود کلید، دونوں کے لیے بلایا گیا۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
d = {"a": 1}print(d.setdefault("a", 99))print(d.setdefault("b", 99))print(d)
99 اور 99 دکھائی دیتے ہیں، اس کے بعد {'a': 99, 'b': 99}
1 اور 99 دکھائی دیتے ہیں، اس کے بعد {'a': 1, 'b': 99}
1 اور None دکھائی دیتے ہیں، اس کے بعد {'a': 1, 'b': None}
1 اور 99 دکھائی دیتے ہیں، اس کے بعد {'a': 1}
درست جوابB. 1 اور 99 دکھائی دیتے ہیں، اس کے بعد {'a': 1, 'b': 99}
کلید موجود ہو تو setdefault ڈکشنری کو بدلے بغیر صرف موجودہ قدر واپس کرتا ہے۔ کلید موجود نہ ہو تو یہ دوسرے آرگیومنٹ کو قدر کے طور پر داخل کرتا ہے اور وہی قدر واپس کرتا ہے۔ چنانچہ پہلی کال موجودہ 1 واپس کرتی ہے اور ڈکشنری جوں کی توں رہتی ہے، اور دوسری کال 99 داخل کر کے 99 واپس کرتی ہے۔ اگر آپ سمجھیں کہ موجودہ قدر بھی اوور رائٹ ہو جاتی ہے تو دونوں 99 بنتے ہیں، اور اگر سمجھیں کہ کچھ داخل نہیں ہوتا تو وہ شکل بنتی ہے جس میں ڈکشنری نہیں بڑھتی۔ دوسرا آرگیومنٹ چھوڑنے پر داخل ہونے والی قدر None ہوتی ہے، اس لیے None داخل ہونے والی شکل دوسرا آرگیومنٹ نہ لکھنے کا نتیجہ ہے۔
سوال 33 | in کیا دیکھتا ہے
دیکھیے کہ ڈکشنری کے لیے in آپریٹر کیا جانچتا ہے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
d = {"x": 1, "y": 2}print("x" in d, 1 in d, 1 in d.values())
True False True اسی ترتیب سے دکھائی دیتا ہے
True True True اسی ترتیب سے دکھائی دیتا ہے
True False False اسی ترتیب سے دکھائی دیتا ہے
False True True اسی ترتیب سے دکھائی دیتا ہے
درست جوابA. True False True اسی ترتیب سے دکھائی دیتا ہے
ڈکشنری پر in صرف کلیدیں جانچتا ہے۔ "x" ایک کلید ہے، اس لیے True ہے؛ 1 قدر کے طور پر موجود ہے لیکن کلید نہیں، اس لیے False ہے۔ قدریں جانچنی ہوں تو اس کے بجائے d.values() کو ہدف بنائیں، جو یہاں True دیتا ہے۔ اگر آپ سمجھیں کہ in قدریں بھی دیکھتا ہے تو سب True بنتے ہیں، اور اگر سمجھیں کہ values() بھی قدریں نہیں دیکھتا تو آخری False بنتا ہے۔ کلید اور قدر کے کردار الٹ دینے سے وہ شکل بنتی ہے جس میں پہلا False ہو۔ مربع بریکٹس سے تلاش کرنے سے پہلے کلید کی موجودگی جانچنا اس کا معیاری استعمال ہے۔
سوال 34 | دہری کلیدیں
ڈکشنری لٹرل میں ایک ہی کلید دو بار لکھی گئی۔ درج ذیل کوڈ چلانے کا نتیجہ کیا ہے؟
d = {"a": 1, "b": 2, "a": 3}print(d)
{'a': 3, 'b': 2}
{'a': 1, 'b': 2}
{'b': 2, 'a': 3}
{'a': 3, 'b': 3}
درست جوابA. {'a': 3, 'b': 2}
ڈکشنری لٹرل اپنے اندراجات بائیں سے دائیں ترتیب سے بناتا ہے، اس لیے اگر ایک ہی کلید دو بار آئے تو بعد والی قدر پہلے والی کو اوور رائٹ کر دیتی ہے۔ نہ کوئی ایرر آتا ہے نہ وارننگ۔ اگر آپ سمجھیں کہ پہلے لکھی گئی باقی رہتی ہے تو a کی قدر 1 بنتی ہے۔ نیز ڈکشنری داخل کرنے کی ترتیب برقرار رکھتی ہے، اور اوور رائٹ سے مقام نہیں بدلتا، اس لیے a اسی مقام پر رہتا ہے جہاں وہ پہلی بار آیا۔ چنانچہ نہ کلیدوں کی ترتیب الٹتی ہے، اور نہ ضمنی اثر کے طور پر b کی قدر بدلتی ہے۔
سوال 35 | ڈکشنری بنانے کے طریقے
کی ورڈ آرگیومنٹس سے بنی ڈکشنری کا جوڑوں کے سلسلے سے بنی ڈکشنری سے موازنہ کیجیے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
True دکھائی دیتا ہے، اس کے بعد [('x', 1), ('y', 2)]
درست جوابC. True دکھائی دیتا ہے، اس کے بعد {'x': 1, 'y': 2}
dict کی ورڈ آرگیومنٹس (キーワード引数) سے بھی اور (کلید، قدر) جوڑوں کے سلسلے سے بھی ڈکشنری بنا سکتا ہے۔ دونوں طریقوں سے ایک ہی مواد والی ڈکشنری بنتی ہے، اس لیے موازنہ True ہے۔ اگر آپ سمجھیں کہ بنانے کا طریقہ مختلف ہو تو نتیجہ بھی مختلف ہو گا، تو موازنہ False بنتا ہے۔ کی ورڈ آرگیومنٹ کا نام جوں کا توں کلید کی اسٹرنگ بنتا ہے، اس لیے کلید اور قدر کبھی الٹتے نہیں۔ dict سے گزرنے کے بعد یہ پہلے ہی ڈکشنری بن چکی ہوتی ہے، اس لیے جوڑوں کا سلسلہ بھی نہیں رہتی۔
سوال 36 | خالی کرلی بریکٹس
خالی کرلی بریکٹس کی قسم کا set() کی قسم سے موازنہ کیجیے۔ درج ذیل کوڈ چلانے پر کون سے دو قسم کے نام دکھائی دیں گے؟
a = {}b = set()print(type(a).__name__, type(b).__name__)
dict اور dict اسی ترتیب سے دکھائی دیتے ہیں
set اور set اسی ترتیب سے دکھائی دیتے ہیں
dict اور set اسی ترتیب سے دکھائی دیتے ہیں
set اور dict اسی ترتیب سے دکھائی دیتے ہیں
درست جوابC. dict اور set اسی ترتیب سے دکھائی دیتے ہیں
عناصر والا {1, 2} سیٹ (集合) بنتا ہے، لیکن خالی ہونے پر یہ طے نہیں ہو سکتا کہ یہ ڈکشنری ہے یا سیٹ۔ Python اس صورت کو ڈکشنری مانتا ہے، اس لیے {} خالی ڈکشنری ہے۔ خالی سیٹ چاہیے ہو تو set() لکھنے کے سوا کوئی چارہ نہیں۔ اگر آپ سمجھیں کہ کرلی بریکٹس کا مطلب ہمیشہ سیٹ ہے تو دونوں set بنتے ہیں، اور دونوں کو آپس میں ملا دینے سے ترتیب الٹ جاتی ہے۔ یہ سمجھنا کہ set() بھی ڈکشنری بنتا ہے، دونوں کو dict بنا دیتا ہے۔ چونکہ سیٹ اور ڈکشنری دونوں کرلی بریکٹس استعمال کرتے ہیں، اس لیے یہ فرق آسانی سے الجھ جاتا ہے۔
سوال 37 | سیٹ آپریشنز
دو سیٹس پر انٹرسیکشن اور سیمیٹرک ڈیفرنس کیے گئے۔ درج ذیل کوڈ کا آؤٹ پٹ کیا ہے؟
[3, 4] اور [1, 2, 3, 4, 5] اسی ترتیب سے دکھائی دیتے ہیں
[1, 2, 5] اور [3, 4] اسی ترتیب سے دکھائی دیتے ہیں
[3, 4] اور [1, 2] اسی ترتیب سے دکھائی دیتے ہیں
[3, 4] اور [1, 2, 5] اسی ترتیب سے دکھائی دیتے ہیں
درست جوابD. [3, 4] اور [1, 2, 5] اسی ترتیب سے دکھائی دیتے ہیں
ایمپرسینڈ (&) انٹرسیکشن (積集合) ہے، اس لیے دونوں میں موجود 3 اور 4 باقی رہتے ہیں۔ کیریٹ (^) سیمیٹرک ڈیفرنس (対称差) ہے، اور یہ وہ عناصر جمع کرتا ہے جو صرف ایک یا دوسرے میں ہوں، اس لیے صرف s1 میں موجود 1 اور 2، اور صرف s2 میں موجود 5 باقی رہتے ہیں، جبکہ مشترک 3 اور 4 نکل جاتے ہیں۔ سیمیٹرک ڈیفرنس کو ڈیفرنس (差集合) سے ملا دینے سے وہ شکل بنتی ہے جس میں 5 نکل جائے، اور دونوں عملیات الٹ دینے سے آؤٹ پٹ کی ترتیب الٹ جاتی ہے۔ سیمیٹرک ڈیفرنس کو یونین (和集合) سے ملا دینے سے وہ شکل بنتی ہے جس میں 3 اور 4 بھی شامل ہوں۔ سیٹ کی ڈسپلے ترتیب مقرر نہیں ہوتی، اس لیے یہاں نتائج کو sorted سے ترتیب دے کر جانچا گیا ہے۔
سوال 38 | دہرائی گئی قدریں ہٹانا
دہری قدروں والی لسٹ کو سیٹ سے گزارا گیا۔ درج ذیل کوڈ چلانے پر آؤٹ پٹ کیا ہو گا؟
data = [3, 1, 3, 2, 1, 1]print(len(set(data)), sorted(set(data)))
6 اور [3, 1, 3, 2, 1, 1] اسی ترتیب سے دکھائی دیتے ہیں
6 اور [1, 2, 3] اسی ترتیب سے دکھائی دیتے ہیں
3 اور [3, 1, 2] اسی ترتیب سے دکھائی دیتے ہیں
3 اور [1, 2, 3] اسی ترتیب سے دکھائی دیتے ہیں
درست جوابD. 3 اور [1, 2, 3] اسی ترتیب سے دکھائی دیتے ہیں
لسٹ کو set سے گزارنے پر دہری قدریں ہٹ جاتی ہیں، اور 3 مختلف قدریں 1، 2، 3 باقی رہتی ہیں، اس لیے لمبائی 3 ہے۔ سیٹ کو sorted کو دینے سے صعودی ترتیب میں ترتیب دی گئی نئی لسٹ واپس آتی ہے۔ اگر آپ سمجھیں کہ دہری قدریں باقی رہتی ہیں تو تعداد 6 آتی ہے۔ sorted قدروں کو سائز کے لحاظ سے ترتیب دیتا ہے، اصل ظہور کی ترتیب سے نہیں، اس لیے پہلی بار نظر آنے کی ترتیب میں بھی نہیں آتا۔ سیٹ کی اپنی ڈسپلے ترتیب کا کوئی مطلب نہیں، اس لیے ترتیب چاہیے ہو تو اسے sorted سے گزاریں۔
سوال 39 | عناصر کی ایک شرط
ایک سیٹ میں پہلے ٹپل اور پھر لسٹ شامل کرنے کی کوشش کی گئی۔ درج ذیل کوڈ چلانے پر کیا ہو گا؟
s = set()s.add((1, 2))s.add([3, 4])print(len(s))
1 دکھائی دیتا ہے، اور لسٹ ٹپل میں بدل جاتی ہے
TypeError آتا ہے، کیونکہ لسٹ کو سیٹ میں نہیں رکھا جا سکتا
ValueError آتا ہے، کیونکہ عناصر کی اقسام ملائی نہیں جا سکتیں
2 دکھائی دیتا ہے، اور دونوں عناصر سیٹ میں چلے جاتے ہیں
درست جوابB. TypeError آتا ہے، کیونکہ لسٹ کو سیٹ میں نہیں رکھا جا سکتا
سیٹ کے عناصر، اور ڈکشنری کی کلیدیں، ہیش ایبل (hashable، ハッシュ可能) ہونی چاہییں۔ ٹپل کا مواد بدلا نہیں جا سکتا، اس لیے وہ ہیش ایبل ہے اور شامل کیا جا سکتا ہے، لیکن لسٹ کا مواد بعد میں بدل سکتا ہے، اس لیے وہ ہیش ایبل نہیں، اور unhashable type کے پیغام کے ساتھ TypeError آتا ہے۔ یہ فرض کرنا کہ دونوں شامل ہو جاتے ہیں، آؤٹ پٹ 2 دیتا ہے، اور یہ فرض کرنا کہ لسٹ خاموشی سے ٹپل میں بدل جاتی ہے، آؤٹ پٹ 1 دیتا ہے۔ اقسام کو ملانا بذاتِ خود کوئی مسئلہ نہیں، اس لیے یہ دلیل بھی غلط ہے کہ ValueError آئے گا۔
سوال 40 | نکالنے کے تین طریقے
ڈکشنری کے میتھڈز keys، values اور items میں سے ہر ایک جو واپس کرتا ہے، اس کا مناسب جوڑا کون سا ہے؟
keys قدروں کے جوڑے، values کلیدوں کے جوڑے، اور items اندراجات کی تعداد واپس کرتا ہے
keys کلیدوں اور قدروں کے جوڑے، values کلیدیں، اور items قدریں واپس کرتا ہے
keys قدریں، values کلیدیں، اور items قدروں کے جوڑے واپس کرتا ہے
keys کلیدیں، values قدریں، اور items کلیدوں اور قدروں کے جوڑے واپس کرتا ہے
درست جوابD. keys کلیدیں، values قدریں، اور items کلیدوں اور قدروں کے جوڑے واپس کرتا ہے
keys صرف کلیدیں، values صرف قدریں، اور items ترتیب سے (کلید، قدر) کے ٹپل واپس کرتا ہے۔ ڈکشنری پر تکرار کرتے وقت معیاری انداز for k, v in d.items() کی طرح دو متغیرات میں وصول کرنا ہے۔ تینوں کے کردار الٹ پلٹ دینے سے ایسی وضاحتیں بنتی ہیں جیسے keys کا قدریں واپس کرنا۔ items جو واپس کرتا ہے وہ اندراجات کا سلسلہ ہے، تعداد نہیں، اس لیے یہ وضاحت بھی غلط ہے کہ وہ اندراجات کی تعداد واپس کرتا ہے؛ تعداد جاننی ہو تو len استعمال کریں۔ یاد رہے کہ ڈکشنری کو براہِ راست for کو دینے سے کلیدیں نکلتی ہیں۔
مشق: اس صفحے کے سوالات حل کریں
یہ بے ترتیب سوالات والا مشق کا ٹول ہے (JavaScript فعال ہونے پر کام کرتا ہے)۔ اوپر دیے گئے تمام سوالات اور وضاحتیں اس کے بغیر بھی پڑھی جا سکتی ہیں۔
※ وضاحتیں مطالعے کے مقصد کے لیے معلومات ہیں۔ امتحان کا نصاب اور نظام سال بہ سال بدل سکتا ہے، اس لیے امتحان منعقد کرنے والے ادارے کے سرکاری اعلانات ضرور دیکھیں۔
یہ صفحہ جاپانی اصل متن کا ترجمہ ہے۔ اگر ترجمے اور اصل متن میں فرق ہو تو جاپانی ورژن کو ترجیح دی جائے گی۔ یہ ترجمہ AI کی مدد سے کیا گیا ہے اور اس میں غلطیاں ہو سکتی ہیں۔ترجمے کی غلطی کی اطلاع دیںجاپانی اصل متن دیکھیں