পাইথনের "এটি করার একমাত্র উপায়" সর্বাধিক [বন্ধ] এর কংক্রিট উদাহরণ


34

আমি পাইথন শিখছি এবং পিইপি 20 পাইথনের জেনের নীচের বিষয়টি দ্বারা আগ্রহী :

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

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

উত্তর:


47

পার্লের মতো ভাষার তুলনায় পাইথনের সীমিত সংখ্যক নিয়ন্ত্রণ রচনা রয়েছে:

  • শুধু ifএবং না unless,
  • কেবলমাত্র forক্রমগুলি পুনরাবৃত্তি করে এবং কোনও foreachবা সি-স্টাইল নয় for,
  • কেবলমাত্র whileপ্রতিটি লুপের শর্ত পরীক্ষা করে এবং না do-while,
  • শুধু if-elifএবং না switch,
  • সেখানে কেবলমাত্র একটি মন্তব্য রয়েছে #, এবং প্রতিটি লাইনের জন্য আপনি পূর্ববর্তী লাইনগুলি না দেখে মন্তব্য করতে পারেন কিনা তা আপনি বলতে পারবেন।

এছাড়াও, আপনার উত্স প্রবেশ করতে প্রায় এক উপায় আছে; সৃজনশীল ইন্ডেন্টেশনের বেশিরভাগ ক্ষেত্রে সিনথেটিকভাবে বাদ দেওয়া হয়।

এটি পাইথনের উত্সকে বিশ্লেষণকে সহজ করে তোলে।

বিল্ট-ইন টাইপ এবং স্ট্যান্ডার্ড লাইব্রেরিতে ন্যূনতম-তবে-সম্পূর্ণ হওয়ার চেষ্টা রয়েছে।

  • পরিবর্তনীয় তালিকার জন্য আপনি কেবল বিল্ট-ইন listটাইপ ব্যবহার করেন ; এটি বেশিরভাগ ক্রিয়াকলাপের জন্য ও (1), এবং আপনাকে কখনই সঠিক বাস্তবায়ন বেছে নিতে হবে না,
  • অপরিবর্তনীয় তালিকার জন্য, সমানভাবে, আপনি কেবল tupleপ্রকারটি ব্যবহার করেন ,
  • মানচিত্রের জন্য, আপনি একমাত্র বিল্ট-ইন ব্যবহার করেন dictযা বেশিরভাগ ক্ষেত্রে অভিশাপজনক, কোনটি প্রয়োগ করতে হবে তা বিবেচনা করার দরকার নেই।

পাইথন 3 এটি পূর্ণসংখ্যায় প্রসারিত করে: আপনার পূর্ণসংখ্যার পরিমাণ যত বড় হোক না কেন, আপনি একই ধরণের ব্যবহার করেন এবং কখনই জবরদস্তির বিষয়ে চিন্তা করেন না।

পাইথন সিনট্যাকটিক চিনি এড়াতে চেষ্টা করে। তবে কখনও কখনও এটি সুস্পষ্ট উপায়টিকে সুস্পষ্ট করার জন্য সিনট্যাকটিক চিনি যুক্ত করে। আপনি এর if foo is not Noneপরিবর্তে লিখতে পারেন if not (foo is None)কারণ 'নয়' বিশেষ-ক্ষেত্রেযুক্ত। তবুও foo is not Noneসহজেই পড়ে, ভুল ব্যাখ্যা করা যায় না, এবং আপনাকে ভাবতে হবে না, আপনি কেবল স্পষ্টতই লিখবেন write

অবশ্যই পাইথনের বেশিরভাগ জটিল জিনিস বিভিন্ন উপায়ে করা যেতে পারে। আপনি ক্লাসে ঘোষণার মাধ্যমে বা সাধারণ স্লট অ্যাসাইনমেন্ট দ্বারা পদ্ধতিগুলি যুক্ত করতে পারেন, আপনি বিভিন্ন ক্রিয়েটিভ পদ্ধতিতে ফাংশনগুলিতে যুক্তিগুলি পাস করতে পারেন, ইত্যাদি কারণ ভাষার অভ্যন্তরীণ অংশটি বেশিরভাগভাবেই প্রকাশিত হয়।

