ল্যাম্বডায় অ্যাসাইনমেন্টের জন্য পাইথন ওয়ার্কআরাউন্ডস


34

পাইথনে গল্ফ করার জন্য এটি একটি টিপস প্রশ্ন।

পাইথন গল্ফিংয়ে, লাম্বদা হিসাবে সংজ্ঞায়িত ফাংশন হিসাবে জমা দেওয়ার পক্ষে এটি সাধারণ common উদাহরণ স্বরূপ,

f=lambda x:0**x or x*f(x-1)

x এর ফ্যাক্টরিয়াল গণনা করে

ল্যাম্বডা ফর্ম্যাটটির দুটি বড় সুবিধা রয়েছে :

  • এর boilerplate, f=lambda x:...বা lambda x:...তুলনায় খাটো def f(x):...return...বাx=input()...print...
  • একটি পুনরাবৃত্ত কলটি অল্প বাইট ওভারহেডের সাথে লুপ করতে ব্যবহৃত হতে পারে।

যাইহোক, ল্যাম্বডাসের কাছে কেবলমাত্র একটি একক অভিব্যক্তি, কোনও বিবৃতি দেওয়ার অনুমতি দেওয়ার বড় অসুবিধা রয়েছে। বিশেষত, এর অর্থ কোনও অ্যাসাইনমেন্ট নেই c=chr(x+65)। এটির ক্ষেত্রে সমস্যাটি হয় যখন কারও মধ্যে দীর্ঘ অভিব্যক্তি থাকে যার মান দুবার উল্লেখ করা (বা আরও)।

E=enumerateকার্যবিধির বাইরে বা argumentচ্ছিক আর্গুমেন্ট হিসাবে এই জাতীয় কার্যভারগুলি সম্ভব, তবে কেবলমাত্র যদি তারা ফাংশন ইনপুটগুলির উপর নির্ভর না করে। f=lambda n,k=min(n,0):...ব্যর্থ যেমন ption চ্ছিক যুক্তি কারণ সংজ্ঞা সময় nযখন kমূল্যায়ন করা হয় ইনপুট সংজ্ঞায়িত করা হয় নি ।

ফলস্বরূপ যে কখনও কখনও আপনি একটি ল্যাম্বডায় একটি দীর্ঘ অভিব্যক্তি পুনরাবৃত্তি স্তন্যপান কারণ বিকল্পটি একটি দীর্ঘ অ ল্যাম্বদা হয় da

lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]

বিরতি এমনকি পয়েন্টটি প্রায় 11 টি অক্ষর ( বিশদ ), অতীতে যা আপনি একটি defবা স্যুইচ করেন program। পুনরাবৃত্তি প্রকাশের জন্য এটিকে সাধারণ ব্রেক-সমান দৈর্ঘ্যের 5 এর সাথে তুলনা করুন:

range(a)+range(b)
r=range;r(a)+r(b)

print s[1:],s[1:]*2
r=s[1:];print r,r*2

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


পাইথন গল্ফারের পক্ষে এই সীমাবদ্ধতাটি কাটিয়ে ওঠার উপায় কী কী? ল্যাম্বডায় দু'বার দীর্ঘ অভিব্যক্তি পুনরাবৃত্তি করতে দেখলে তাদের কোন সম্ভাব্য ধারণাগুলি মনে রাখা উচিত?

এই টিপস প্রশ্নটির সাথে আমার লক্ষ্য হ'ল এই সমস্যার গভীর গভীরতা ডুবানো এবং:

  • একটি ল্যাম্বদার ভিতরে জাল কার্যভারের জন্য গল্ফিং ওয়ার্কআউন্ডের তালিকাভুক্ত এবং বিশ্লেষণ করুন
  • আরও ভাল পদ্ধতির জন্য নতুন সীসা এক্সপ্লোর করুন

প্রতিটি উত্তরের একটি কার্যকরী বা সম্ভাব্য সীসা ব্যাখ্যা করা উচিত।


