আর্গুমেন্টের আন্ডারস্কোর সহ পাইথনের ল্যাম্বডা?


85

নিম্নলিখিত কোডটি কী করে?

a = lambda _:True

আমি ইন্টারেক্টিভ প্রম্পটে যা পড়েছি এবং যা পরীক্ষা করেছি তা থেকে এটি এমন একটি ফাংশন বলে মনে হয় যা সর্বদা ফিরে আসে True

আমি কি এটি সঠিকভাবে বুঝতে পারি? আমি কেন আন্ডারস্কোর ( _) পাশাপাশি ব্যবহৃত হয়েছিল তা বুঝতে আশা করি ।


10
তাদের জন্য প্যারামিটারলেস ল্যাম্বদা কী, সিনট্যাক্সটি হলlambda : True
রবিনো

18
এই পোস্টিং সম্পর্কে আমার কিছু অপছন্দ হ'ল প্রশ্ন শিরোনাম একটি ল্যাম্বডা ফাংশন সম্পর্কে " NO ভেরিয়েবলগুলির সাথে কথা বলে," তবে প্রশ্ন সংস্থা, এবং প্রায় সমস্ত উত্তর, একটি ভেরিয়েবল / যুক্তিযুক্ত ল্যাম্বডা ফাংশনের উদাহরণ দেয়। যে পরিবর্তনশীল মাত্র একটি অদ্ভুত নাম আছে ঘটবে _পরিবর্তে, xবা aবা যাই হোক না কেন। যদি কেউ কোনও ল্যাম্বডা ফাংশন কীভাবে লিখতে হয় তা জানতে চান যা কোনও আর্গুমেন্ট নেয় না ; এখানে কিভাবে: এটা ভালো সংজ্ঞায়িত করুন: my_lambda = lambda : 255। এটিকে কল করুন: x = my_lambda()আপনি 255যে কোনও রিটার্ন মান পছন্দ করে প্রতিস্থাপন করতে পারেন।
টুথপিক অ্যানিমোন

4
@ টুথপিক অ্যানিমনে দুর্দান্ত উত্তর! আমি আজকাল ডিফল্টডিক্টস আরম্ভের জন্য বেশিরভাগ ভেরিয়েবল সহ ল্যাম্বডা ব্যবহার করি। এই থ্রেডটি পড়া লোকদের পক্ষে এটি দরকারী hope এইচটি = {} এইচটি = ডিফল্টডিক্ট (ল্যাম্বদা: 0, এইচটি)
লেটকাট

উত্তর:


147

_পরিবর্তনশীল নাম। চেষ্টা করে দেখুন (এই ভেরিয়েবলের নামটি সাধারণত একটি উপেক্ষিত ভেরিয়েবলের একটি নাম speak কথা বলতে কোনও স্থানধারক))

পাইথন:

>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'

>>> l("foo")
True

সুতরাং এই ল্যাম্বদা একটি যুক্তি প্রয়োজন । যদি আপনি কোনও লাম্বদা চান যে কোনও যুক্তি ছাড়াই সর্বদা ফিরে আসে Trueতবে এটি করুন:

>>> m = lambda: True
>>> m()
True

7
@ দোপাট্রামন এটির Python 3.6.2অধীনে পরীক্ষা করেছেন Mac OS 10.12এবং এটি কার্যকর works
উইঙ্কলারr

6
ভেরিয়েবলটি _সত্যই প্রয়োজন হয় না এমন সময়ে আপনি সেই তথ্যটি যুক্ত করতে পারেন যা ভেরিয়েবলের নামটি সাধারণত ব্যবহৃত হয়। এটি একটি "থ্রো-অ্যাও-ভেরিয়েবল" এর মতো, কেবল কোনও স্থানধারক যা কোনও কাজে আসে না।
উইঙ্কলারr

4
আইপথনে @ দোপাট্রামন, _ সর্বশেষ প্রকাশের দ্বারা প্রত্যাবর্তিত মান রাখে। আমি এই কারণে _ ব্যবহার করা এড়াতে চাই। stackoverflow.com/questions/17580289/…
তারো কিরীটানি

7

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


না শুধুমাত্র পাইথন রূপান্তর, এটা একটি ভাষা অ্যাগনোস্টিক এবং আন্ডারস্কোর নির্দেশ করে একটি পরিবর্তনশীল অস্থায়ী বা নগণ্য ব্যবহার করা হয়
স্লায়োমির Lenart,

