পাইথনের ল্যাম্বডায় "যদি" অনুষ্ঠানের কোনও উপায় আছে কি?


358

ইন পাইথন 2.6 , আমি কি করতে চান:

f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception

এটি পরিষ্কারভাবে বাক্য গঠন নয়। এটি একটি ifইন পারফর্ম করা সম্ভব lambdaএবং যদি তাই হয় কিভাবে এটি?

ধন্যবাদ


2
আপনি কোনও ল্যাম্বডায় মুদ্রণ বা জোগাড় করতে পারবেন না। লাম্বডাস কেবল ফাংশন, আপনি পরিবর্তে কোনও ফাংশন ব্যবহার করতে পারেন।
লেনার্ট রেজেব্রো

10
আমি আপনার সাথে একমত নই. আমার উপরে 4 টি ভিন্ন, খুব সংক্ষিপ্ত ফাংশন প্রয়োজন যা উপরে একটি তালিকা / অভিধানে রাখা দরকার যাতে আমি তাদের উপর পুনরাবৃত্তি করতে পারি এবং প্রতিটি পুনরাবৃত্তিতে কোনটি ব্যবহার করতে হবে তা নির্বাচন করতে পারি। কেবলমাত্র ইনাইটের কোডের অনেকগুলি লাইন পরিবর্তে, পুনরাবৃত্তির আগে, নিজেই আমি এটিকে ডি আর কোডের 4 টি লাইনে নামিয়ে আনতে পারি। মারিয়র যত কম হবে ..
গাই

5
কোডের 4 টি লাইন প্রশংসনীয় সমাধান নয় যখন অন্য লোকদের কোডটি পড়তে, ব্যাখ্যা করতে, বুঝতে এবং পরিচালনা করতে হয়। আরও উদাহরণস্বরূপ "মুদ্রণ / উত্থাপন" সমস্যাটি এটি দেখায় যা ল্যাম্বডাসে করা এবং করা উচিত নয়।
এস .লট

@ লেনার্টরেজিব্রো ল্যাম্বডাস পাইথনের কোনও কাজ নয়, তারা কেবলমাত্র অভিব্যক্তি, এ কারণেই আপনি তাদের সাথে না করতে পারেন এমন অনেকগুলি জিনিস রয়েছে।
অ্যারন ম্যাকমিলিন

1
অ্যারোন এমসি মিলিন লাম্বদাস ফাংশন। এগুলি সিনট্যাক্স কারণে অভিব্যক্তিতে সীমাবদ্ধ তবে তারা কার্যকরী।
লেনার্ট রেজেব্রো

উত্তর:


660

আপনি যে সিনট্যাক্সটি সন্ধান করছেন:

lambda x: True if x % 2 == 0 else False

তবে আপনি printবা raiseল্যাম্বডায় ব্যবহার করতে পারবেন না ।


33
অজগর 3 এ, আপনি মুদ্রণটি ব্যবহার করতে পারেন
পুনরাবৃত্ত হবে

11
অবশ্যই, তবে প্রশ্নটি ছিল "আমি কীভাবে ifল্যাম্বডায় ব্যবহার করব ?" না "একটি ল্যাম্বদা লেখার সর্বোত্তম উপায় কী যা যদি সংখ্যাটি সমান হয় তবে সত্য ফিরে আসে?"
রবার্ট রসনি

99
এটি একটি ভয়াবহ বাক্য গঠন - সহজেই সবচেয়ে খারাপ পাইথন ভাষা নির্মান, এর অর্ডার অফ-অর্ডার মূল্যায়নে পার্ড স্তরের স্তম্ভের কাছাকাছি - তবে এটিই যা চেয়েছিল তা। আপনি সঠিক হওয়ার জন্য উত্তর গুরুত্ব সহকারে ভোট দিচ্ছেন?
গ্লেন মেইনার্ড 21