আমি অনুমান করছি যে পাইথনগুলিতে এটি ভালভাবে করা যায় না of জাভাস্ক্রিপ্ট এর একটি লেগ আপ আছে।
mbomb007

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

2
বিপরীত ছোট হাতের স্ট্রিং সংমিশ্রনের সাথে দেওয়া সঠিক উদাহরণের জন্য কেবল সন্ধান করা যেতে পারে lambda s:(s+s[::-1]).lower()। অবশ্যই এটি আসল প্রশ্নের উত্তর দেয় না।
জোনাথন অ্যালান

@ জোনাথান অ্যালান ভালো পয়েন্ট, এটিকে পরিবর্তন করেছেন strip
xnor

উত্তর:


6

eval

এটি নিজের মধ্যে এটি দুর্দান্ত নয়, তবে যদি আপনার সমাধানটি ইতিমধ্যে evalকোনও উপায়ে বা আকারে ব্যবহার করে তবে আপনি সাধারণত এই কৌশলটি ব্যবহার করতে পারেন।

eval("%f*%f+%f"%((5**.5,)*3))

বাহ, স্মার্ট! আমি কেন এই ধরণের কোডটি কখনও দেখি না?
z0rberg এর

6
@ z0rberg এর সম্ভবত কারণ evশালটি মন্দ।
হাইপারনিউট্রিনো

আমি এই কোডিজমে সাবস্ক্রাইব করি না। # এভালইভিওস ম্যাটার ... তবে গম্ভীরভাবে, সরল ডিএল-ইনজেকশন থেকে খারাপ কী করে?
z0rberg এর

6

পাইথন ৩.৮ এ অ্যাসাইনমেন্ট এক্সপ্রেশন

পাইথন ৩.৮ ( টিআইও ) অ্যাসাইনমেন্ট এক্সপ্রেশনগুলি উপস্থাপন করে যা :=এক্সপ্রেশনর অংশ হিসাবে ভেরিয়েবল ইনলাইন নির্ধারণ করতে ব্যবহার করে।

>>> (n:=2, n+1)
(2, 3)

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

lambda s:(t:=s.strip())+t[::-1]
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();return t+t[::-1]

আরও জন্য এই টিপ দেখুন।


2

ইনার ল্যাম্বডাস as

এগুলি আপনাকে একবারে একাধিক ভেরিয়েবল সংজ্ঞায়িত করতে দেয়।

lambda s:s.strip()+s.strip()[::-1]

বনাম

lambda s:(lambda t:t+t[::-1])(s.strip())

অনেক দীর্ঘ, তবে আপনার যদি একাধিক ভেরিয়েবল বা লম্বা লম্বা ভেরিয়েবল থাকে যা বহুবার পুনরাবৃত্তি হয়:

lambda a,b,c:a.upper()*int(c)+b.lower()*int(c)+a.upper()[::-1]+b.lower()[::-1]+a.upper()*int(c)+a.lower()*int(c)

বনাম

lambda a,B,c:(lambda A,b,n:A*n+b*n+A[::-1]+b[::-1]+A*n+b*c)(a.upper(),B.lower(),int(c))

চরিত্রের গণনা

প্রাথমিক: (lambda:)()(11 বাইট)
প্রথম পরিবর্তনশীল: [space]a(2 বাইট)
পরবর্তী ভেরিয়েবল: ,b,(3 বাইট)
ব্যবহার: a(1 বাইট)

(lambda* a*_,b_:)(*<value a>*_,<value b>_)

(বন্ধনীগুলিতেও সঞ্চয় করে)

