การวนซ้ำพจนานุกรมที่ใช้ลูป 'for'
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Python รู้ได้อย่างไรว่ามันต้องการเพียงเพื่ออ่านกุญแจจากพจนานุกรม? คีย์เป็นคำพิเศษใน Python หรือไม่ หรือมันเป็นเพียงตัวแปร?
มันไม่ใช่แค่for
ลูป คำสำคัญที่นี่คือ "วนซ้ำ"
พจนานุกรมคือการแม็พของคีย์กับค่า:
d = {'x': 1, 'y': 2, 'z': 3}
เมื่อใดก็ตามที่เราทำซ้ำมันเราจะทำซ้ำมากกว่ากุญแจ ชื่อตัวแปรkey
มีจุดประสงค์เพื่อให้สื่อความหมายเท่านั้น - และเหมาะสำหรับวัตถุประสงค์
สิ่งนี้เกิดขึ้นในรายการความเข้าใจ:
>>> [k for k in d]
['x', 'y', 'z']
มันเกิดขึ้นเมื่อเราส่งพจนานุกรมไปยังรายการ (หรือวัตถุประเภทคอลเลกชันอื่น ๆ ):
>>> list(d)
['x', 'y', 'z']
วิธีการทำซ้ำของ Python ในบริบทที่ต้องการมันเรียก__iter__
เมธอดของวัตถุ (ในกรณีนี้คือพจนานุกรม) ซึ่งส่งคืนตัววนซ้ำ (ในกรณีนี้คือวัตถุ keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
เราไม่ควรใช้วิธีพิเศษเหล่านี้แทนใช้ฟังก์ชัน builtin ตามลำดับแทนiter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Iterators มี__next__
เมธอด - แต่เราเรียกมันด้วยฟังก์ชัน builtin next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
เมื่อ iterator StopIteration
หมดมันก็เกิด นี่คือวิธีที่ Python รู้วิธีออกจากfor
ลูปหรือความเข้าใจในรายการหรือนิพจน์ตัวสร้างหรือบริบทการวนซ้ำอื่น ๆ เมื่อตัววนซ้ำยกขึ้นStopIteration
มันก็จะเพิ่มมันเสมอ - หากคุณต้องการวนซ้ำอีกครั้งคุณจะต้องเพิ่มใหม่
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
กลับไปที่ dicts
เราได้เห็นว่าวนซ้ำในบริบทหลายอย่าง สิ่งที่เราได้เห็นคือเมื่อใดก็ตามที่เราย้ำกว่า Dict เราจะได้รับกุญแจ กลับไปที่ตัวอย่างดั้งเดิม:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
หากเราเปลี่ยนชื่อตัวแปรเรายังคงได้รับกุญแจ มาลองดูกัน:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
หากเราต้องการวนซ้ำค่าเราจำเป็นต้องใช้.values
วิธีการกำหนดหรือสำหรับทั้งสองร่วมกัน.items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
ในตัวอย่างที่ให้มามันจะมีประสิทธิภาพมากกว่าในการวนซ้ำไอเท็มแบบนี้:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
แต่สำหรับจุดประสงค์ทางวิชาการตัวอย่างของคำถามก็ใช้ได้