ماڈیول اسباق (2/4)
پہلے سے طے شدہ اور مطلوبہ الفاظ کے پیرامیٹرز
فنکشن پیرامیٹرز میں ڈیفالٹ اقدار ہوسکتی ہیں: اگر کالر پاس نہیں ہوتا ہے۔ انہیں، پہلے سے طے شدہ استعمال کیا جاتا ہے. آپ فنکشن پاس کرنے والے پیرامیٹرز کو بھی کال کر سکتے ہیں۔ نام سے (کلیدی الفاظ کے دلائل)۔
پہلے سے طے شدہ پیرامیٹرز
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'ڈیفالٹس والے پیرامیٹرز کو بعد آنا چاہیے جن کے بغیر:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorمطلوبہ الفاظ کے دلائل
آپ کسی بھی ترتیب سے، کال کو مزید بنا کر نام کے ذریعے دلائل دے سکتے ہیں۔ پڑھنے کے قابل:
def crea_utente(nome, eta, attivo=True):
return {"nome": nome, "eta": eta, "attivo": attivo}
crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada") # any order when all are keywordسنہری اصول: کال میں، پوزیشنل آرگیومنٹس کلیدی الفاظ کے دلائل سے پہلے آتے ہیں۔
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ بدلنے والا ڈیفالٹ نقصان
کبھی نہیں ایک تبدیل شدہ آبجیکٹ (فہرست، dict، سیٹ) کو بطور ڈیفالٹ ویلیو استعمال کریں: ڈیفالٹ کا ایک بار جائزہ لیا جاتا ہے، جب فنکشن کی تعریف کی جاتی ہے، اور اس کا اشتراک کیا جاتا ہے۔ تمام کالز
def aggiungi(elemento, lista=[]): # BUG!
lista.append(elemento)
return lista
aggiungi(1) # [1]
aggiungi(2) # [1, 2] !!! not [2] as you'd expect
aggiungi(3) # [1, 2, 3]درست نمونہ: None کو بطور سنٹینل استعمال کریں اور اسے اندر بنائیں:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaمتغیر ڈیفالٹ دلائل کا خطرہ
متغیر اشیاء (جیسے فہرستیں یا لغات) کو کبھی بھی پیرامیٹرز کے لیے ڈیفالٹ اقدار کے طور پر استعمال نہ کریں: مثال کے طور پر def add(x, my_list=[])۔ پہلے سے طے شدہ قدر کا اندازہ صرف ایک بار اس وقت ہوتا ہے جب فنکشن کی وضاحت کی جاتی ہے، یعنی بعد میں آنے والی کالیں بالکل اسی تغیر پذیر آبجیکٹ کا اشتراک کریں گی! None استعمال کرنا بہترین عمل ہے:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listاسے آزمائیں
'طاقت(بیس، ایکسپوننٹ=2)' کی وضاحت کریں جو بیس ** ایکسپوننٹ کو لوٹاتا ہے۔ `square = power(5)` اور `cube = power(5, exponent=3)` کی گنتی کریں۔ اندازہ کریں `(مربع، مکعب)`۔
اشارہ دکھائیں۔
واپسی کی بنیاد ** ایکسپوننٹ
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
`create_record(name, values=None)` کی وضاحت کریں کہ، جب قدریں کوئی نہیں ہیں، ایک تازہ خالی فہرست استعمال کرتی ہے۔ قدروں میں 1 کو شامل کریں اور ریکارڈ ڈکٹ {'name': name, 'values': values} واپس کریں۔ اقدار کو پاس کیے بغیر اسے دو بار کال کریں اور `a` اور `b` کو تفویض کریں۔ `(a['values'], b['values'])` کا اندازہ کریں۔
اشارہ دکھائیں۔
None کو بطور ڈیفالٹ استعمال کریں اور فنکشن کے اندر فہرست بنائیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
اضافی چیلنج
ایک فنکشن کی وضاحت کریں \`greet(name, message="Hello")\` جو فارمیٹ شدہ اسٹرنگ کو واپس کرتا ہے \`"{message}, {name}!"\`۔ آخری اظہار کے طور پر \`greet("Bob")\` کو کال کرکے فنکشن کی جانچ کریں۔
اشارہ دکھائیں۔
ایک ڈیفالٹ پیرامیٹر میسج="Hello" اور واپس آنے والے سلام کے لیے ایک f-string استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