functools.partial
ল্যাম্বডাসের মাধ্যমে আপনি কী পেতে পারবেন না এমন কোন কার্যকারিতা উপলব্ধ করে ?
অতিরিক্ত কার্যকারিতার দিক থেকে খুব বেশি নয় (তবে পরে দেখুন) - এবং, পাঠযোগ্যতা দর্শকের চোখে পড়ে।
বেশীরভাগ মানুষই যারা কার্যকরী প্রোগ্রামিং ভাষা (বিশেষ করে পাতার মর্মর / স্কীম পরিবারের মধ্যে যারা) সাথে পরিচিত পছন্দ করে বলে মনে হচ্ছে lambda
শুধু জরিমানা - আমি বলতে "সবচেয়ে", স্পষ্টভাবে না সব, কারণ গাইডো এবং আমি নিঃসন্দেহে "সঙ্গে পরিচিত" মধ্যে হয় (ইত্যাদি ) তবুও lambda
পাইথনকে চোখের ব্যঙ্গ হিসাবে ভাবুন ...
তিনি কখনও এটিকে পাইথন হিসাবে গ্রহণ করার জন্য অনুতপ্ত ছিলেন এবং "পাইথনের গ্লিটস" হিসাবে এটি পাইথন 3 থেকে অপসারণের পরিকল্পনা করেছিলেন।
আমি তাকে পুরোপুরি সমর্থন করেছি। (আমি lambda
স্কিমের সাথে ভালবাসি ... পাইথনের ক্ষেত্রে এর সীমাবদ্ধতা এবং অদ্ভুত উপায়ে এটি ঠিক করেনি ' বাকী ভাষার সাথে আমার ত্বককে ক্রল করুন)।
তবে তা নয়, lambda
প্রেমীদের দল হিসাবে - যারা পাইথনের ইতিহাসে দেখা বিদ্রোহের নিকটতম বিষয়গুলির মধ্যে একটি করেছিলেন, যতক্ষণ না গুইদো পিছনে পড়ে এবং সেখানে যাওয়ার সিদ্ধান্ত না নেয় lambda
। এর মধ্যে
বেশ কয়েকটি সম্ভাব্য সংযোজন functools
(ফাংশনগুলি ফিরিয়ে দেওয়ার, পরিচয়, ইত্যাদি) ঘটেনি (স্পষ্টভাবে আরও বেশি lambda
কার্যকারিতা ডুপ্লিকেট এড়াতে ), যদিও partial
অবশ্যই তা থেকে যায় (এটি মোট নকল নয়, এটি চোখের দর্শন নয়)।
মনে রাখবেন যে lambda
এর শরীরটি একটি অভিব্যক্তি হিসাবে সীমাবদ্ধ , তাই এটি সীমাবদ্ধতা পেয়েছে। উদাহরণ স্বরূপ...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
ফেরত ফাংশনটি অন্তঃসংশোধনের জন্য দরকারী বৈশিষ্ট্যগুলিতে সজ্জিত - এটি যে মোড়কযুক্ত ফাংশন, এবং এতে অবস্থানগত এবং নাম যুক্তিগুলি এটি সংশোধন করে। তদ্ব্যতীত, নামযুক্ত যুক্তিগুলি ঠিক পিছনে ওভাররাইড করা যেতে পারে ("ফিক্সিং" বরং এক অর্থে ডিফল্টগুলির সেটিং):
>>> f('23', base=10)
23
সুতরাং, যেমন আপনি দেখতে পাচ্ছেন, এটি নির্ধারণযোগ্যভাবে এতটা সরল নয় lambda s: int(s, base=2)
! -)
হ্যাঁ, আপনি পারে আপনার ল্যামডা কোঁচকানো আপনি এই কিছু দিতে - শব্দ-অগ্রাহ্য জন্য, যেমন,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
তবে আমি সত্যিই আশা করি যে সবচেয়ে উত্সাহী- lambda
লেভারও এই ভয়াবহতাটিকে partial
কলটির চেয়ে বেশি পঠনযোগ্য বলে মনে করেন না ! -)। "অ্যাট্রিবিউট সেটিং" অংশটি আরও শক্ত, কারণ পাইথনের "দেহের একক অভিব্যক্তি" সীমাবদ্ধতার কারণে lambda
(অ্যাসাইনমেন্টটি কখনই পাইথন এক্সপ্রেশনের অংশ হতে পারে না) ... আপনি "এক্সপ্রেশনের মধ্যে নকল অ্যাসাইনমেন্টগুলি" শেষ করেন তালিকা বোধগম্যতা এর নকশার সীমা ছাড়িয়েও প্রসারিত করে:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
এখন একটি একক অভিব্যক্তি মধ্যে নামে-আর্গুমেন্ট overridability, প্লাস তিন গুণাবলীর সেটিং একত্রিত করা, এবং আমাকে বলুন ঠিক কিভাবে পাঠযোগ্য যে হতে যাচ্ছে ...!
functools.partial
যে আপনার উল্লেখ করা অতিরিক্ত ক্রিয়াকলাপটি এটিকে ল্যাম্বদার চেয়ে উচ্চতর করে তোলে। সম্ভবত এটি অন্য পোস্টের বিষয়, তবে এটি এমন একটি ডিজাইন স্তরের কী যা আপনাকে এতটা বিরক্ত করেlambda
?