อะไรคือสิ่งที่dict.get()
วิธี?
ดังกล่าวแล้วget
วิธีการมีพารามิเตอร์เพิ่มเติมซึ่งบ่งชี้ถึงค่าที่ขาดหายไป จากเอกสารประกอบ
get(key[, default])
ส่งคืนค่าสำหรับคีย์หากคีย์อยู่ในพจนานุกรมมิฉะนั้นจะเป็นค่าเริ่มต้น 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__
ในคลาสย่อย dict
โปรแกรมตัวอย่างสามารถ
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")
ทำตัวต่างออกไป