পাইথনে যুক্তি তালিকার একটি ফাংশন কল করুন


150

আমি অজগরটিতে অন্য ফাংশনের ভিতরে একটি ফাংশন কল করার চেষ্টা করছি, তবে সঠিক বাক্য গঠনটি খুঁজে পাচ্ছি না। আমি যা করতে চাই তা হ'ল:

def wrapper(func, args):
    func(args)

def func1(x):
    print(x)

def func2(x, y, z):
    return x+y+z

wrapper(func1, [x])
wrapper(func2, [x, y, z])

এই ক্ষেত্রে প্রথম কলটি কাজ করবে, এবং দ্বিতীয়টি কাজ করবে না। আমি যা সংশোধন করতে চাই তা হ'ল মোড়ক ফাংশন এবং ডাকা ফাংশন নয়।

উত্তর:


268

অন্যান্য উত্তরে কিছুটা প্রসারিত করতে:

লাইনের মাঝে:

def wrapper(func, *args):

* এর পরের argsঅর্থ "প্রদত্ত বাকী প্যারামিটারগুলি নিয়ে যান এবং তাদেরকে একটি তালিকায় রাখুন args"।

লাইনের মাঝে:

    func(*args)

* এর পরের * এর argsঅর্থ "এই তালিকাটি আরগস বলে আর্ট করুন এবং বাকি প্যারামিটারগুলিতে 'মোড়ক করুন'।

সুতরাং আপনি নিম্নলিখিতটি করতে পারেন:

def wrapper1(func, *args): # with star
    func(*args)

def wrapper2(func, args): # without star
    func(*args)

def func2(x, y, z):
    print x+y+z

wrapper1(func2, 1, 2, 3)
wrapper2(func2, [1, 2, 3])

ইন wrapper2, তালিকাটি স্পষ্টভাবে পাস করা হয়েছে, তবে উভয় মোড়কের argsমধ্যে তালিকা রয়েছে [1,2,3]


26
একটি জিনিস যা আমি প্রায়শই উল্লেখ করি না তা হ'ল * আরগগুলি সহ কোনও ফাংশনটি কীভাবে কল করা যায়, আপনার যদি একটি তালিকা বা টিপল থাকে যা আপনি পাস করতে চান। তার জন্য আপনাকে এটিকে এটির কল করতে হবে: ਰੈਪਰ 1 (ফানক 2, * মাইলিস্ট)
আলী

* সি # তে def wrapper(func, *args)থাকা আর্গুমেন্টগুলি method(params object[] args)
জিম আহো

1
নোট যে *argsফাংশন সংজ্ঞা সর্বশেষ যুক্তি হতে হবে।
জিম আহো

2
The * next to args means "take the rest of the parameters given and put them in a list called args".এটি তাদের তালিকায় রাখে, তালিকা নয়।
টমাসজ নোকো

20

কোনও ফাংশন মোড়ানোর সহজ উপায়

    func(*args, **kwargs)

... ম্যানুয়ালি একটি মোড়ক লিখতে হবে যা নিজের ভিতরে ফানক () কল করে:

    def wrapper(*args, **kwargs):
        # do something before
        try:
            return func(*a, **kwargs)
        finally:
            # do something after

পাইথনে ফাংশনটি একটি অবজেক্ট, তাই আপনি এটির নামটি অন্য ফাংশনের আর্গুমেন্ট হিসাবে পাস করতে পারেন এবং এটি ফিরিয়ে দিতে পারেন। যে কোনও ফাংশনের জন্য আপনি একটি র‌্যাপার জেনারেটরও লিখতে পারেন কোনও ফাঙ্ক () :

    def wrapperGenerator(anyFunc, *args, **kwargs):
        def wrapper(*args, **kwargs):
            try:
                # do something before
                return anyFunc(*args, **kwargs)
            finally:
                #do something after
        return wrapper

দয়া করে নোট করুন যে পাইথনে যখন আপনি কোনও ফাংশনের সমস্ত আর্গুমেন্টের নাম জানেন না বা না চান, আপনি আর্গুমেন্টের একটি টিপলকে উল্লেখ করতে পারেন, এটির নাম দ্বারা চিহ্নিত করা হয়েছে, এর পরে প্রথম বন্ধনীতে একটি নক্ষত্রের দ্বারা চিহ্নিত ফাংশন নাম:

    *args

উদাহরণস্বরূপ আপনি কোনও ফাংশনটি সংজ্ঞায়িত করতে পারেন যা বেশ কয়েকটি সংখ্যক আর্গুমেন্ট গ্রহণ করবে:

    def testFunc(*args):
        print args    # prints the tuple of arguments

পাইথন ফাংশন আর্গুমেন্ট এমনকি আরও ম্যানিপুলেশন সরবরাহ করে। আপনি কোনও ফাংশনকে কীওয়ার্ড আর্গুমেন্ট নেওয়ার অনুমতি দিতে পারেন। ফাংশন বডির মধ্যে একটি অভিধানে কীওয়ার্ড আর্গুমেন্ট রাখা হয়। ক্রিয়াকলাপের নামের পরে প্রথম বন্ধনীতে এই অভিধানটি দুটি তারকাচিহ্ন দ্বারা চিহ্নিত করা হয় এবং এর পরে অভিধানটির নাম:

    **kwargs

