পাইথনের অন্য ফাংশনে যুক্তি সহ ফাংশনগুলি পাস করা কি সম্ভব?
এর মতো কিছু বলুন:
def perform(function):
return function()
তবে যে ফাংশনগুলি পাস করতে হবে তার মধ্যে এই জাতীয় যুক্তি থাকবে:
action1()
action2(p)
action3(p,r)
পাইথনের অন্য ফাংশনে যুক্তি সহ ফাংশনগুলি পাস করা কি সম্ভব?
এর মতো কিছু বলুন:
def perform(function):
return function()
তবে যে ফাংশনগুলি পাস করতে হবে তার মধ্যে এই জাতীয় যুক্তি থাকবে:
action1()
action2(p)
action3(p,r)
উত্তর:
আপনি এই মানে?
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
perform
এবং action1
, action2
বিভিন্ন ফাইল? @ S.Lott
লাম্বদা এটির জন্য:
def Perform(f):
f()
Perform(lambda: Action1())
Perform(lambda: Action2(p))
Perform(lambda: Action3(p, r))
আপনি যেমন ফান্টুলগুলি থেকে আংশিক ফাংশনটি ব্যবহার করতে পারেন।
from functools import partial
def perform(f):
f()
perform(Action1)
perform(partial(Action2, p))
perform(partial(Action3, p, r))
কীওয়ার্ড সহও কাজ করে
perform(partial(Action4, param1=p))
functools.partial
perform
আরও পরামিতিগুলির হস্তান্তর করার প্রয়োজন হলে এটি আরও বহুমুখী f
। যেমন, কেউ কল করতে পারে perform(partial(Action3, p))
এবং এর perform(f)
মতো কিছু করতে পারে f("this is parameter r")
।
ল্যাংডাস নয়, ফান্টাকুলস.পার্পিয়াল ব্যবহার করুন! এবং অফ পারফর্ম একটি অকেজো ফাংশন, আপনি সরাসরি ফাংশনগুলির চারপাশে যেতে পারেন।
for func in [Action1, partial(Action2, p), partial(Action3, p, r)]:
func()
(মাস পরে) একটি ছোট্ট বাস্তব উদাহরণ যেখানে ল্যাম্বডা দরকারী, আংশিক নয়:
বলুন যে আপনি একটি 2-মাত্রিক ক্রিয়াকলাপের মাধ্যমে বিভিন্ন 1-মাত্রিক ক্রস-বিভাগ চান, যেমন পাহাড়ের সারি দিয়ে কাটা টুকরা।
quadf( x, f )
একটি 1-ডি লাগে f
এবং বিভিন্ন জন্য এটি কল x
।
Y = -1 0 1 এ উল্লম্ব কাট এবং x = -1 0 1 এ অনুভূমিক কাটগুলির জন্য এটি কল করতে,
fx1 = quadf( x, lambda x: f( x, 1 ))
fx0 = quadf( x, lambda x: f( x, 0 ))
fx_1 = quadf( x, lambda x: f( x, -1 ))
fxy = parabola( y, fx_1, fx0, fx1 )
f_1y = quadf( y, lambda y: f( -1, y ))
f0y = quadf( y, lambda y: f( 0, y ))
f1y = quadf( y, lambda y: f( 1, y ))
fyx = parabola( x, f_1y, f0y, f1y )
আমি যতদূর জানি, এটি partial
করতে পারবেন না -
quadf( y, partial( f, x=1 ))
TypeError: f() got multiple values for keyword argument 'x'
(কীভাবে এইগুলিতে ফাঁকা, আংশিক, ল্যাম্বদা ট্যাগ যুক্ত করবেন?)
এটিকে আংশিক ফাংশন বলা হয় এবং এটি করার কমপক্ষে 3 টি উপায় রয়েছে। আমার প্রিয় উপায়ে ল্যাম্বদা ব্যবহার করা হচ্ছে কারণ এটি অতিরিক্ত প্যাকেজের উপর নির্ভরতা এড়ায় এবং সর্বনিম্ন ভার্বোজ। ধরুন আপনার কোনও ফাংশন রয়েছে add(x, y)
এবং আপনি add(3, y)
প্যারামিটার হিসাবে অন্য কোনও ফাংশনে পাস করতে চান যাতে অন্য ফাংশনটির মান স্থির করে y
।
ল্যাম্বদা ব্যবহার করুন
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = lambda y: add(3, y)
result = runOp(f, 1) # is 4
নিজের র্যাপার তৈরি করুন
এখানে আপনাকে একটি ফাংশন তৈরি করতে হবে যা আংশিক ফাংশনটি ফিরিয়ে দেয়। এটি স্পষ্টতই অনেক বেশি ভার্বোস।
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# declare partial function
def addPartial(x):
def _wrapper(y):
return add(x, y)
return _wrapper
# run example
def main():
f = addPartial(3)
result = runOp(f, 1) # is 4
ফান্টুলগুলি থেকে আংশিক ব্যবহার করুন
এটি lambda
উপরে দেখানো প্রায় অভিন্ন । তাহলে আমাদের কেন এটি দরকার? এর কয়েকটি কারণ রয়েছে । সংক্ষেপে, partial
কিছু ক্ষেত্রে কিছুটা দ্রুত হতে পারে (এর বাস্তবায়ন দেখুন ) এবং আপনি এটি লম্বা দেরীতে দেরী করার জন্য প্রারম্ভিক বাঁধাইয়ের জন্য ব্যবহার করতে পারেন।
from functools import partial
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = partial(add, 3)
result = runOp(f, 1) # is 4
বন্ধ করার সাথে এটি করার একটি উপায় এখানে:
def generate_add_mult_func(func):
def function_generator(x):
return reduce(func,range(1,x))
return function_generator
def add(x,y):
return x+y
def mult(x,y):
return x*y
adding=generate_add_mult_func(add)
multiplying=generate_add_mult_func(mult)
print adding(10)
print multiplying(10)
def action1(arg1, arg2=None, arg3=None)
উদাহরণস্বরূপ, আপনি কীভাবে একটি আর্গুমেন্টটি পাস করতে পারেন যা আপনি arg3 এ অর্পণ করতে চান?