সুতরাং, এটি 3n + 10বাইট নেয় , যেখানে nভেরিয়েবলের সংখ্যা। এটি একটি উচ্চ প্রাথমিক ব্যয়, তবে শেষ পর্যন্ত পরিশোধ করতে পারে। এমনকি এটি এর অভ্যন্তরীণ মানটিও ফিরিয়ে দেয়, যাতে আপনি একাধিক বাসা বাঁধতে পারেন (যদিও এটি দ্রুত এটি মূল্যবান হয়ে উঠবে না))

নেস্টেড তালিকা বোঝার ক্ষেত্রে এটি কেবলমাত্র মধ্যবর্তী গণনার জন্য দরকারী, কারণ def f():a=...;b=...;returnসাধারণত উইলটি সংক্ষিপ্ত হবে।

1 টি মানের জন্য, এটি সংরক্ষণ করে: uses * length - length - uses - 13তাই কেবল তখনই কার্যকর যখন অভিব্যক্তিটি ইতিবাচক হয়। মোট ব্যবহৃত বিভিন্ন সময় প্রকাশের
জন্য , যেখানে তাদের সম্মিলিত দৈর্ঘ্য , এটি সংরক্ষণ করে:nul
l - (3 * n) - u - 10 ( + brackets removed )


1

একটি তালিকা ব্যবহার করুন

প্যারামিটার হিসাবে একটি তালিকা ঘোষণা করুন এবং .append() orমান সংরক্ষণ করতে ব্যবহার করুন :
lambda s:s.lower()+s.lower()[::-1]
রূপান্তরিত হয়
lambda s,l=[]:l.append(s.lower())or l[-1]+l[-1][::-1]

চরিত্র গণনা:

,l=[]5 টি অক্ষর
l.append()or13
l[-1]ব্যবহারের প্রতিটি অক্ষরের জন্য 5 অক্ষর

বিরতি এমনকি

যোগ করা চরিত্রের পরিমাণ হ'ল:
uses*(5-length) + 18 + length
পূর্ববর্তী উদাহরণে বিবৃতিটি s.lower()9 টি অক্ষর দীর্ঘ এবং 2 বার ব্যবহৃত হয়, এই কৌশল প্রয়োগ করে 19 টি অক্ষর যুক্ত হয়েছে। যদি এটি 7 বার ব্যবহার করা হয় তবে 1 টি চরিত্র হ্রাস হবে।
এই কৌশলটিতে ন্যূনতম ব্যবহারের পরিমাণ হ'ল
min_uses = (18+length)/(length-5)

upsides

  • সামান্য হ্রাস ব্যয়ে নতুন অ্যাসাইনমেন্টের অনুমতি দিন (তালিকাটি ইতিমধ্যে ঘোষণা করা হয়েছে)
  • একটি হল listবস্তুর তাই [0], .pop(), [x:y]এবং অন্যান্য তালিকা ফাংশন ঠাট জন্য ব্যবহার করা যাবে। অত্যন্ত পরিস্থিতিগত

downsides

  • উচ্চ প্রাথমিক ব্যয়
  • উচ্চ ব্যবহারের ব্যয়
  • কেবল দৈর্ঘ্যের চেয়ে বেশি ব্যবহারের জন্য কাজ করে 5

অভিধান ব্যবহার করো

ধন্যবাদ @Zgarb
উপরে ঘোষণা হিসাবে একই ধারণা পরামিতি এবং ব্যবহার হিসাবে একটি অভিধান .setdefault()দোকান (এবং আগমন) মান:
lambda s:s.lower()+s.lower()[::-1]
মধ্যে সক্রিয়
lambda s,d={}:d.setdefault(0,s.lower())+d[0][::-1]
উল্লেখ্য, অসদৃশ listপ্রতিরুপ, setdefaultনির্ধারিত মান ফেরায়।

চরিত্র গণনা:

,d={}প্রতিটি ব্যবহারের জন্য 5 টি অক্ষর
d.setdefault(k,)16 অক্ষর
d[k]4 অক্ষর

বিরতি এমনকি