41
এটি এই প্রশ্নের সঠিক উত্তর "আমি একটি ল্যাম্বডা ফাংশন কীভাবে লিখব যা আমাকে যদি একটি সংখ্যা সমান হয় তবে আমাকে লিখবে?" এটি অবশ্য ওপি মূলত যে প্রশ্নটি করেছে তার সঠিক উত্তর নয়। তবে অনেক উদাহরণস্বরূপ আমি কল্পিত মত, আমার পোস্ট করবেন না করেন , আসলে, পরিষ্কারভাবে ওপি প্রশ্নের উত্তর দিন।
রবার্ট রসনি

10
এটি বেদনাদায়কভাবে সুস্পষ্ট যে কেউ "x% 2 == 0" এর পরামর্শ দিচ্ছেন - বা তার পক্ষে প্রস্তাবিত মন্তব্যটিতে ভোট দিয়েছেন, যা কমপক্ষে সাত জন করে তোলে - এমনকি মূল প্রশ্নটিও পড়েনি।
গ্লেন মেইনার্ড

40

আপনি শুধু একটি ফাংশন সংজ্ঞায়িত করবেন না কেন?

def f(x):
    if x == 2:
        print(x)
    else:
        raise ValueError

এক্ষেত্রে ল্যাম্বডা ব্যবহার করার কোন যুক্তি নেই।


3
print2.6 এ এখনও কোনও ফাংশন নয়। :)
লুকা লালিনস্কো

7
@ লুকা লালিনস্কে: এটি এখনও ২.x সালে কাজ করে। এটি রিডানড্যান্ট বন্ধনীর জুটির হিসাবে বিবেচনা করা হবে
newacct

24
আপনি তার আসল ব্যবহারের বিষয়টি জানেন না, সুতরাং ল্যাম্বডা ব্যবহার করার কোনও কারণ নেই তা আপনি বলতে পারবেন না।
গ্লেন মেইনার্ড 21

6
@ গ্লেন মেনার্ড: ল্যাম্বডা, পিরিয়ড ব্যবহার করার প্রায় কোনও কারণ নেই। কোনও ভেরিয়েবলকে ল্যাম্বডা অর্পণ করা - স্ট্যান্ড-ইন হিসাবে def- সাধারণত একটি খুব খারাপ ধারণা (টিএম)। কেবলমাত্র একজন defমারাত্মক প্রোগ্রামার ব্যবহার করুন এটি পড়তে, ব্যাখ্যা করতে, বুঝতে এবং পরিচালনা করতে পারেন।
এস .লট

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

25

সম্ভবত সবচেয়ে খারাপ পাইথন রেখা আমি এ পর্যন্ত লিখেছি:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])

যদি x == 2 আপনি মুদ্রণ করেন,

যদি এক্স! = 2 আপনি উত্থাপন


কুডস, আমি মনে করি এটি পৃষ্ঠায় একমাত্র উত্তর যা আসলে প্রশ্নের উত্তর দেয়
এপসিলন ২

22

আপনি যদি সত্যিই এটি করতে চান তবে আপনি খুব সহজেই একটি ল্যাম্বডায় একটি ব্যতিক্রম বাড়াতে পারেন।

def Raise(exception):
    raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))

এই একটি ভাল ধারণা? আমার স্বাভাবিক প্রবৃত্তিটি লাম্বডাসের বাইরে ত্রুটিটি রিপোর্ট করা ছেড়ে দেওয়া হয়; এটির কোনওটিরই মূল্য নেই এবং কলারে ত্রুটি বাড়ান। আমি মনে করি না যে এটি অন্তর্নিহিত খারাপ।


1
যদি আপনি আমাকে জিজ্ঞাসা করেন তবে এটি কলারে উত্থাপন সম্ভবত প্রাকৃতিক পদ্ধতি।
ডোমিনিক বউ-সামরা

