রুবির কাছ থেকে পাইথন শেখা; পার্থক্য এবং সাদৃশ্য


131

আমি রুবিকে খুব ভাল করে চিনি। আমি বিশ্বাস করি যে পাইথনটি বর্তমানে আমার শেখার প্রয়োজন হতে পারে। যারা উভয়কেই জানেন, উভয়ের মধ্যে কোন ধারণাটি একই রকম এবং কী আলাদা?

আমি জাভাস্ক্রিপ্টারের জন্য লুয়া লার্নিংয়ের জন্য প্রাইমারের অনুরূপ একটি তালিকা খুঁজছি : সাদা জায়গাটির তাত্পর্য এবং লুপিং কনস্ট্রাক্টসের মতো সাধারণ জিনিস; nilপাইথনের নাম এবং কী মানগুলি "সত্যবাদী" হিসাবে বিবেচিত হয়; এটা সমতুল্য ব্যবহার করতে কথ্য হয় mapএবং each, বা হয় বিড়বিড় somethingaboutlistcomprehensions অস্পষ্টভাবে আদর্শ?

যদি আমি বিভিন্ন ধরণের উত্তর পাই তবে আমি তাদেরকে একটি সম্প্রদায় উইকিতে একত্রিত করে খুশি happy অন্যথায় আপনি সকলেই লড়াই করতে এবং একে অপরের কাছ থেকে আঁকতে পারেন একটি সত্য বিস্তৃত তালিকা তৈরি করার চেষ্টা করতে।

সম্পাদনা : পরিষ্কার হওয়ার জন্য, আমার লক্ষ্যটি "যথাযথ" এবং প্রতিচ্ছবিযুক্ত পাইথন। যদি পাইথনের সমতুল্য হয় injectতবে এটি কেউ ব্যবহার করে না কারণ কোনও তালিকা পুনরাবৃত্তি করার এবং সাধারণভাবে কার্যকারিতা সংগ্রহ করার সাধারণ কার্যকারিতা অর্জনের জন্য আরও ভাল / ভিন্ন উপায় রয়েছে তবে আমি কীভাবে আপনি কীভাবে কাজ করেন তা জানতে চাই। সম্ভবত আমি এই প্রশ্নটিকে সাধারণ লক্ষ্যের একটি তালিকা দিয়ে আপডেট করব, আপনি কীভাবে এটি রুবিতে অর্জন করেন এবং জিজ্ঞাসা করেন পাইথনে সমতুল্যটি কী।


1
আমি কেবল যে জিনিসটি পড়ি তা হ'ল c2.com/cgi/wiki?PythonVsRuby , আমি সত্যিই নিজের এবং ইন্ডেনশন পছন্দ করি না তবে আমার অভ্যস্ত হয়ে গেছে :)
সাইফ আল হারথি

1
সম্পর্কিত: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১১১611১১/২ (আমি এটির সদৃশ ব্যতীত জিনিসগুলির জন্য জিজ্ঞাসা করায় এটি কোনও সদৃশ কিনা তা সম্পর্কে আমি নিশ্চিত নই)।

19
সাইলেন্টগোস্ট আমি দৃ strongly়ভাবে একমত নই। আমি জিজ্ঞাসা করছি "ভাষাগুলির মধ্যে সমানটি কী এবং আলাদা কী?" নীচের অনেকগুলি উত্তর দ্বারা দেখানো হয়েছে, এটির জন্য খুব স্পষ্ট এবং সহায়ক উত্তর সম্ভব।
ফ্রেগজ

3
@ ফ্রোগজ: আমি এটি দেখেছি এবং প্রশ্নটি উত্তরহীন করে তুলেছে।
সাইলেন্টগোস্ট

2
@ ফারঙ্গজ - আপনার পোস্ট হওয়া মেটা বিষয়টিতে আমি যা বলেছিলাম তা প্রতিধ্বনিত করার জন্য, এই প্রশ্নের সমস্যাটি হ'ল সমস্যাটির স্থানটি অনেক বড় - এটি কেবল একটি প্রশ্নের জন্য খুব বড় একটি বিষয়। দুটি ভাষার মধ্যে হাজার হাজার পার্থক্য রয়েছে।
অ্যাডাম ডেভিস

উত্তর:


153