6

এটি এমন একটি ফাংশন বলে মনে হচ্ছে যা নির্বিশেষে সত্যকে ফিরিয়ে দেয়।

হ্যাঁ, এটি এমন একটি ফাংশন (বা ল্যাম্বদা) যা সত্যটি ফিরিয়ে দেয়। আন্ডারস্কোর , যা সাধারণত উপেক্ষা করা ভেরিয়েবলের জন্য স্থানধারক হয়, অপ্রয়োজনীয়।

এই জাতীয় ফাংশনের জন্য উদাহরণ ব্যবহারের ক্ষেত্রে (এটি প্রায় কিছুই করে না):

dd = collections.defaultdict(lambda: True)

যখন কোনও ডিফল্ট ডিটিক্টের আর্গুমেন্ট হিসাবে ব্যবহৃত হয় , আপনি Trueসাধারণ ডিফল্ট মান হিসাবে থাকতে পারেন ।


4

লাম্বদা মানে একটি ফাংশন। উপরের বক্তব্যটি লেখার মতোই

def f(_):
    return True

ল্যাম্বদার জন্য একটি চলক উপস্থিত থাকা প্রয়োজন। সুতরাং আপনি এটিকে ভেরিয়েবলটি পাস করেন _(একইভাবে আপনি পাস করতে পারেন x, y..)


3

অ্যান্ডস্কোর _একটি বৈধ শনাক্তকারী এবং এখানে একটি ভেরিয়েবল নাম হিসাবে ব্যবহৃত হয়। এটি সর্বদা Trueফাংশনে আর্গুমেন্টের জন্য ফিরে আসবে ।

>>>a('123') 
True

হ্যালো, দ্রুত উত্তরের জন্য ধন্যবাদ। সুতরাং এটি একটি বেনাম ফাংশন যা সর্বদা সত্য ফিরে আসে?
লেটকাট

@laycat; হ্যাঁ. এটি সর্বদা সত্য ফিরে আসবে।
হ্যাক করে

2

নীচে প্রশ্নে কোডের রেখাটি রয়েছে:

a = lambda _:True

এটা তোলে একটি ফাংশন একটি ইনপুট প্যারামিটার থাকার দিচ্ছে: _। ইনসকোরের পরিবর্তনশীল নামের পরিবর্তে এক অদ্ভুত পছন্দ, তবে এটি কেবল একটি পরিবর্তনশীল নাম। _ল্যাম্বদা ফাংশন ব্যবহার না করেও আপনি যে কোনও জায়গায় ব্যবহার করতে পারেন । উদাহরণস্বরূপ, পরিবর্তে ....

my_var = 5
print(my_var)

আপনি লিখতে পারেন:

_ = 5
print(_)

তবে এমন একটি কারণ _ছিল যা কিছু xবা এর পরিবর্তে প্যারামিটারের নাম হিসাবে ব্যবহৃত হত input। আমরা এক মুহুর্তে এটি পেয়ে যাব।

প্রথমত, আমাদের জানতে হবে যে ল্যাম্বদা-কীওয়ার্ড একটি ফাংশন গঠন করে, এর মতো def, তবে বিভিন্ন বাক্য গঠন সহ। ল্যাম্বডা ফাংশনের সংজ্ঞা, a = lambda _:Trueলেখার সাথে সমান:

def a(_):
    return True

এটি aএকটি ইনপুট প্যারামিটার সহ একটি ফাংশন তৈরি করে _এবং এটি ফিরে আসে True। আন্ডারস্কোরের পরিবর্তে a = lambda x:Trueএকটি সহজেই সহজে লেখা যেতে পারে x। যাইহোক, কনভেনশনটি _যখন আমরা সেই পরিবর্তনশীলটি ব্যবহার করার ইচ্ছা করি না তখন একটি পরিবর্তনশীল নাম হিসাবে ব্যবহার করা হয়। নিম্নোক্ত বিবেচনা কর:

for _ in range(1, 11):
    print('pear')

