2010-11-12 17 views
22

मुझे एहसास है कि यदि आपके पास एक पुनरावृत्ति है तो आपको हमेशा के बजाय .join(iterable) का उपयोग करना चाहिए। लेकिन अगर केवल एक निश्चित संख्या में चर है जो पहले से ही एक पुनरावर्तनीय नहीं है, तो अभी भी अनुशंसित तरीके से .join() का उपयोग कर रहा है?पायथन। जॉइन या स्ट्रिंग कॉन्सटेनेशन

उदाहरण के लिए मेरे पास है

user = 'username' 
host = 'host' 

मुझे क्या करना चाहिए

ret = user + '@' + host 

या

ret = '@'.join([user, host]) 

मैं इतना देखने के एक प्रदर्शन बिंदु से नहीं पूछ रहा हूँ, क्योंकि दोनों होगा बहुत तुच्छ हो लेकिन मैंने यहां लोगों को पढ़ा है कि हमेशा .join() का उपयोग करें और मैं सोच रहा था कि इसके लिए कोई विशेष कारण है या यदि यह आमतौर पर .join() का उपयोग करने का एक अच्छा विचार है।

+6

मैं हमेशा आंशिक रहे हैं, उनपर ' '% s @% s'% (उपयोगकर्ता, मेजबान)'। एक दिलचस्प quesiton के लिए –

+0

+1, मैंने वही बात सोच ली है। मैं आमतौर पर उन चीजों के लिए प्रारूप का उपयोग करता हूं। – GWW

उत्तर

28

आपको लगता है कि इस तरह की स्ट्रिंग बना रहे हैं, आप सामान्य रूप से स्ट्रिंग स्वरूपण का उपयोग करना चाहते:

>>> user = 'username' 
>>> host = 'host' 
>>> '%[email protected]%s' % (user, host) 
'[email protected]' 

पायथन 2.6 एक और रूप है, जो ऑपरेटर ओवरलोडिंग पर निर्भर नहीं करता जोड़ा गया है और कुछ अतिरिक्त सुविधाएं होती हैं:

>>> '{0}@{1}'.format(user, host) 
'[email protected]' 

एक सामान्य दिशानिर्देश के रूप में, अधिकांश लोग केवल स्ट्रिंग पर + का उपयोग करेंगे यदि वे वहां दो स्ट्रिंग जोड़ रहे हैं। अधिक भागों या अधिक जटिल तारों के लिए, वे या तो ऊपर की तरह स्ट्रिंग स्वरूपण का उपयोग करते हैं, या सूची में तत्व इकट्ठा करते हैं और उनसे जुड़ते हैं (विशेष रूप से यदि इसमें लूपिंग शामिल है।) str.join() का उपयोग करने का कारण यह है कि तारों को एक साथ जोड़ना मतलब है प्रत्येक अतिरिक्त के लिए एक नई स्ट्रिंग (और पुराने लोगों को संभावित रूप से नष्ट करना) । पाइथन कभी-कभी इसे अनुकूलित कर सकता है, लेकिन str.join() जल्दी स्पष्ट, अधिक स्पष्ट और काफी तेज़ हो जाता है।

+11

यह ध्यान देने योग्य है कि '%' नोटेशन को बहिष्कृत किया गया है और '.format() 'विधि * भविष्य का तरीका * है। प्रासंगिक दस्तावेज: http://docs.python.org/library/string.html#formatstrings – syrion

+2

'%' -formatting संचालन अभी तक पदावनत नहीं कर रहे हैं। उन्हें * अप्रचलित * माना जाता है, लेकिन वे अभी भी सभी पायथन संस्करणों में उपलब्ध हैं, अभी तक वास्तविक हटाने के लिए निर्धारित नहीं किए गए हैं और किसी भी प्रकार की चेतावनी को ट्रिगर नहीं करते हैं। –

+2

एक तरफ के रूप में, मुझे यह थोड़ा दुखी लगता है, क्योंकि स्ट्रिंग स्वरूपण * ऑपरेटर के रूप में * प्यारी पायथन क्विर्क में से एक है जिसने मुझे शुरुआत में भाषा में आकर्षित किया। – kindall

8

(मैं यकीन है कि लोगों को स्ट्रिंग स्वरूपण पर इशारा करते हुए के सभी पूरी तरह से सवाल याद कर रहे हैं रहा हूँ।)

एक सरणी का निर्माण और इसे में शामिल होने से एक स्ट्रिंग बनाना केवल प्रदर्शन कारणों के लिए है। जब तक आपको उस प्रदर्शन की आवश्यकता न हो, या जब तक इसे लागू करने का प्राकृतिक तरीका न हो, तब तक सरल स्ट्रिंग कॉन्सटेनेशन के बजाय ऐसा करने का कोई फायदा नहीं होता है।