এখানে আমার কাছে কিছু মূল পার্থক্য রয়েছে:

  1. রুবির ব্লক রয়েছে; পাইথন না।

  2. পাইথনের ফাংশন রয়েছে; রুবি তা করে না। পাইথনে, আপনি যে কোনও ফাংশন বা পদ্ধতি গ্রহণ করতে এবং এটি অন্য ফাংশনে পাস করতে পারেন। রুবিতে, সমস্ত কিছুই একটি পদ্ধতি এবং পদ্ধতিগুলি সরাসরি পাস করা যায় না। পরিবর্তে, এগুলি পাস করার জন্য আপনাকে এগুলি প্রোকস এ মুড়ে রাখতে হবে।

  3. রুবি এবং পাইথন উভয়ই ক্লোজারকে সমর্থন করে তবে বিভিন্ন উপায়ে। পাইথনে, আপনি অন্য ফাংশনের ভিতরে কোনও ফাংশন সংজ্ঞায়িত করতে পারেন। অভ্যন্তরীণ ফাংশনে বাইরের ফাংশন থেকে ভেরিয়েবলগুলি পড়ার অ্যাক্সেস রয়েছে তবে লেখার অ্যাক্সেস নেই। রুবিতে, আপনি ব্লকগুলি ব্যবহার করে ক্লোজারগুলি সংজ্ঞায়িত করেন। সমাপ্তিতে বহিরাগত সুযোগ থেকে ভেরিয়েবলের সম্পূর্ণ পঠন এবং লেখার অ্যাক্সেস রয়েছে।

  4. পাইথনের তালিকা উপলব্ধি রয়েছে, যা বেশ প্রকাশ্য। উদাহরণস্বরূপ, আপনার যদি সংখ্যাগুলির একটি তালিকা থাকে তবে আপনি লিখতে পারেন

    [x*x for x in values if x > 15]

    15 এর চেয়ে বেশি মানের সমস্ত মানের স্কোয়ারের একটি নতুন তালিকা পেতে। রুবিতে আপনাকে নিম্নলিখিত লিখতে হবে:

    values.select {|v| v > 15}.map {|v| v * v}

    রুবি কোডটি কমপ্যাক্ট হিসাবে মনে হচ্ছে না। এটি তত দক্ষ নয় যেহেতু এটি প্রথমে 15 টিরও বেশি মানের মানগুলি সংক্ষিপ্ত মধ্যবর্তী অ্যারেতে মানকে অ্যারে রূপান্তর করে Then মধ্যবর্তী অ্যারেটি তখন বাইরে ফেলে দেওয়া হয়। সুতরাং, রুবি গণনার সময় মেমরির 3 টি অ্যারে সমাপ্ত করে; পাইথন কেবল ইনপুট তালিকা এবং ফলাফল তালিকা প্রয়োজন।

    পাইথন অনুরূপ মানচিত্রের বোধগম্যতা সরবরাহ করে।

  5. পাইথন টিপলসকে সমর্থন করে; রুবি তা করে না। রুবিতে, আপনাকে টিপলস অনুকরণ করতে অ্যারে ব্যবহার করতে হবে।

  6. রুবি সুইচ / কেস স্টেটমেন্ট সমর্থন করে; পাইথন না।

  7. রুবি স্ট্যান্ডার্ড expr ? val1 : val2টার্নারি অপারেটরকে সমর্থন করে ; পাইথন না।

  8. রুবি শুধুমাত্র একক উত্তরাধিকার সমর্থন করে। আপনার যদি একাধিক উত্তরাধিকার নকল করতে হয়, আপনি মডিউলগুলি সংজ্ঞায়িত করতে পারেন এবং মডিউল পদ্ধতিগুলিকে ক্লাসে টানতে মিশ্রণগুলি ব্যবহার করতে পারেন। পাইথন মডিউল মিক্স-ইনগুলির চেয়ে একাধিক উত্তরাধিকারকে সমর্থন করে।

  9. পাইথন কেবলমাত্র একক-লাইন ল্যাম্বদা ফাংশন সমর্থন করে। রুবি ব্লকগুলি, যা ধরণের / ল্যাম্বডা ফাংশনের ধরণের, নির্বিচারে বড় হতে পারে। এই কারণে, রুবি কোডটি সাধারণত পাইথন কোডের চেয়ে বেশি কার্যকরী শৈলীতে লেখা হয়। উদাহরণস্বরূপ, রুবিতে কোনও তালিকা লুপ করতে আপনি সাধারণত করেন

    collection.each do |value|
      ...
    end

    ব্লকটি একটি ফাংশনটি পাস করার মতো কাজ করে collection.each। আপনি যদি পাইথনে একই জিনিসটি করেন, আপনাকে একটি নামকৃত অভ্যন্তরীণ ফাংশনটি সংজ্ঞায়িত করতে হবে এবং তারপরে প্রতিটি পদ্ধতিতে এটি সংগ্রহ করতে হবে (যদি তালিকাটি এই পদ্ধতিটিকে সমর্থন করে):

    def some_operation(value):
      ...
    
    collection.each(some_operation)

    এটি খুব সুন্দরভাবে প্রবাহিত হয় না। সুতরাং, পাইথনে সাধারণত নিম্নলিখিত অ-কার্যকরী পদ্ধতির ব্যবহার করা হত:

    for value in collection:
      ...
  10. নিরাপদ উপায়ে সংস্থানগুলি ব্যবহার করা দুটি ভাষার মধ্যে বেশ আলাদা different এখানে সমস্যাটি হ'ল আপনি কিছু সংস্থান বরাদ্দ করতে চান (একটি ফাইল খুলুন, একটি ডাটাবেস কার্সার সংগ্রহ করুন ইত্যাদি), এতে কিছু স্বেচ্ছাচারিত ক্রিয়াকলাপ সম্পাদন করতে পারেন এবং তারপরে কোনও ব্যতিক্রম ঘটলে এমনকি নিরাপদ উপায়ে এটি বন্ধ করুন।

    রুবিতে, যেহেতু ব্লকগুলি ব্যবহার করা খুব সহজ (দেখুন # 9), আপনি সাধারণত এই প্যাটার্নটিকে এমন একটি পদ্ধতি হিসাবে কোড করবেন যা সংস্থানটিতে ক্রিয়াকলাপ সম্পাদনের জন্য একটি ব্লক নেয় operation

    পাইথনে, স্বেচ্ছাসেবী ক্রিয়াকলাপের জন্য একটি ক্রিয়াকলাপটি পাস করা কিছুটা ক্লানকিয়ার, যেহেতু আপনাকে একটি নামযুক্ত, অভ্যন্তরীণ ফাংশন লিখতে হবে (# 9 দেখুন)। পরিবর্তে, পাইথন withনিরাপদ সংস্থান হ্যান্ডলিংয়ের জন্য একটি বিবৃতি ব্যবহার করে। দেখুন আমি কীভাবে পাইথন অবজেক্টটি সঠিকভাবে পরিষ্কার করব? আরো বিস্তারিত জানার জন্য.


2
৩. পাইথন ৩ এটি nonlocalফিক্স করে Py. পাইথন আপনাকে জেনারেটর এক্সপ্রেশনও দেয় (তালিকা বোঝার অনুরূপ, তবে জিজ্ঞাসা না করা পর্যন্ত কিছুই গণনা করো না - জেনারেটর এক্সপ্রেশনকে খাওয়ানো হিসাবে তালিকা বোঝার কথা ভাবেন list(যা পুনরাবৃত্ত হয় এবং সমস্ত কিছু সম্বলিত একটি তালিকা ফেরত দেয়) পুনরাবৃত্তিযোগ্য ফলন প্রাপ্ত) - এটি কিছু ক্ষেত্রে প্রচুর প্রচেষ্টা সাশ্রয় করতে পারে)।

25
Yes. হ্যাঁ তা করে। val1 if expr else val2। ৮. যদিও আমি দেখতে পাচ্ছি এটি বেশিরভাগই মেশিন-স্টাইল বৃদ্ধির জন্য ব্যবহৃত হয়।

2
@ ক্লিন্টমিলার ওহ, কোন সুইচ / কেস নেই? তো, পাইথনে অনুরূপ কার্যকারিতা অর্জনের প্রস্তাবিত উপায় কী? যদি / অন্যথায় / তাহলে কি হবে?
ফ্রেগজ

15
আপনার # 4 এর রুবি উদাহরণটি মূর্খতাপূর্ণ নয়। লিখতে আরো রুবি পর (এবং পাঠযোগ্য) হবে values.map{|v| v*v if v > 15}.compact। আইএমএইচও, এটি আপনার অজগর উদাহরণের চেয়ে আরও স্পষ্টতই (এবং অবশ্যই স্পষ্ট)
শ্রীলঙ্কা

10
উপরের পাশাপাশি ব্যবহার করে! কম্প্যাক্ট ফাংশনের সংস্করণ অ্যারের একটি কপি এড়াতে: values.map{|v| v*v if v > 15}.compact!। এর অর্থ হ'ল কেবল ইনপুট তালিকা এবং ফলাফলের তালিকায় মেমরি বিদ্যমান। এখানে # 4 দেখুন: igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri
এসএমএল

27

আমি রুবীর 6 বছর পরে পাইথন শিখতে কয়েক মাস ব্যয় করেছি। দুটি ভাষার জন্য সত্যিই এখানে কোনও বড় তুলনা নেই, তাই আমি সিদ্ধান্ত নিয়েছিলাম যে নিজেই মানুষ লেখ এবং একটি লিখব। এখন, এটা করা হয় প্রধানত কার্যকরী প্রোগ্রামিং সঙ্গে সংশ্লিষ্ট, কিন্তু যেহেতু আপনি রুবি এর উল্লেখ injectপদ্ধতি, আমি অনুমান করছি আমরা একই তরঙ্গদৈর্ঘ্য করছি।

আমি আশা করি এটি সাহায্য করে: পাইথনের 'কদর্যতা'

বেশ কয়েকটি পয়েন্ট যা আপনাকে সঠিক পথে চালিত করবে:

  • আপনি রুবিতে যে সমস্ত কার্যকরী প্রোগ্রামিংয়ের সদ্ব্যবহার করেন তা পাইথনে রয়েছে এবং এটি আরও সহজ। উদাহরণস্বরূপ, আপনি যেমনটি আশা করেছিলেন ঠিক তেমন ফাংশনগুলিতে মানচিত্র তৈরি করতে পারেন:

    def f(x):
        return x + 1
    
    map(f, [1, 2, 3]) # => [2, 3, 4]
  • পাইথনের এমন কোনও পদ্ধতি নেই যা পছন্দ করে each। যেহেতু আপনি কেবলমাত্র eachপার্শ্ব প্রতিক্রিয়া হিসাবে ব্যবহার করেন তাই পাইথনের সমতুল্য লুপের জন্য:

    for n in [1, 2, 3]:
        print n
  • তালিকা অনুধাবনগুলি দুর্দান্ত হয় যখন ক) আপনাকে একসাথে ফাংশন এবং অবজেক্ট সংগ্রহের সাথে ডিল করতে হবে এবং খ) যখন আপনাকে একাধিক সূচকগুলি ব্যবহার করে পুনরাবৃত্তি করতে হবে। উদাহরণস্বরূপ, স্ট্রিংয়ের সমস্ত প্যালিনড্রোমগুলি খুঁজে পাওয়ার জন্য (ধরে নিলেন আপনার কোনও ফাংশন রয়েছে p()যা প্যালিনড্রোমের জন্য সত্য প্রত্যাশা করে), আপনার কেবলমাত্র একটি তালিকা বোধগম্যতা রয়েছে:

    s = 'string-with-palindromes-like-abbalabba'
    l = len(s)
    [s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]

