जवाबों:
हर अजगर कंटेनर सी के लिए, उम्मीद है कि
for item in C:
assert item in C
बस ठीक हो जाएगा - क्या आपको यह आश्चर्यजनक नहीं लगेगा यदि एक in
(लूप क्लॉज) का एक अर्थ दूसरे (उपस्थिति की जांच) से पूरी तरह से अलग अर्थ था? मुझे यकीन है कि होगा! यह स्वाभाविक रूप से सूचियों, सेटों, टुपल्स, के लिए उस तरह से काम करता है ...
इसलिए, जब C
एक शब्दकोष होता है, यदि लूप in
में कुंजी / मान टुपल्स की उपज होती है for
, तो, कम से कम विस्मय के सिद्धांत से, in
इस तरह के एक ट्यूपल को भी लेना होगा , क्योंकि इसके चेक में बाएं हाथ के ऑपरेंड हैं।
यह कितना उपयोगी होगा? सुंदर बेकार वास्तव में, मूल रूप से बनाने if (key, value) in C
के लिए एक पर्याय if C.get(key) == value
- जो एक जांच मेरा मानना है कि मैं प्रदर्शन किया है सकते हैं, या प्रदर्शन करने के लिए चाहता था है, 100 गुना अधिक शायद ही कभी क्या की तुलना में if k in C
वास्तव में मतलब है , कुंजी की उपस्थिति की जाँच केवल और पूरी तरह से मूल्य अनदेखी।
दूसरी ओर, सिर्फ चाबियों पर लूप की चाह काफी आम है, जैसे:
for k in thedict:
thedict[k] += 1
मूल्य के रूप में अच्छी तरह से विशेष रूप से मदद नहीं करेगा:
for k, v in thedict.items():
thedict[k] = v + 1
वास्तव में कुछ हद तक कम स्पष्ट और कम संक्षिप्त। (ध्यान दें कि items
कुंजी / मूल्य जोड़े प्राप्त करने के लिए उपयोग करने के लिए "उचित" विधियों की मूल वर्तनी थी: दुर्भाग्य से उन दिनों में वापस आ गया था जब ऐसे एक्सेसर्स पूरी सूची में लौट आए थे, इसलिए "बस पुनरावृत्ति" का समर्थन करने के लिए एक वैकल्पिक वर्तनी पेश की जानी थी। , और iteritems
यह था - पायथन 3 में, जहां पिछले पायथन संस्करणों के साथ पश्चगामी संगतता बाधाएं बहुत कमजोर थीं, यह items
फिर से हो गया)।
मेरा अनुमान है: पूर्ण टपल का उपयोग लूपिंग के लिए अधिक सहज होगा, लेकिन सदस्यता के उपयोग के लिए परीक्षण के लिए शायद इतना कम in
।
if key in counts:
counts[key] += 1
else:
counts[key] = 1
यदि आप के लिए कुंजी और मान दोनों को निर्दिष्ट करना था तो यह कोड वास्तव में काम नहीं करेगा in
। मैं एक मुश्किल समय का उपयोग करने के मामले की कल्पना कर रहा हूँ जहाँ आप जाँचेंगे कि कुंजी और मान दोनों शब्दकोश में हैं या नहीं। केवल कुंजियों का परीक्षण करना कहीं अधिक स्वाभाविक है।
# When would you ever write a condition like this?
if (key, value) in dict:
अब यह आवश्यक नहीं है कि in
ऑपरेटर और for ... in
समान वस्तुओं पर काम करें। कार्यान्वयन-वार वे विभिन्न ऑपरेशन ( __contains__
बनाम __iter__
) हैं। लेकिन वह छोटी असंगतता कुछ भ्रामक और, अच्छी तरह से असंगत होगी।
x in foo
केवल तभीi
मेंfor i in foo
का मूल्य मान लिया गया हैx
कुछ बिंदु पर, मैं कहूँगा कि यह एक बहुत ही होगा विशाल विसंगति।