'@'.join([user, host]) कह रहा है अनजान है। यह मुझे आश्चर्यचकित करता है: वह ऐसा क्यों कर रहा है? क्या इसमें कोई सबटाइटी है; क्या कोई ऐसा मामला है जहां एक से अधिक '@' हो सकता है? जवाब निश्चित रूप से नहीं है, लेकिन उस निष्कर्ष पर आने के लिए और अधिक समय लगता है, अगर यह प्राकृतिक तरीके से लिखा गया हो।

स्ट्रिंग concatenation से बचने के लिए केवल अपने कोड contort मत करो; इसके साथ स्वाभाविक रूप से गलत कुछ भी नहीं है। सरणी में शामिल होना सिर्फ एक अनुकूलन है।

+1

मुझे यकीन नहीं है कि मैं अपने जवाब में "बिंदु को याद करता हूं"। साथ ही, 'सरणी' और 'सूची' एक ही चीज़ नहीं हैं। –

+0

@ थॉमस: दो दशकों की आदतें एरेज़ एरेज़ को कॉल करने के साथ, मैं हमेशा पाइथन के कम आम नाम से उन्हें कॉल करने के प्रयास में नहीं जाता हूं। मुझे लगता है कि आपका जवाब इस बिंदु से चूक गया क्योंकि उसका प्रश्न विशेष रूप से स्ट्रिंग कॉन्सटेनेशन से बचने के लिए '[] .join' की तुलना कर रहा था और पूछ रहा था कि सरल मामलों में भी स्ट्रिंग कॉन्सटेनेशन से बचें; * नहीं * उस विशेष, प्रदूषित उदाहरण को प्रारूपित करने के आदर्श तरीके के लिए पूछना। –

+3

प्रश्न "चर की निश्चित संख्या" के बारे में था, जो एक सामान्य स्थिति है जहां स्ट्रिंग स्वरूपण - '%' या 'str.format' के साथ - का उपयोग किया जाता है। मेरा जवाब बताता है कि क्यों लोग 'str.join() 'के लिए जाते हैं। सरणी बनाम सरणी के लिए, मुझे नहीं लगता कि गलत नाम का उपयोग करना विशेष रूप से अच्छा विचार है, क्योंकि पाइथन * पर * एरे हैं, और वे काफी अलग हैं। (और इसी कारण से, यह सुनिश्चित करने के लिए कि पाठकों को भ्रमित नहीं किया जा रहा है, मैं ध्यान दूंगा कि '[] .join' मौजूद नहीं है।) –

12

मैं सवाल ले मतलब है: "यह ठीक ऐसा करने के लिए है:"

ret = user + '@' + host 

..और जवाब है हां। यह बिल्कुल ठीक है।

आपको, निश्चित रूप से, पाइथन में आप जो ठंडा स्वरूपण सामग्री कर सकते हैं, उसके बारे में अवगत रहना चाहिए, और आपको अवगत होना चाहिए कि लंबी सूची के लिए, "जुड़ें" जाने का तरीका है, लेकिन इस तरह की एक साधारण स्थिति के लिए, आपके पास क्या सही है। यह सरल और स्पष्ट है, और प्रदर्शन एक मुद्दा नहीं होगा।

7

मैं बस ध्यान दूंगा कि जब तक मैं पाइथन सामान्य शैली पीईपी PEP-8 Style Guide for Python Code के एक हिस्से को फिर से पढ़ रहा था, तब तक मैं हमेशा जगह-जगह परिक्रमा का उपयोग करने के लिए प्रतिबद्ध हूं।

  • कोड एक तरीका है कि अजगर (PyPy, Jython, IronPython, Pyrex, Psyco, और इस तरह) की नहीं नुकसान अन्य कार्यान्वयन करता है में लिखा जाना चाहिए। उदाहरण के लिए, प्रपत्र एक में बयानों के लिए यथा-स्थान स्ट्रिंग संयोजन के CPython के कुशल कार्यान्वयन पर भरोसा नहीं करते + = ख या एक = ए + बी। ये कथन ज्योथन में धीरे-धीरे चलते हैं। प्रदर्शन संवेदनशील लाइब्रेरी के कुछ हिस्सों में, '.join() फ़ॉर्म का उपयोग इसके बजाय किया जाना चाहिए। यह यह सुनिश्चित करेगा कि विभिन्न कार्यान्वयन में रैखिक समय में समामेलन होता है।

इस से जा रहे हैं, मैं का उपयोग करने का अभ्यास करने के लिए परिवर्तित कर दिया गया है मिलती है, ताकि मैं जब दक्षता अतिरिक्त महत्वपूर्ण है एक और अधिक स्वत: अभ्यास के रूप में आदत रख सकते हैं।

तो मैं के लिए अपने वोट में डाल देता हूँ:

ret = '@'.join([user, host]) 
संबंधित मुद्दे