3
দীর্ঘশ্বাস, আমি এই পোস্টটি পড়েছি এবং এটি আমার সন্দেহের সত্যতা নিশ্চিত করে: পাইথনের বিশেষ পদ্ধতির ভূমিকা এবং উপযোগিতা খুব কম লোকই বুঝতে পারে। এগুলি অবিশ্বাস্যরূপে দরকারী এবং মানসম্পন্ন এবং তারা প্রায়শই প্রয়োগ করে এমন বিল্টিনগুলির সাথে নামকরণের বিরোধগুলি এড়াতে তাদের মতো আন্ডারকর্ড করা হয়। পাইথনকে যারা জানেন আসলেই কেউ তাদের ব্যবহারকে নিরুৎসাহিত করার চেষ্টা করছেন না।
রাফ কেটলার

5
পদ্ধতিগুলি কীভাবে কাজ করে তা আপনি বুঝতে পারছেন না। একটি পদ্ধতি হ'ল মূলত এমন একটি ফাংশন যার প্রথম তর্কটি পদ্ধতিটির অন্তর্গত শ্রেণীর উদাহরণ। আপনি যখন লিখবেন Class.method, পদ্ধতিটি "আনবাউন্ড" নয় এবং প্রথম যুক্তিটি Classউদাহরণ হতে হবে ; আপনি যখন লিখবেন object.method, পদ্ধতিটি objectউদাহরণের সাথে "আবদ্ধ" Class। এটি আপনাকে ম্যাপ (ইত্যাদির) ব্যবহার করতে হবে কিনা তা প্রতিবারই কোনও পার্থক্যের জন্য পদ্ধতিটি কল করতে বাছাই করতে দেয় (আনবাউন্ড পদ্ধতিটি পাস করুন), বা উদাহরণটি স্থির রাখতে এবং প্রতিবার একটি ভিন্ন দ্বিতীয় তর্কটি পাস করার জন্য। দুটোই কাজে লাগে।
এলএসি

