इसके string.join(list)बजाय क्यों है list.join(string)?
ऐसा इसलिए है क्योंकि joinएक "स्ट्रिंग" विधि है! यह किसी भी चलने योग्य से एक स्ट्रिंग बनाता है। यदि हम सूचियों पर विधि अटक जाते हैं, तो क्या होगा जब हमारे पास पुनरावृत्तियाँ हैं जो सूचियाँ नहीं हैं?
क्या होगा यदि आपके पास तार का एक टुकड़ा है? यदि यह एक listविधि थी, तो आपको स्ट्रिंग्स के प्रत्येक ऐसे पुनरावृत्तिकर्ता को listपहले लाना होगा क्योंकि आप तत्वों को एक स्ट्रिंग में शामिल कर सकते हैं! उदाहरण के लिए:
some_strings = ('foo', 'bar', 'baz')
आइए हम अपनी सूची में शामिल होने की विधि को रोल करें:
class OurList(list):
def join(self, s):
return s.join(self)
और इसका उपयोग करने के लिए, ध्यान दें कि हमें सबसे पहले प्रत्येक पुनरावृत्ति से एक सूची बनानी होगी जो उस पुनरावृत्ति में तार जुड़ने के लिए स्मृति और प्रसंस्करण शक्ति दोनों को बर्बाद कर दे:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
इसलिए हम देखते हैं कि हमें अपनी सूची विधि का उपयोग करने के लिए एक अतिरिक्त कदम जोड़ना होगा, बजाय केवल अंतर्निहित स्ट्रिंग विधि का उपयोग करने के लिए:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
जेनरेटर के लिए प्रदर्शन कैवेट
एल्गोरिथ्म पाइथन अंतिम स्ट्रिंग बनाने के लिए उपयोग करता है जिसके साथ str.joinवास्तव में दो बार से अधिक चलना पड़ता है, इसलिए यदि आप इसे जनरेटर अभिव्यक्ति प्रदान करते हैं, तो इसे अंतिम स्ट्रिंग बनाने से पहले इसे पहले सूची में बदलना होगा।
इस प्रकार, जेनरेटरों के आसपास से गुजरना आमतौर पर सूची की समझ से बेहतर है, str.joinएक अपवाद है:
>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173
फिर भी, str.joinऑपरेशन अभी भी शब्दशः एक "स्ट्रिंग" ऑपरेशन है, इसलिए यह अभी भी यह है कि यह strवस्तु पर विविध iterables की तुलना में है।
-घोषणा करता है कि आप एक सूची में शामिल हो रहे हैं और एक स्ट्रिंग में परिवर्तित कर रहे हैं। यह परिणाम उन्मुख है।