পাইথনের মানগুলি ফেরত দেওয়ার জন্য কীভাবে আমি নামকরণ করব?


13

পাইথনে আমার ফাংশনগুলির জন্য নাম নির্বাচন করা সম্পর্কে আমি বিভ্রান্ত । কখনও কখনও পাইথন অন্তর্নির্মিত ফাংশনগুলি আবশ্যক যেমন: printফাংশন এবং স্ট্রিং পদ্ধতি find। কখনও কখনও তারা যেমন হয় না: উদাহরণস্বরূপ, lenএর নামটি অত্যাবশ্যক নয় calculate_lenএবং typeহয় না find_type

আমি বুঝতে পারি যে এমন printকোনও মান প্রদান করে যা আমরা ব্যবহার করি না (অর্থাত্ None) এবং কিছু করে (যেমন এটি স্ক্রিনে একটি স্ট্রিং দেখায়), সুতরাং এর নামটি আবশ্যক।

তবে lenআমরা ব্যবহার করি এবং কিছু করি এমন একটি মূল্য ফেরত দেয় (যেমন একটি ক্রম বা ম্যাপিংয়ে কতগুলি আইটেম রয়েছে তা গণনা করে) এবং এর নামটি অতীব জরুরি নয় । অন্যদিকে, findস্ট্রিং পদ্ধতি (হিসাবে len) একটি মান দেয় যা আমরা ব্যবহার করি এবং কিছু করি এবং এর নামটি আবশ্যক

এই প্রশ্নটি জিজ্ঞাসা করার ফলে আমি সিজার সাইফারটি পর্যালোচনা করার জন্য এনক্রিপ্ট এবং ডিক্রিপ্ট স্ট্রিং এ একটি স্ক্রিপ্ট রেখেছি। পর্যালোচক বলেছেন যে:

কেবল অন্ত্রের অনুভূতি: ফাংশনগুলি স্টাফ করে। সুতরাং একটি ফাংশন জন্য একটি ভাল নাম একটি আবশ্যক: আমি rotate_letterপরিবর্তে ব্যবহার করতে হবে rotated_letter

rotated_letterএকটি সংখ্যা দ্বারা আবর্তিত একটি বর্ণকে উপস্থাপন করে একটি একক-বর্ণের স্ট্রিং প্রদান করে। আমি যা উত্তম জানি না, আমি ব্যবহৃত rotated_letterযেমন একটি মান ফেরায়, মত randintফাংশন র্যান্ডম মডিউল , তাই নয় কি generate_randint

সুতরাং, এই ক্ষেত্রে, আমি কীভাবে কোনও ফাংশনটির নামকরণ করব যা ব্যবহারের জন্য কোনও মান ফেরত দেয়? আমি কি নামটি জরুরী বা একটি বিশেষ্য করে তুলি ? অন্যান্য ক্ষেত্রে এটি কীভাবে করা যায় তা স্পষ্ট যেমন যেমন বুলিয়ান ফাংশন , is_evenএবং is_palindromeআমরা কেবল এটি হ্যাঁ / কোনও প্রশ্নের মতোই করি না, এবং এমন ফাংশনগুলিও যা কেবল ব্যবহৃত হয় না এবং ব্যবহৃত হয় না যেমন মানগুলি (যেমন None) printএবং তালিকা পদ্ধতির তালিকা করে থাকে sort


এটি ফাংশনটির নামকরণের সময় অনিবার্যতা ব্যবহার করার জন্য একটি খুব সাধারণ অভ্যাস (আমি একটি সম্মেলন বলব)। উদাহরণস্বরূপ আপনি কীভাবে এমন একটি চলকের নাম রাখবেন যা ফাংশনটির ঘোরানো অক্ষরটি ঘোরানো_লেটার সংরক্ষণ করে?
জুলিনরউজ

এটি আপনার কয়েকটি উদাহরণের চিন্তা করার ভাল উপায় নয়। lenউদাহরণস্বরূপ, "দৈর্ঘ্য" হিসাবে ভাল ধারণা করা - আপনি তার যুক্তির একটি মেটা-স্তরের বর্ণনা পেয়ে যাচ্ছেন।
ইজকাটা

উত্তর:


10

যুক্তিযুক্ত, ক্রিয়াপদ ব্যবহার করুন যেখানে সংক্ষিপ্ত এবং দ্ব্যর্থহীন হয় ou