2
আপনি ঠিক বলেছেন, তারা কীভাবে কাজ করেছে তা আমি বুঝতে পারি নি। নিবন্ধ প্রকাশের পর থেকে, আমি এটির জন্য আরও ভাল ধারণা অর্জন করেছি। ধন্যবাদ!
ডেভিড জে।

10
[s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]- এই লাইনটি দেখায় যে পড়ার জন্য পাইথন কীভাবে কঠিন। আপনি যখন রুবি কোডটি পড়েন তখন আপনি চোখ ফেরান না দিয়ে বাম থেকে ডানে সরিয়ে নিয়ে যান। পাইথন কোড পড়ার জন্য আপনার বাম-ডান-বাম-ডান-বাম-বামে যেতে হবে ... এবং বন্ধনী, বন্ধনী, বন্ধনী, বন্ধনী ... এছাড়াও পাইথনে আপনাকে প্রায়শই পদ্ধতি এবং ফাংশন মিশ্রিত করতে হবে। এটি উন্মাদনা: E(C(A.B()).D())রুবির পরিবর্তেA.B.C.D.E
নাকিলন

2
@ নাকিলন এজন্য আপনার কেবলমাত্র সাধারণ ক্ষেত্রে সাধারণ নেস্টেড তালিকা বোঝার জন্য ব্যবহার করা উচিত, উপরের মত নয়। ওয়ান লাইনার লিখতে এটি 'চালাক' হতে পারে যা স্ট্রিংয়ের মধ্যে সমস্ত প্যালিনড্রোমগুলি খুঁজে পায় তবে এটি কোড গল্ফের জন্য সেরা সংরক্ষিত। রিয়েল কোডের জন্য যা পরে অন্য কারও পড়তে হয়, আপনি কেবল কয়েকটি লাইন ফাংশন লিখবেন। সুতরাং হ্যাঁ, এই লাইনটি পড়া শক্ত, তবে এটি প্রোগ্রামারের দোষ, ভাষার নয়।
ক্যাম জ্যাকসন