লক্ষ্য করুন যে লুপ সূচকটি কখনই লুপ-বডিটির অভ্যন্তরে ব্যবহৃত হয় না। আমরা কেবল লুপটি একটি নির্দিষ্ট সংখ্যক সময় কার্যকর করতে চাই। যেমনটি winklerrrলিখেছেন, "পরিবর্তনশীল নামটি _[...]" থ্রো-অ্যাও-ভেরিয়েবল "এর মতো, কেবল কোনও স্থানধারক যা কোনও কাজে আসে না।"

তেমনিভাবে, `` a = ল্যাম্বদা এক্স সহ: সত্য যে ফাংশনের শরীরে ইনপুট প্যারামিটার ব্যবহার করা হয় না। ইনপুট আর্গুমেন্টটি আসলে যতক্ষণ না আছে ততক্ষণ তা বিবেচনা করে না। সেই ল্যাম্বডা-ফাংশনের লেখক ভেরিয়েবলটি ব্যবহৃত হবে না তা বোঝাতে এমন _কিছু পরিবর্তে লিখেছিলেন x

মনে রাখবেন যে, ল্যামডা নেই একটি আর্গুমেন্ট আছে; তাই, লেখা

a(), একটি ত্রুটি উত্থাপন করবে।

আপনি যদি কোনও যুক্তি ছাড়াই একটি ল্যাম্বদা চান তবে এই জাতীয় কিছু লিখুন:

 bar = lambda: True

এখন কল করা bar(), কোনও আরগস ছাড়াই ঠিক কাজ করবে। একটি ল্যাম্বদা যা কোনও আর্গুমেন্ট নেয় না সর্বদা একই মান ফেরত দেয় না:

import random
process_fruit = lambda : random.random()

উপরের ল্যাম্বদা ফাংশনটি আরও জটিল যে কেবল এমন কিছু যা সর্বদা একই ধ্রুবককে দেয়।

প্রোগ্রামাররা আমাদের মাঝে মাঝে lambdaপরিবর্তে কীওয়ার্ডের একটি কারণ def হ'ল বিশেষত সংক্ষিপ্ত এবং সহজ functions নোট করুন যে একটি lambdaসংজ্ঞা সাধারণত সমস্ত এক লাইনে মাপসই করে তবে ডিএফ স্টেটমেন্টের সাহায্যে এটি করা বেশ কঠিন। ফাংশনটি আর ব্যবহার করা হবে না তখন এসএফের lambdaপরিবর্তে ব্যবহারের আর একটি কারণ def। যদি আমরা পরে ফাংশনটি আবার কল করতে না চাই, তবে ফাংশনটির একটি নাম দেওয়ার দরকার নেই। উদাহরণস্বরূপ নিম্নলিখিত কোড বিবেচনা করুন:

Def প্রয়োগ_to_each (রূপান্তর, in_container): আইডিএক্সের জন্য আউট_কন্টেইনার = তালিকা (), আইটেম গণনা (ধারক, 0): আউট_কন্টেইনার [আইডিএক্স] = রূপান্তর (আইটেম) আউট_ কনটেনার

এখন আমরা নিম্নলিখিত কল করতে:

squares  = apply_to_each(lambda x: x**2 range(0, 101))

লক্ষ্য করুন যে lambda x: x**2একটি লেবেল দেওয়া হয়নি। এটি কারণ সম্ভবত আমরা পরে এটি আবার কল করব না, এটি কেবল সাময়িকভাবে প্রয়োজন আমাদের ছোট এবং সাধারণ কিছু।

লাম্বদা ফাংশনগুলির একটি নাম দেওয়ার প্রয়োজন নেই এই বিষয়টি বর্ণনা করার জন্য অন্য নামের উত্স: "বেনামে ফাংশন" "

এছাড়াও লক্ষ করুন যে ল্যাম্বদা-বিবৃতিগুলি কোনও ফাংশন-কলের মতো যা তারা তাদের তৈরি ফাংশনের একটি রেফারেন্স দেয়। নিম্নলিখিতটি অবৈধ:

apply_to_each(def foo(x): x**2 ,  range(0, 101))

যদিও, apply_to_each(lambda x: x**2 range(0, 101))ঠিক আছে।

সুতরাং, আমরা ব্যবহার lambdaপরিবর্তে defএবং _একটি দীর্ঘ পরিবর্তনশীল নামের পরিবর্তে যখন আমরা কিছু ছোট, মিষ্টি চান এবং সম্ভবত পরে আবার ব্যবহার না চান।

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