সম্ভবত, তবে এটি বিশেষ ক্ষেত্রে খুব বেশি নির্ভর করে। অবশ্যই, আপনি এটি তৈরির পরে ল্যাম্বদাটি সাজাতে পারেন। x = RaiseValueErrorOnNone(x)আবারও মামলার উপর নির্ভর করে।
গ্লেন মেইনার্ড

15

পাইথনের ল্যাম্বডাস আপনাকে কী ব্যবহারের অনুমতি দিয়েছে তা নিয়ে মোটামুটি সীমাবদ্ধ। বিশেষ করে, আপনি (ব্যতীত অপারেটার পছন্দ জন্য কোন কিওয়ার্ড থাকতে পারে না and, not, orতাদের শরীরে, ইত্যাদি)।

সুতরাং, আপনার উদাহরণের জন্য ল্যাম্বডা ব্যবহার করার কোনও উপায় নেই (কারণ আপনি ব্যবহার করতে পারবেন না raise) তবে আপনি যদি তাতে সম্মতি দিতে ইচ্ছুক হন ... আপনি ব্যবহার করতে পারেন:

f = lambda x: x == 2 and x or None

16
ল্যাম্বদার সুনির্দিষ্ট সীমাবদ্ধতা হ'ল আপনাকে বিবৃতি ব্যবহারের অনুমতি নেই, কেবলমাত্র অভিব্যক্তি।
ড্যানিয়েল ওয়ার্নার

13

নোট আপনি অন্য কয়েকটি ব্যবহার করতে পারেন ... আপনার ল্যাম্বদা সংজ্ঞাতে বিবৃতি যদি :

f = lambda x: 1 if x>0 else 0 if x ==0 else -1

2

আপনি যদি এখনও মুদ্রণ করতে চান তবে আপনি ভবিষ্যতের মডিউলটি আমদানি করতে পারেন

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False

2

আপনি শর্তযুক্ত কিছু পাওয়ার জন্য লজিকাল অপারেটরগুলিও ব্যবহার করতে পারেন

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

আপনি এখানে লজিকাল অপারেটর সম্পর্কে আরও দেখতে পারেন


এটি স্পষ্টতার দিক দিয়ে অজগর দর্শনের সাথে যায় না। যৌক্তিকভাবে সমতুল্য হলেও ifসিনট্যাক্সটি সর্বদা এর চেয়ে বেশি পছন্দ করা হয়। শর্তাদি যাচাই করার সুস্পষ্ট উপায়।
0xc0de

ধন্যবাদ! আমি এটিকে কলেজে কার্যকরী ভাষার কাজে ব্যবহার করেছি কারণ এই অধ্যাপক আরোপিত বিধিনিষেধের কারণে যে আমি বলে যে ifবক্তব্য আমি ব্যবহার করতে পারি না , তাই আমি এটি স্পষ্টভাবে খুঁজে পাইনি ।
ভিক্টর লুকাস

2

আপনার যা ঠিক দরকার তা হ'ল

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

এখন আপনার প্রয়োজন মতো ফাংশনটি কল করুন

f(2)
f(3)


0

নিম্নলিখিত নমুনা কোড আমার জন্য কাজ করে। এটি সরাসরি এই প্রশ্নের সাথে সম্পর্কিত কিনা তা নিশ্চিত নয়, তবে আশা করি এটি অন্যান্য কিছু ক্ষেত্রে সহায়তা করে।

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))


0

ল্যাম্বডায় ইফ সম্পাদন করার একটি সহজ উপায় হল তালিকা বোধগম্যতা ব্যবহার করে।

ল্যাম্বডায় আপনি কোনও ব্যতিক্রম বাড়াতে পারবেন না, তবে পাইথন ৩.x এর উদাহরণ যা আপনার উদাহরণের কাছাকাছি কিছু করার:

f = lambda x: print(x) if x==2 else print("exception")

আরেকটি উদাহরণ:

এম অন্যথায় 0 হলে 1 ফিরে আসুন

f = lambda x: 1 if x=="M" else 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.