10

আমার পরামর্শ: পার্থক্যগুলি জানার চেষ্টা করবেন না। পাইথনে সমস্যার কীভাবে যোগাযোগ করবেন তা শিখুন। প্রতিটি সমস্যার প্রতি রুবি পদ্ধতির মতো (এটি ভাষার সীমাবদ্ধতা এবং শক্তি সম্পর্কে খুব ভাল কাজ করে), সমস্যাটির কাছে পাইথন পদ্ধতিরও রয়েছে। তারা উভয় পৃথক। প্রতিটি ভাষার সর্বোত্তম লাভ করার জন্য, আপনার ভাষাটি নিজেই শিখতে হবে এবং কেবল একটির থেকে অন্য অনুবাদ "অনুবাদ" নয়।

এখন, এই কথার সাথে, পার্থক্যটি আপনাকে দ্রুত অভিযোজন এবং পাইথন প্রোগ্রামে 1 টি পরিবর্তন আনতে সহায়তা করবে। আর লেখার শুরু করার জন্য এটি ঠিক আছে। তবে ভাষার প্রকল্পসমূহের পিছনে কীভাবে স্থাপত্য এবং নকশা সংক্রান্ত সিদ্ধান্তের পিছনে অন্যান্য প্রকল্পগুলি থেকে শেখার চেষ্টা করুন ...


