পাইথন বনাম রুবির নিয়ে প্রচুর আলোচনা রয়েছে এবং আমি তাদের সবাইকে সম্পূর্ণরূপে অস্বাস্থ্যকর বলে মনে করি, কারণ তারা সকলেই ঘুরিয়ে ঘুরিয়ে ফিরিয়েছে যে এক্স বৈশিষ্ট্যটি ভাষা ওয়াইতে সাফ করে, বা এই দাবী ভাষায় এক্স নেই, যদিও বাস্তবে তা ঘটে না। আমি ঠিক জানি কেন আমি পাইথনকে প্রাধান্য দিই তবে এটি বিষয়গতও বটে, এবং কাউকে বেছে নিতে সহায়তা করবে না, কারণ তাদের মতো বিকাশের ক্ষেত্রে আমার মতো পছন্দ নাও থাকতে পারে।
অতএব উদ্দেশ্যমূলকভাবে পার্থক্যগুলি তালিকাবদ্ধ করা আকর্ষণীয় হবে। সুতরাং কোনও "পাইথনের ল্যাম্বডাস চুষে দেয়"। পরিবর্তে রুবির ল্যাম্বডাস পাইথনের যেটি পারে না তা কী তা ব্যাখ্যা করুন। সাবজেক্টিভিটি নেই। উদাহরণ কোড ভাল!
দয়া করে একটি উত্তরে বেশ কয়েকটি পার্থক্য নেই have এবং আপনি যা জানেন তাদের সঠিক ভোট দিন এবং আপনি জানেন তাদের ভুল (বা বিষয়ভিত্তিক) down এছাড়াও, সিনট্যাক্সের মধ্যে পার্থক্য আকর্ষণীয় নয়। আমরা জানি পাইথন বন্ধনী এবং শেষের সাহায্যে রুবি যা করেন তা ইনডেন্টেশন দিয়ে করেন এবং সেই @ কে পাইথনে স্ব বলা হয়।
আপডেট: এটি এখন একটি সম্প্রদায় উইকি, তাই আমরা এখানে বড় পার্থক্য যুক্ত করতে পারি।
রুবীর ক্লাস বডিতে একটি ক্লাস রেফারেন্স রয়েছে
রুবিতে আপনার কাছে ক্লাস বডিতে ইতিমধ্যে ক্লাসের (স্ব) একটি রেফারেন্স রয়েছে। পাইথনে ক্লাসের নির্মাণ শেষ না হওয়া পর্যন্ত আপনার কাছে ক্লাসের কোনও রেফারেন্স নেই।
একটি উদাহরণ:
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
,।
রুবির পার্লের মতো স্ক্রিপ্টিং বৈশিষ্ট্য রয়েছে
রুবিতে প্রথম শ্রেণীর রেজেক্সপস, ari -ভেরিয়েবলস, লাইন ইনপুট লুপ দ্বারা আঁকা / পার্ল লাইন এবং অন্যান্য বৈশিষ্ট্য রয়েছে যা এটি ছোট শেল স্ক্রিপ্টগুলি লেখার পক্ষে আরও উপযুক্ত করে তোলে যা পাঠ্য ফাইলগুলিকে আবদ্ধ করে দেয় বা অন্যান্য প্রোগ্রামগুলির জন্য আঠালো কোড হিসাবে কাজ করে।
রুবির প্রথম শ্রেণির ধারাবাহিকতা রয়েছে
কলসিসি বিবৃতি ধন্যবাদ। পাইথনে আপনি বিভিন্ন কৌশল দ্বারা ধারাবাহিকতা তৈরি করতে পারেন, তবে ভাষাটিতে কোনও সমর্থন নেই।
রুবির ব্লক রয়েছে
"কর" বিবৃতি দিয়ে আপনি রুবিতে একাধিক-লাইন বেনামি ফাংশন তৈরি করতে পারেন, যা করার সামনের পদ্ধতিতে একটি যুক্তি হিসাবে পাঠানো হবে এবং সেখান থেকে ডাকা হবে। পাইথনে আপনি পরিবর্তে কোনও পদ্ধতি পাস করে বা জেনারেটর দিয়ে এটি করতে পারেন।
রুবি:
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))
পাইথনে অন্তর্নির্মিত জেনারেটর রয়েছে (যা উপরে বর্ণিত হিসাবে রুবি ব্লকের মতো ব্যবহৃত হয়)
পাইথনের ভাষায় জেনারেটরের পক্ষে সমর্থন রয়েছে। রুবি ১.৮ এ আপনি জেনারেটর মডিউলটি ব্যবহার করতে পারেন যা কোনও ব্লক থেকে জেনারেটর তৈরি করতে ধারাবাহিকতা ব্যবহার করে। অথবা, আপনি কেবল একটি ব্লক / প্রোক / ল্যাম্বদা ব্যবহার করতে পারেন! তদুপরি, রুবিতে ১.৯ ফাইবার রয়েছে, এবং জেনারেটর হিসাবে ব্যবহার করা যায় এবং গণক শ্রেণি একটি অন্তর্নির্মিত জেনারেটর 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
ফাইল সহ ডিরেক্টরি রয়েছে ।
পাইথনের ডকস্ট্রিং রয়েছে
ডকাস্ট্রিংস এমন স্ট্রিং যা মডিউল, ফাংশন এবং পদ্ধতিগুলির সাথে সংযুক্ত থাকে এবং রানটাইম এ আত্মরীক্ষণ করা যায়। এটি হেল্প কমান্ড এবং স্বয়ংক্রিয় ডকুমেন্টেশন এর মতো জিনিস তৈরি করতে সহায়তা করে।
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
রুবির সমতুল্য জাভাডোকের সমান এবং এটির পরিবর্তে পদ্ধতির উপরে অবস্থিত। এগুলি 1.9 এর পদ্ধতি # উত্স_লোকেশন উদাহরণ ব্যবহারের মাধ্যমে ফাইলগুলি থেকে রানটাইমে পুনরুদ্ধার করা যায়
পাইথনের একাধিক উত্তরাধিকার রয়েছে
রুবি ("উদ্দেশ্যে" নয়) - রুবির ওয়েবসাইট দেখুন, রুবিতে এটি কীভাবে করা হয়েছে তা এখানে দেখুন )। এটি মডিউল ধারণাটি এক ধরণের বিমূর্ত শ্রেণির হিসাবে পুনরায় ব্যবহার করে না।
পাইথনের তালিকা / ডিক সংজ্ঞা রয়েছে
পাইথন:
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)
পাইথন ২.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