বেশিরভাগ সময়, ফাংশনগুলি (আবশ্যক) ক্রিয়াগুলি এবং শ্রেণি, ভেরিয়েবল এবং পরামিতি বিশেষ্য হওয়া উচিত। গুণাবলী এছাড়াও বিশেষ্য হওয়া উচিত, ব্যবহার করে তৈরি করা সহ @property। এটি বিশেষত ফাংশনগুলির ক্ষেত্রে যার পার্শ্ব প্রতিক্রিয়া রয়েছে for [1] যদি কোনও ফাংশন কিছু ফিরিয়ে দেয় তবে ক্রিয়াপদটি কিছু যুক্ত করে বা কেবল "শব্দ" হয় তা আপনার মূল্যায়ন করতে হবে:

  • make_list(foo)বনাম list(foo): বিশেষ্যটি ক্রিয়াপদের চেয়ে পড়া সহজ is এছাড়াও, listআসলে একটি শ্রেণি, এবং ক্লাসগুলি বিশেষ্য হওয়া উচিত।
  • open(foo)বনাম file(foo): ক্রিয়াপদটি বিশেষ্যটির চেয়ে পড়া সহজ, এবং এটি একটি বিশেষ্যর চেয়ে ক্রিয়াপদকে "বিকল্পগুলি" দেওয়ার আরও বেশি অর্থবোধ করে, সুতরাং বিশেষ্যটি পাইথন 3-এ সরানো হয়েছিল open()কেবল "মানক" [2] উপায় হিসাবে পাইথন 3 এ ফাইল অবজেক্ট তৈরি করতে।
  • foo.get_bar()বনাম foo.bar()বনাম foo.bar(ধরে নেওয়া fooএবং barউভয় বিশেষ্য): প্রথম বিকল্পটি ঠিক আছে, কারণ "গেট" এমন কিছু যুক্ত করে না যা আমরা ইতিমধ্যে জানতাম না। দ্বিতীয় উপযুক্ত একটি পেয়ে barএকটি আউট fooএকটি সম্ভাব্য ব্যয়বহুল অপারেশন এবং / অথবা পার্শ্ব প্রতিক্রিয়া (আপনি বিবেচনা করতে পারেন বহন করে Bar(foo)যদি Barএকটি বর্গ যায়)। তৃতীয়টি উপযুক্ত যদি কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই সস্তা অপারেশন হয় এবং বিকল্প বাস্তবায়নগুলি ব্যয়বহুল হওয়ার সম্ভাবনা কম
  • xs.sort()বনাম sorted(xs)যদি xsএকটি তালিকা হয়: প্রথমটি আবশ্যক: তালিকাটি বাছাই করুন। এটি তালিকায় স্থান পরিবর্তন করে কিছু দেয় না। দ্বিতীয়টি হ'ল ঘোষিত: একটি তালিকা যা বাছাই করা হয়, যা অবিকল তা ফিরে আসে। দুটোই ক্রিয়াপদ।

[1]: সাধারণত কোনও মান ফেরত দেওয়া এবং পার্শ্ব প্রতিক্রিয়াগুলি পারস্পরিক একচেটিয়া হয় যদি না আপনার কাছে সেগুলি একত্রিত করার কোনও বাধ্যতামূলক নকশার কারণ থাকে। সুতরাং একটি ফাংশন যার পার্শ্ব প্রতিক্রিয়া রয়েছে সম্ভবত কিছু ফিরে না আসা উচিত এবং তাই এটি একটি বিশেষ্য তৈরি করা খুব সামান্য অর্থবোধ করে।
[২]: ioমডিউলে কিছু নিম্ন-স্তরের অপারেশন রয়েছে যা ফাইল বাফারিং, স্বয়ংক্রিয় পাঠ্য এন / ডিকোডিং ইত্যাদি যুক্ত করতে বা অপসারণ করতে ব্যবহার করা যেতে পারে এবং এগুলি বেশিরভাগ বিশেষ্য কারণ এটি বস্তু-ভিত্তিক শ্রেণি। বেশিরভাগ ব্যবহারকারীর সরাসরি এই জিনিসগুলি নিয়ে খেলতে হবে না; পরিবর্তে, open()একটি উপযুক্ত শ্রেণি চয়ন করে এবং এটি স্বয়ংক্রিয়ভাবে ইনস্ট্যান্ট করে।


ধন্যবাদ! ইন " foo.get_bar() vs.` foo.bar ()` বনাম foo.bar" এর মধ্যে পার্থক্য কি দ্বিতীয় এবং তৃতীয় ?
মাহমুদ মুহাম্মদ নাগীব

তৃতীয়টি হয় সম্পত্তি বা একটি খালি বৈশিষ্ট্য। দ্বিতীয়টি একটি পদ্ধতি।
কেভিন

সুতরাং, যদি আমি বুঝতে পারি, এটি rotated_letterআবশ্যক না করা এবং এটি ঘোষণামূলক হিসাবে রাখা ঠিক হবে, তাই না?
মাহমুদ মুহাম্মদ নাগিব