7
আমি আপনার পরামর্শ প্রশংসা করি। আমি সম্পূর্ণ অনুভূতির সাথে একমত (যা আমি "আইডেমোমেটিক পাইথন প্রোগ্রাম শিখি" হিসাবে ব্যাখ্যা করি) । এটাই হ'ল আমি যা করার চেষ্টা করছি। আমি জিজ্ঞাসা করছি না "রুবির eachপদ্ধতির পাইথন নাম কী ?" আমি জিজ্ঞাসা করছি " পাইথনগুলিতে কীভাবে জিনিসগুলি রুবির থেকে আলাদা হয় এবং সেগুলি সঠিকভাবে কোথায় করা হয়?" তাহলে পাইথন এর falseআসলে Falseজানি গুরুত্বপূর্ণ হিসেবে যে হিসেবে কোথায় এবং কখন আমি Rubyesque ভাবে কিছু করা উচিত এবং কোথায় এবং কখন ই বা করবো না।
ফ্রেগজ

2
@ ফ্রোগজ: এটাই ফর্সা। আমি আপনার প্রশ্নের ব্যাখ্যাটি যেভাবে করেছি তা হ'ল আসুন পার্থক্যের একটি তালিকা তৈরি করুন যাতে আমরা যে ভাষায় প্রোগ্রামিং করছি তা কেবলমাত্র আমরা পরিবর্তন করতে পারি । তবে এটি একটি ন্যায্য প্রশ্ন। আমার ধারণা আপনি কেবল যা চেয়েছিলেন তা আমি ভুল ব্যাখ্যা করেছি। আমি এটি এখানে রেফারেন্সের জন্য রেখে দেব, তবে অন্যটি কী আসে তা দেখতে আকর্ষণীয় হবে ...
ঘটে

আমি অজগর এবং রুবি একই সাথে শিখছি, এবং ওয়েব অ্যাপ্লিকেশন ডেভ এ আমি পার্থক্যের চেয়ে বেশি মিল দেখি।
ওয়েস্টার্নগুন

8

আমি ছোট রুবিকে জানি, তবে আপনি যে বিষয়গুলি উল্লেখ করেছেন সে সম্পর্কে এখানে কয়েকটি বুলেট পয়েন্ট রয়েছে:

  • nil, মান একটি অভাব নির্দেশ করে মান হবে None(নোট করুন যে আপনি এটির জন্য x is Noneবা এটি পরীক্ষা x is not Noneকরে দেখুন ==- বা বুলিয়ানকে জোর করে, পরবর্তী পয়েন্টটি দেখুন)।
  • None, শূন্য-এসকিউ সংখ্যা ( 0, 0.0, 0j(জটিল সংখ্যা)) এবং খালি সংগ্রহের ( [], {}, set(), খালি স্ট্রিং "", ইত্যাদি) falsy, অন্য সব কিছুর বিবেচনা করা হয় truthy বিবেচনা করা হয়।
  • পার্শ্ব প্রতিক্রিয়াগুলির জন্য, ( for-) স্পষ্টভাবে লুপ করুন। পার্শ্ব-প্রতিক্রিয়া ছাড়াই নতুন গুচ্ছ স্টাফ তৈরির জন্য, তালিকা বোধগম্যতা ব্যবহার করুন (বা তাদের আত্মীয় - অলস এক-সময় পুনরাবৃত্তির জন্য জেনারেটর এক্সপ্রেশন, उक्त সংগ্রহগুলির জন্য ডিক / সেট বোধগম্য)।

লুপিং সম্পর্কিত: আপনার রয়েছে for, যা একটি পুনরাবৃত্তিযোগ্য (! কোনও গণনা নেই) এবং whileযা আপনার প্রত্যাশা অনুযায়ী কাজ করে। ফ্রুমারটি আরও বেশি শক্তিশালী, এটির পুনরাবৃত্তিকারীদের জন্য বিস্তৃত সহায়তার জন্য ধন্যবাদ। তালিকার পরিবর্তে কেবল প্রায় প্রতিটি জিনিসই পুনরাবৃত্তিকারী নয় (কমপক্ষে পাইথন 3 - পাইথন 2 এ, আপনার উভয়ই আছে এবং ডিফল্ট একটি তালিকা, দুঃখের সাথে)। zipপুনরাবৃত্তকারীদের সাথে কাজ করার জন্য অসংখ্য সরঞ্জাম - সমান্তরালে যেকোন সংখ্যক পুনরাবৃত্তি পুনরাবৃত্তি করে, enumerateআপনাকে দেয়(index, item) ( কোনও পুনরাবৃত্তির উপরে, কেবল তালিকায় নয়) এমনকি বিচ্ছিন্ন (সম্ভবত বৃহত বা অসীম) পুনরাবৃত্তির বিভাজন! আমি দেখতে পেয়েছি যে এগুলি অনেকগুলি লুপিংয়ের কাজগুলি আরও সহজ করে তোলে। বলা বাহুল্য, তারা তালিকান বোধগম্যতা, জেনারেটরের এক্সপ্রেশন ইত্যাদির সাথে সূক্ষ্মভাবে সংহত করে


