dict.get()
পদ্ধতিটি কী ?
ইতিমধ্যে উল্লিখিত হিসাবে get
পদ্ধতিটিতে একটি অতিরিক্ত পরামিতি রয়েছে যা অনুপস্থিত মানকে নির্দেশ করে। ডকুমেন্টেশন থেকে
get(key[, default])
অভিধানে যদি কী থাকে তবে কীটির মানটি ফিরিয়ে দিন else যদি ডিফল্টটি দেওয়া না হয় তবে এটি ডিফল্ট নয় কারও সাথে, যাতে এই পদ্ধতিটি কখনই উত্থাপন করে না KeyError
।
একটি উদাহরণ হতে পারে
>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1
কোথাও গতির উন্নতি আছে?
এখানে উল্লিখিত হিসাবে ,
দেখে মনে হচ্ছে যে তিনটি পদ্ধতিরই এখন একই ধরণের পারফরম্যান্স প্রদর্শিত হবে (একে অপরের প্রায় 10% এর মধ্যে), শব্দের তালিকার বৈশিষ্ট্য থেকে কম-বেশি স্বতন্ত্র।
আগে get
যথেষ্ট ধীর ছিল, তবে বর্তমানে গতিটি ডিফল্ট মান ফেরত দেওয়ার অতিরিক্ত সুবিধার সাথে প্রায় তুলনীয়। তবে আমাদের সমস্ত প্রশ্নগুলি সাফ করার জন্য, আমরা মোটামুটি বড় তালিকায় পরীক্ষা করতে পারি (নোট করুন যে পরীক্ষায় কেবলমাত্র সমস্ত বৈধ কীগুলি সন্ধান করা রয়েছে)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
এখন এই দুটি ফাংশন সময় ব্যবহার করে timeit
>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979
আমরা দেখতে পাচ্ছি যে কোনও কার্যকারিতা নেই বলে অনুসন্ধানের চেয়ে দ্রুত গতি রয়েছে। এর মাধ্যমে দেখা যায়dis
>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE
কোথায় এটি দরকারী হবে?
আপনি যখনই কোনও অভিধান সন্ধান করছেন তখনই আপনি যখনই কোনও ডিফল্ট মান সরবরাহ করতে চান এটি কার্যকর হবে। এটি হ্রাস করে
if key in dic:
val = dic[key]
else:
val = def_val
একক লাইনে, val = dic.get(key,def_val)
কোথায় এটি কার্যকর হবে না?
যখনই আপনি এমন একটি KeyError
কীটি উপলভ্য নয় তা জানিয়ে একটি ফেরত চান একটি ডিফল্ট মান ফিরিয়ে দেওয়াও এই ঝুঁকি বহন করে যে একটি নির্দিষ্ট ডিফল্ট মানটিও একটি মূল কী হতে পারে!
এর get
মতো বৈশিষ্ট্য পাওয়া কি সম্ভব dict['key']
?
হ্যাঁ! আমাদের __missing__
একটি ডিক সাবক্লাসে প্রয়োগ করতে হবে ।
একটি নমুনা প্রোগ্রাম হতে পারে
class MyDict(dict):
def __missing__(self, key):
return None
একটি ছোট বিক্ষোভ হতে পারে
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
এবংdictionary.get("foo")
যদিও অন্যভাবে আচরণ করে।