মূলটি হ'ল সর্বদা একটি উপায় যা সর্বোত্তম, কভার-সমস্ত ক্ষেত্রে সর্বাধিক হতে পারে। যদি অন্য উপায় বিদ্যমান থাকে তবে সেগুলি সমান বিকল্প হিসাবে (যেমন ifএবং unless) হিসাবে যুক্ত করা হয়নি তবে কেবল অভ্যন্তরীণ কাজগুলিই প্রকাশ করে ose আস্তে আস্তে কিন্তু অবিচলিতভাবে এই বিকল্পগুলি পরিচিত সেরা ব্যবস্থার উন্নতি করে অচল (মুছে ফেলা হয়নি!)।

সাজসজ্জাকারীরা এওপি ফাংশন কলগুলিকে মোড়ক করে। ২.6 এর আগে আপনাকে __metaclass__কোনও শ্রেণীর মেটাগ্লাস ঘোষণা করতে যাদু সদস্য ব্যবহার করতে হবে ; এখন আপনি এটির জন্যও একই সজ্জা সিনট্যাক্স ব্যবহার করতে পারেন। 3.0 এর পূর্বে আপনার কাছে দুটি ধরণের স্ট্রিং ছিল, বাইট-ওরিয়েন্টেড এবং ইউনিকোড, যা আপনি অজান্তেই মেশাতে পারেন। এখন আপনার কাছে একমাত্র ইউনিকোড strএবং একমাত্র বাইনারি-স্বচ্ছ bytes, যা আপনি ভুল করে মিশতে পারবেন না।