যোগ করা চরিত্রের পরিমাণ হ'ল:
(uses-1)*(4-length) + 21
পূর্ববর্তী উদাহরণে বিবৃতিটি s.lower()9 টি অক্ষর দীর্ঘ এবং 2 বার ব্যবহৃত হয়, এই কৌশল প্রয়োগ করে 16 টি অক্ষর যুক্ত হয়েছে। যদি এটি 7 বার ব্যবহার করা হয় তবে 1 টি চরিত্র হ্রাস হবে।
এই কৌশলটিতে ন্যূনতম ব্যবহারের পরিমাণ হ'ল
min_uses = 1-21/(4-length)

Upsides / downsides

  • মূলত তালিকার মতোই
  • কেবল দৈর্ঘ্যের চেয়ে বেশি ব্যবহারের জন্য কাজ করে 4

অন্যান্য বিবেচ্য বিষয়

  • চরিত্র হ্রাস করার জন্য যদি এই কৌশলটি কার্যকর হয় তবে lambdaসম্ভবত এটি বাদ দেওয়া যেতে পারে এবং একটি সংক্ষিপ্ত প্রোগ্রামের জন্য def/ দিয়ে ফাংশনটি আবারও লেখা যেতে পারে input
  • @ ফ্লিপট্যাক নির্দেশিত হিসাবে , তালিকা এবং ডিকেশন ফাংশন কলগুলির মধ্যে রাখে , যদিও এটি বেশিরভাগ ক্ষেত্রে বিরক্ত করবে, এটি পুনরাবৃত্ত কলগুলিতে ব্যবহার করা যেতে পারে। আবার অত্যন্ত পরিস্থিতিগত
  • অভিধানটি সর্বদা তালিকার চেয়ে কম হবে।

3
ফাংশন সাবমিশনগুলি একাধিকবার ব্যবহারযোগ্য হতে হবে। লাম্বদাটি চালানোর সময় বর্তমানে এটি একই তালিকা ব্যবহার করে যা পরবর্তী সময়ে চালানো জিনিসগুলিতে বিশৃঙ্খলা সৃষ্টি করতে পারে।
ফ্লিপট্যাক

@ ফ্লিপট্যাক আগ্রহের বাইরে, আপনি কি মেটার মতো উত্সকে যুক্ত করতে কিছু মনে করবেন? আমি মনে করি যে নিয়মটি আমার জানা কয়েকটি কৌশলতে কিছুটা প্রভাব ফেলতে পারে।
জেএডি


আমি মনে করি আপনি একটি অভিধান দিয়ে আরও ভাল করতে পারবেন: lambda s,d={}:d.setdefault(0,s.lower())+d[0][::-1]এটি পুনরায় ব্যবহারযোগ্য।
Zgarb

আপনি list.extendএকবারে একাধিক উপাদান যুক্ত করতে ব্যবহার করতে পারেন যা list.appendএকাধিকবার ব্যবহারের চেয়ে কম হবে ।
mbomb007

0

ভেরিয়েবল সেট করতে ব্যবহার করুন এবং এর মতো অপারেশনের পরে ডেটা ফেরত দিন:

add = lambda x, y: exec("x+=y")

বিকল্পভাবে: {যোগ = ল্যাম্বদা এক্স, y: [x.append (x [0] + y), x.revers (), x.pop ()]}
ডিলান এলিয়ট

0

বোধগম্য তালিকা

এটি এতটা অবাস্তব হওয়ার কারণে এটি আরও শেষ অবলম্বন, তবে আপনি
[<expression> for <variable> in <value>]
ল্যাম্বডায় একটি ভেরিয়েবল সিউডো-সেট করতে করতে পারেন । মূলত এই পদ্ধতির একমাত্র ভাল পয়েন্টটি হ'ল অভ্যন্তরীণ প্রকাশটি পড়তে পারা যায়, যা গল্ফ করার সময় আপনার উদ্বেগের মধ্যে অবশ্যই অন্তত।

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