একটি অনুরূপ উদাহরণ যা কীওয়ার্ড আর্গুমেন্ট অভিধানকে মুদ্রণ করে:

    def testFunc(**kwargs):
        print kwargs    # prints the dictionary of keyword arguments

11

পরিবর্তনশীল দৈর্ঘ্যের আর্গুমেন্টের জন্য আপনি * আরগস এবং ** কাওয়ার্গ্স সিনট্যাক্স ব্যবহার করতে পারেন।

* আরগস এবং ** কাওয়ার্গ মানে কি?

এবং অফিসিয়াল অজগর টিউটোরিয়াল থেকে

http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions


সুতরাং আমার * আরগস এবং ** কাওয়ার্গ উভয়ই পেতে এবং তাদের সাথে এটি কল করা দরকার?
সুরডিন

1
না, আপনি / অথবা ব্যবহার করতে পারেন তবে সেগুলি প্রায়শই একসাথে জুড়ে দেওয়া হয়। আপনার ক্ষেত্রে, আপনার কেবল * আরগগুলি দরকার।
জিমবি

ঠিক আছে, এটি কাজ করে, তবে এটি এখনও আমাকে তর্কের একটি তালিকা পাস করতে দেয় না, এবং আমাকে সেগুলি খুব দ্রুত পাস করতে হবে। এটি আমার বর্তমান পরিস্থিতিতে আমাকে খুব বেশি বিরক্ত করে না, তবে কীভাবে এটি করা যায় তা জেনে রাখা ভাল। (আমাকে র‌্যাপার (ফানক 2, এক্স, ওয়াই, জেড) করতে হবে এবং মোড়ক নয় (ফানক 2, [এক্স, ওয়াই, জেড]))
সুরডিন

যদি পরবর্তীটি আপনি যা চান সেটি যদি থাকে তবে * আরপস ফর্মটি ব্যবহার করুন যখন মোড়ক ফ্যানক 2 কল করে তবে 'ডিএফ র‌্যাপার'-এ নয়।
অ্যালেক্স মার্তেলেলি

10

আপনার প্রশ্নের আক্ষরিক উত্তর (আপনি যা চেয়েছিলেন ঠিক তেমনটি করতে, কেবলমাত্র মোড়ক বদলে ফাংশন বা ফাংশন কলগুলি নয়) কেবল লাইনটি পরিবর্তন করা যায়

func(args)

পড়তে

func(*args)

এটি পাইথনকে প্রদত্ত তালিকাটি (এই ক্ষেত্রে, args) নিতে এবং এর বিষয়বস্তু অবস্থানগত আর্গুমেন্ট হিসাবে ফাংশনে প্রেরণ করতে বলে।

এই কৌশলটি ফাংশন কলের উভয় "পক্ষের" উপর কাজ করে, সুতরাং একটি ফাংশন এর মতো সংজ্ঞায়িত করা হয়েছে:

def func2(*args):
    return sum(args)

আপনি যতটা স্থিতিযুক্ত তর্ক যুক্ত করেন তা গ্রহণ করতে সক্ষম হবেন এবং সেগুলি সমস্তকে একটি তালিকায় রাখবেন args

আমি আশা করি এটি কিছুটা পরিষ্কার করতে সহায়তা করে। নোট যে এই হিসাবে ভাল dicts / শব্দ আর্গুমেন্ট সহ সব সম্ভব, ব্যবহার **পরিবর্তে *


8

আপনার আনপ্যাকিং করে আর্গুমেন্টগুলি ব্যবহার করা দরকার ..

def wrapper(func, *args):
    func(*args)

def func1(x):
    print(x)

def func2(x, y, z):
    print x+y+z

wrapper(func1, 1)
wrapper(func2, 1, 2, 3)

0

পূর্ববর্তী উত্তরের সাথে একটি সামান্য সংযোজন, যেহেতু আমি কোনও সমস্যার সমাধান খুঁজে পাইনি, যা একটি নতুন প্রশ্ন খোলার পক্ষে উপযুক্ত নয়, তবে আমাকে এখানে নিয়ে গেছে led

এখানে একটা ছোট কোড স্নিপেট, যা সম্মিলন lists, zip()এবং *args, একটি মোড়কের যে আর্গুমেন্ট একটি অজানা পরিমাণ সঙ্গে ফাংশন একটি অজানা পরিমাণ সঙ্গে মোকাবেলা করতে পারেন প্রদান।

def f1(var1, var2, var3):
    print(var1+var2+var3)

def f2(var1, var2):
    print(var1*var2)

def f3():
    print('f3, empty')

def wrapper(a,b, func_list, arg_list):
    print(a)
    for f,var in zip(func_list,arg_list):
        f(*var)
    print(b)

f_list = [f1, f2, f3]
a_list = [[1,2,3], [4,5], []]

wrapper('begin', 'end', f_list, a_list)

মনে রাখবেন, এটি zip()অসম দৈর্ঘ্যের তালিকাগুলির জন্য সুরক্ষা চেক সরবরাহ করে না, জিপ পুনরাবৃত্তকারীগুলি অজগরে সমান দৈর্ঘ্যের জন্য জোর দিয়ে দেখুন ।

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