3
ঠিক একটি নোট হিসাবে, """মন্তব্য (ডকাস্ট্রিংস) ভুলবেন না । এই স্প্যান একাধিক লাইন।
অ্যাথাস্টার

8
ট্রিপল-উদ্ধৃত আক্ষরিকাগুলি কেবল স্ট্রিং, একক-উদ্ধৃত সমান, তবে রেসির অবসান ছাড়াই একাধিক লাইন বিস্তৃত করতে পারে। ঘোষণার পরে একটি স্ট্রিং আক্ষরিক অধিকার ডক স্ট্রিং হিসাবে বিবেচিত হয় এবং এটি কোনও মন্তব্য নয়, এটি সাধারণত __doc__বৈশিষ্ট্য হিসাবে অ্যাক্সেসযোগ্য ible তবে স্ট্রিংগুলি এমন একটি অঞ্চল যেখানে পাইথন অবশ্যই অনেকগুলি 'সঠিক উপায়' সরবরাহ করে: একক, দ্বিগুণ বা ট্রিপল উদ্ধৃতি ব্যবহার করুন, স্পষ্টভাবে সংলগ্ন আক্ষরিক সাথে যোগ দিন, rকাঁচা আক্ষরিক জন্য ব্যবহার করুন ইত্যাদি
9000

1
আমি মনে করি @ সিরিওনের মন্তব্য "একটি রেখা মন্তব্য করা হয়েছে কিনা তা আপনি সর্বদা স্থির করতে পারেন কিনা কেবল তা
দেখেই

2
"এটি পাইথনের উত্সকে পার্সিং করা মানুষের পক্ষে সহজ করে তোলে" " <- এটি বিষয়গত
জিগি

কীভাবে মেটাক্লাসের ঘোষণাটি ২.7 এ পরিবর্তন হয়েছিল? মেটাক্লাসগুলির জন্য 2.7 ডক্সে সজ্জিত প্যাটার্নটি খুঁজে পাচ্ছেন না।
নিক

10

আরেকটি উদাহরণ
len()হ'ল : প্রতিটি অনুক্রমে উপস্থিত একটি পদ্ধতির পরিবর্তে একটি ফাংশন; যদি আপনি জাভা সঙ্গে তুলনা আপনি .length, .size(), .getSize(), এবং অন্যান্য পদ্ধতি একটি ক্রমানুসারে উপাদানের সংখ্যা খুঁজে পেতে।

আরেকটি উদাহরণ যে নেই .join()একটি হল stringপদ্ধতি, না যে ক্রমানুসারে একটি পদ্ধতি তালিকা। যোগদানের প্যারামিটারগুলি কোনও তালিকা, একটি সেট, একটি উপলব্ধি, বা যাই হোক না কেন, এটি কার্যকর হবে কিনা তা আপনার জানতে হবে না।


8

সিতে ভেরিয়েবলের মান এক করে বাড়ানোর সম্ভাব্য অনেকগুলি উপায় রয়েছে:

i++     // Post-increment, returns the number before the increment
++i     // Pre-increment, returns the number after the increment
i += 1 

প্রতিটির মান বাড়িয়ে শেষ iহয় 1তবে প্রতিটি কিছুটা আলাদা।

পাইথনে সত্যিই কেবল একটি উপায় আছে; শুধু একটি যোগ করুন।

i += 1

এটি করার জন্য একাধিক সিনথেটিকভাবে বৈধ উপায় রয়েছে (যেমন i = i + 1), আপনি একই পার্শ্ব প্রতিক্রিয়া সহ একই কাজ করছেন।


1
আমি কোনও বিশেষজ্ঞ নই, তবে এই উদাহরণটি "এটি করার একমাত্র উপায়" ধারণাটি অবিকলভাবে লঙ্ঘন করেছে বলে মনে হচ্ছে। এটি করার আমাদের দুটি উপায় আছে তবে এটি আরও স্পষ্টভাবে কী? আমার দৃষ্টিতে প্রথম উদাহরণটি আরও স্পষ্ট যখন দ্বিতীয়টি কিছুটা বেশি পরিশ্রদ্ধ তবে কোনও প্রোগ্রামার যিনি খুব বেসিকের বাইরে অগ্রগতি করেছেন তার কাছে কম পাঠযোগ্য বা স্পষ্ট নয়। আপনার উত্তরের জন্য আপনাকে ধন্যবাদ - এটি চিন্তার জন্য ভাল খাবার।
চার্লস রোপার

@ পিটার (এবং @ চারেলস): আসলে i = i + 1অ্যাসাইনমেন্ট, কোনও ইনক্রিমেন্ট নয়। পাইথনে একটি ইনক্রিমেন্ট হয় i += 1। সি-শৈলী ভাষায় আপনি লিখতে পারেন i++, ++iএবং i += 1
জোশ কে

2
আপনার "প্রচুর বিভ্রান্তি" মন্তব্য সম্পর্কে নিশ্চিত নন, আপনার সি সি তিনটি i += 1উদাহরণই (আপনি মিস করেছেন , বিটিডাব্লু) ঠিক একই ফলাফল প্রকাশ করে। আমি যখন দেখি লোকেরা তখনই বিভ্রান্ত হয়ে পড়ে থাকে যখন তারা বৃহত্তর অভিব্যক্তির অংশ হিসাবে কোনও পরিবর্তন-পূর্ব-বা উত্তরোত্তর পোস্টের পরে থাকে এবং ভাষা রেফারেন্সের যথাযথ বিভাগটি পড়ে এটি সাধারণত দ্রুত সংশোধন করা হয়। ব্যক্তিগতভাবে, আমি এই সত্যটি গ্রহণ করেছি যে আপনি উভয় দ্বারা স্ট্রিংয়ের পঞ্চম চরিত্রটি উল্লেখ করতে পারেন str[4]বা *(str+4), তবে এটি খুব সহজ ছিল ...
টিএমএন

2
@ টিএমএন: কিছু ক্ষেত্রে যেমন max(i++, ++i)দ্রুত সংশোধন করা যায় না। সি এর অনেকগুলি "অপরিজ্ঞাত" এবং "বাস্তবায়ন-নির্ভর" আচরণের কেস রয়েছে, সবগুলি একটি ভাল কারণে - তবে প্রত্যেকেই একটি সমস্যা তৈরি করতে পারে।
9000

@ টিএমএন: 4 [টিআরআর] উল্লেখ না করা (সিতে বৈধ, সি ++ এ বৈধ হতে পারে না)।
ভ্যাটাইন

6

আরেকটি সম্ভাবনা তালিকার বোধগম্যতা হতে পারে। পাইথনে, আপনি এটি করতে পারেন:

new_list = []
    for item in list_of_items:
       if item < 10:
           new_list.append(item)

তবে এটি করার "সুস্পষ্ট" উপায় (যদি আপনি ডাচ হন বা পাইথনের সাথে আরও পরিচিত হন) এটি তালিকা বোধের সাথে হবে:

new_list = [item for item in list_of_items if item < 10]

এটি সংক্ষিপ্ত, নতুন তালিকাটি এক ধাপে তৈরি করা হয়েছে, এটি আমার বিশ্বাসের চেয়ে দ্রুত চলে, এবং এটি মার্জিত। নেতিবাচক দিক থেকে, কেউ তর্ক করতে পারে এটি কম স্পষ্ট বোধ করে, তবে আমি মনে করি আপনি একবার অভ্যস্ত হয়ে উঠলে এটি ঠিক তেমন স্পষ্ট।


ইন্ডেন্টেশন এবং কোডের জন্য: 4 টি স্পেস দিয়ে এটিকে প্রিপেন্ড করুন, তারপরে এটি ইনডেন্টেশনকে সম্মান করবে।
ইনকা 17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.