2
জেনারেটর এক্সপ্রেশন দুর্দান্ত। তারা পাইথনকে হাস্কেলের মতো ভাষার কিছুটা অলস মূল্যায়ন ক্ষমতা দেয়।
ক্লিন্ট মিলার

@ ক্লিন্ট: হ্যাঁ এবং সম্পূর্ণ জেনারেটরগুলি আরও বেশি সক্ষম (যদিও সাধারণ ক্ষেত্রে প্রয়োজন হয় না, যা সংখ্যাগরিষ্ঠ হয়)।

আপনি x is Noneবা কেন সাথে চেক করবেন x is not None? আমি সবসময় x == Noneএবং সাথে চেক x != None
জন

@ জন: যদি নির্বোধভাবে xসংজ্ঞা দেওয়া __eq__হয় তবে এটি একটি মিথ্যা ইতিবাচক দিক দিতে পারে। যদি __eq__সাবধানে প্রোগ্রাম করা না AttributeErrorহয় তবে নির্দিষ্ট মান (যেমন None) দেওয়া হলে এটি ক্রাশ হতে পারে (উদাঃ )। বিপরীতে, isওভাররাইড করা যাবে না - এটি সর্বদা অবজেক্ট পরিচয়ের তুলনা করে যা একক সিলেটের জন্য যাচাই করার জন্য সঠিক (সবচেয়ে শক্তিশালী, সহজতম এবং পরিষ্কার) উপায়।

1
@John। "এক্স ইজ নন নট" এটি করার একদম মূ .় উপায়। পাইথন.নাট
~

6

রুবিতে, উদাহরণস্বরূপ ভেরিয়েবল এবং পদ্ধতিগুলি সম্পূর্ণরূপে সম্পর্কিত নয়, কেবলমাত্র আপনি যখন এট্রি_একসেসর বা এর মতো কোনও কিছুর সাথে স্পষ্টভাবে তাদের সাথে সম্পর্কিত করেন except

পাইথনে, পদ্ধতিগুলি কেবলমাত্র বৈশিষ্ট্যের একটি বিশেষ শ্রেণি: এক্সিকিউটযোগ্য is

উদাহরণস্বরূপ:

>>> class foo:
...     x = 5
...     def y(): pass
... 
>>> f = foo()
>>> type(f.x)
<type 'int'>
>>> type(f.y)
<type 'instancemethod'>

এই পার্থক্যটির অনেকগুলি প্রভাব রয়েছে যেমন উদাহরণস্বরূপ যে এফএক্সকে উল্লেখ করার পরিবর্তে পদ্ধতি অবজেক্টকে বোঝানো হয়। এছাড়াও, আপনি দেখতে পাচ্ছেন, এফএক্স ডিফল্টরূপে সর্বজনীন, অন্যদিকে রুবিতে, ইনস্ট্যান্স ভেরিয়েবলগুলি ডিফল্টরূপে ব্যক্তিগত।


2
আসলে, আমি এটিকে আরও স্পষ্টভাবে বলছি: পাইথনে, পদ্ধতিগুলি কেবল একটি বিশেষ ধরণের বৈশিষ্ট্য, যেখানে রুবিতে, বৈশিষ্ট্যগুলি কেবল একটি বিশেষ ধরণের পদ্ধতি। দুটি ভাষার মধ্যে কিছু গুরুত্বপূর্ণ বিপরীত বৈশিষ্ট্যগুলি এর মধ্যে পড়ে: পাইথনে প্রথম শ্রেণির ফাংশন এবং রুবিতে ইউনিফর্ম অ্যাক্সেস প্রিন্সিপাল
ফিলোমোরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.