এক্ষেত্রে আমি নিশ্চিত নই যে letterপ্রসঙ্গ দ্বারা জড়িত কিনা ।
কেভিন

উল্লেখ করার জন্য +1 listএকটি শ্রেণি
দ্বুয়ান মাআর

0

rotated_letterএকটি পদ্ধতির মত দেখাচ্ছে না। এটি একটি সম্পত্তি মত দেখাচ্ছে। যার অর্থ প্রথম ধারণাটি হ'ল:

var letter = caesar.rotated_letter

আশা letterএকটি ফাংশন টাইপ স্ট্রিং একটি মান, না ধারণ করে। সেখান থেকে আপনি হয় আলাদা নাম বেছে নিয়েছেন, যেমন:

def rotate_letter(self):
    pass

অথবা আপনি পরিবর্তে একটি সম্পত্তি ব্যবহার:

@property
def rotated_letter(self):
    return self.whatever

lenএবং typeএর নামকরণ করা হয়েছে কারণ অন্য কোনও নাম টাইপ করতে দীর্ঘ হবে। এগুলি প্রচুর ব্যবহৃত হয় এবং তাদের মূল পাইথন ফাংশনগুলির একটি বিশেষ মর্যাদা রয়েছে যা প্রতিটি পাইথন প্রোগ্রামার যেভাবেই শিখতে পারে, তাদের নাম তৃতীয় পক্ষের লাইব্রেরির নামের চেয়ে অনেক বেশি অপ্রাসঙ্গিক করে তোলে।

lenবিশেষত, আপনার কোডে আপনার যা করা উচিত নয় তার একটি উত্তম উদাহরণ : আপনি সম্পূর্ণ নাম যেমন length(সংক্ষিপ্ত ফর্মটি খুব জনপ্রিয় না হলে, যেমন max) ব্যবহার করবেন এবং যেমন একটি ক্রিয়া ব্যবহার করবেন বলে আশা করা যায় compute_length। বা এটি সম্পত্তি হতে পারে: len([1, 5, 6])হয়ে যায় [1, 5, 6].length। উদাহরণস্বরূপ, C #, পরে ফর্ম ব্যবহার করা হয়: new [] { ... }.Length

নোট করুন যে এর জন্য historicalতিহাসিক কারণগুলিও থাকতে পারে len: অন্যান্য ভাষা যেমন সি #, পছন্দসই Count, যা সাধারণত একটি পদ্ধতি (যদিও আচরণটি দুর্ভাগ্যক্রমে .NET ফ্রেমওয়ার্কের মাধ্যমে বেমানান হয়)। Countএকটি ক্রিয়াপদ, তাই স্বজ্ঞাতভাবে, আপনি এটি একটি পদ্ধতি হিসাবে প্রার্থনা করতে প্রবণ হন।

মানগুলি ফিরিয়ে দেওয়া বা কোনও ক্রিয়া সম্পাদন করা

একটি ক্রিয়াটি সর্বদা একটি ক্রিয়া সম্পাদন করে বলে আশা করা যায়। এটি যদি সবেমাত্র একটি মান ফেরত দেয় তবে এটি সম্পত্তি হতে হবে। আপনার একটি ইঙ্গিত রয়েছে যে ফাংশনটি একটি সম্পত্তিতে রূপান্তরিত হওয়া উচিত যখন:

  • ফাংশনটিতে সবেমাত্র একটি return ...বিবৃতি থাকে,

  • ফাংশনের নাম যা আপনার মনের মধ্যে স্বাভাবিকভাবেই আসে get_somethingহিসাবে, product.get_price()

এখন, যদি আপনার কোনও ফাংশন থাকে তবে এটি চার ধরণের একটি হতে পারে:

  • এটি খাঁটি হতে পারে, এটি পরিবেশকে প্রভাবিত না করেই কোনও মূল্য ফেরত দেয়। উদাহরণ: road.measure_distance()

  • এটি কিছু না ফিরিয়ে পরিবেশকে প্রভাবিত করতে পারে। উদাহরণ: product_database.remove_record(1234)

  • এটি পরিবেশকে প্রভাবিত করতে পারে এবং একটি মান ফেরত দিতে পারে। উদাহরণ: value.increment()যেমন ব্যবহৃত value++

  • এটি কিছুই করতে পারে এবং কিছুই ফিরিয়ে দিতে পারে না। উদাহরণ: time.sleep(1)

এমন কয়েকটি ক্ষেত্রে রয়েছে যেখানে নামটি ফাংশনের ধরণ সম্পর্কে দৃ h় ইঙ্গিত দিতে পারে তবে বেশিরভাগ ক্ষেত্রে, আপনি নামটি সুনির্দিষ্টভাবে জানতে পারবেন না।


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

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