पाइथन बनाम रूबी की बहुत चर्चा है, और मैं उन सभी को पूरी तरह से अप्रसन्न पाता हूं, क्योंकि वे सभी इस बात की ओर मुड़ जाते हैं कि फीचर X को भाषा Y में क्यों चूसना है, या यह दावा कि भाषा Y में X नहीं है, हालांकि वास्तव में यह करता है। मुझे यह भी पता है कि मैं पायथन को क्यों पसंद करता हूं, लेकिन यह व्यक्तिपरक भी है, और किसी को भी चुनने में मदद नहीं करेगा, क्योंकि उनके पास विकास में समान स्वाद नहीं हो सकता है जैसा कि मैं करता हूं।
इसलिए, मतभेदों को सूचीबद्ध करना दिलचस्प होगा। तो कोई "पायथन के लंबोदर चूसता है"। इसके बजाय यह समझाएं कि रूबी का मेमना पाइथन के नहीं कर सकता। कोई व्यक्तिपरकता नहीं। उदाहरण कोड अच्छा है!
कृपया एक उत्तर में कई अंतर न रखें। और उन लोगों को वोट दें जिन्हें आप जानते हैं कि वे सही हैं, और जो आप जानते हैं वे गलत हैं (या व्यक्तिपरक हैं)। इसके अलावा, सिंटैक्स में अंतर दिलचस्प नहीं है। हम जानते हैं कि पायथन इंडेंटेशन के साथ करता है जो रूबी कोष्ठक और सिरों के साथ करता है, और उस @ को पायथन में स्वयं कहा जाता है।
अद्यतन: यह अब एक सामुदायिक विकि है, इसलिए हम यहाँ बड़े अंतर जोड़ सकते हैं।
रूबी का क्लास बॉडी में क्लास रेफरेंस है
रूबी में आपके पास कक्षा शरीर में पहले से ही कक्षा (स्वयं) का संदर्भ है। पायथन में आपके पास क्लास का एक संदर्भ नहीं है जब तक कि क्लास का निर्माण पूरा नहीं हो जाता है।
एक उदाहरण:
class Kaka
puts self
end
इस मामले में स्वयं वर्ग है, और यह कोड "काका" को प्रिंट करेगा। पायथन में क्लास डेफिनिशन बॉडी से क्लास के नाम या अन्य तरीकों से प्रिंट करने का कोई तरीका नहीं है (बाहर विधि परिभाषाएँ)।
रूबी में सभी वर्ग परस्पर मिलते हैं
इससे आप कोर कक्षाओं में एक्सटेंशन विकसित कर सकते हैं। यहां रेल एक्सटेंशन का एक उदाहरण दिया गया है:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
अजगर (कल्पना करें कि कोई ''.startswithविधि नहीं थी ):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
आप इसे किसी भी क्रम पर उपयोग कर सकते हैं (केवल तार नहीं)। ताकि इसे उपयोग करने के लिए आप इसे आयात करना चाहिए स्पष्ट रूप से , उदाहरण के लिए from some_module import starts_with।
रूबी में पर्ल जैसी स्क्रिप्टिंग सुविधाएँ हैं
रूबी के पास प्रथम श्रेणी के रेग्जैक्स, $ -विरैबल्स, लाइन इनपुट लूप द्वारा awk / perl लाइन और अन्य विशेषताएं हैं जो इसे छोटे शेल स्क्रिप्ट लिखने के लिए अधिक अनुकूल बनाती हैं जो पाठ फ़ाइलों को मून करती हैं या अन्य कार्यक्रमों के लिए गोंद कोड के रूप में कार्य करती हैं।
रूबी में प्रथम श्रेणी में निरंतरता है
Callcc स्टेटमेंट के लिए धन्यवाद। पायथन में आप विभिन्न तकनीकों द्वारा निरंतरता बना सकते हैं, लेकिन भाषा के लिए निर्मित कोई समर्थन नहीं है।
रूबी में ब्लॉक हैं
"डू" स्टेटमेंट के साथ आप रूबी में एक बहु-पंक्ति अनाम फ़ंक्शन बना सकते हैं, जिसे विधि के सामने एक तर्क के रूप में पारित किया जाएगा, और वहां से बुलाया जाएगा। पायथन में आप इसके बजाय एक विधि पारित करके या जनरेटर के साथ करेंगे।
माणिक:
amethod { |here|
many=lines+of+code
goes(here)
}
पायथन (रूबी ब्लॉक अजगर में विभिन्न निर्माणों के अनुरूप हैं):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
या
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
या
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
दिलचस्प बात यह है कि रूबी में एक ब्लॉक को कॉल करने के लिए सुविधा स्टेटमेंट को "उपज" कहा जाता है, जो पायथन में एक जनरेटर का निर्माण करेगा।
माणिक:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
अजगर:
def themethod():
yield 5
for foo in themethod():
print foo
हालांकि सिद्धांत अलग हैं, परिणाम हड़ताली समान है।
रूबी कार्यात्मक शैली (पाइप जैसी) प्रोग्रामिंग का अधिक आसानी से समर्थन करता है
myList.map(&:description).reject(&:empty?).join("\n")
अजगर:
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
पायथन में बिल्ट-इन जनरेटर हैं (जो कि ऊपर बताए अनुसार रूबी ब्लॉक की तरह उपयोग किए जाते हैं)
पायथन को भाषा में जनरेटर के लिए समर्थन है। रूबी 1.8 में आप जनरेटर मॉड्यूल का उपयोग कर सकते हैं जो एक ब्लॉक से जनरेटर बनाने के लिए निरंतरता का उपयोग करता है। या, आप बस एक ब्लॉक / proc / lambda का उपयोग कर सकते हैं! इसके अलावा, रूबी में 1.9 फाइबर हैं, और जनरेटर के रूप में इस्तेमाल किए जा सकते हैं, और एन्युमरेटर क्लास एक निर्मित जनरेटर 4 है
docs.python.org का यह जनरेटर उदाहरण है:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
इसके विपरीत उपरोक्त ब्लॉक उदाहरणों के साथ।
पायथन में लचीला नाम स्थान हैंडलिंग है
रूबी में, जब आप किसी फ़ाइल को आयात करते हैं, तो requireउस फ़ाइल में परिभाषित सभी चीजें आपके वैश्विक नामस्थान में समाप्त हो जाएंगी। यह नाम स्थान के प्रदूषण का कारण बनता है। इसका समाधान रूबी मॉड्यूल है। लेकिन यदि आप एक मॉड्यूल के साथ एक नाम स्थान बनाते हैं, तो आपको उस नाम स्थान का उपयोग करना होगा जिसमें निहित कक्षाएं हों।
पायथन में, फ़ाइल एक मॉड्यूल है, और आप इसके निहित नामों को आयात कर सकते हैं from themodule import *, जिससे यदि आप चाहें तो नाम स्थान को प्रदूषित कर सकते हैं। लेकिन आप केवल चयनित नामों के साथ भी आयात कर सकते हैं from themodule import aname, anotherया आप बस import themoduleऔर फिर नामों को एक्सेस कर सकते हैं themodule.aname। यदि आप अपने नाम स्थान में अधिक स्तर चाहते हैं, तो आपके पास पैकेज हो सकते हैं, जो मॉड्यूल और __init__.pyफ़ाइल के साथ निर्देशिकाएं हैं ।
अजगर के पास डॉकस्ट्रिंग्स हैं
Docstrings वे तार होते हैं जो मॉड्यूल, फ़ंक्शंस और विधियों से जुड़े होते हैं और रनटाइम में इन्ट्रोस्पेक्ट किए जा सकते हैं। यह मदद कमांड और स्वचालित प्रलेखन के रूप में ऐसी चीजें बनाने में मदद करता है।
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
रूबी के समकक्ष javadocs के समान हैं, और इसके भीतर विधि के ऊपर स्थित है। उन्हें 1.9 की विधि # source_location उदाहरण के उपयोग से फ़ाइलों से रनटाइम पर पुनर्प्राप्त किया जा सकता है
पायथन में कई विरासत हैं
रूबी नहीं ("उद्देश्य पर" - रूबी की वेबसाइट देखें , यहां देखें कि यह रूबी में कैसे किया गया है )। यह अमूर्त वर्गों के एक प्रकार के रूप में मॉड्यूल अवधारणा का पुन: उपयोग करता है।
पायथन की सूची / तानाशाही समझ है
अजगर:
res = [x*x for x in range(1, 10)]
माणिक:
res = (0..9).map { |x| x * x }
अजगर:
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
माणिक:
p = proc { |x| x * x }
(0..9).map(&p)
पायथन 2.7+ :
>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}
माणिक:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
अजगर में सज्जाकार होते हैं
डेकोरेटर्स के समान चीजें भी रूबी में बनाई जा सकती हैं, और यह भी तर्क दिया जा सकता है कि वे पायथन के रूप में आवश्यक नहीं हैं।
सिंटेक्स मतभेद
रूबी को अपने सभी स्कोप को बंद करने के लिए "एंड" या "}" की आवश्यकता होती है, जबकि पायथन केवल व्हाइट-स्पेस का उपयोग करता है। रूबी में हाल ही में व्हाट्सएप केवल इंडेंटेशन के लिए अनुमति देने के प्रयास किए गए हैं http://github.com/michaeledgar/seamless