পাইথন একাধিক রিটার্ন মান উপেক্ষা করুন


274

বলুন আমার কাছে পাইথন ফাংশন রয়েছে যা একটি টিপলে একাধিক মান প্রদান করে:

def func():
    return 1, 2

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

x, temp = func()

2
আমি এটি সম্পর্কে মতলব সম্পর্কিত ফাংশন আউটপুটগুলিকে উপেক্ষা করার মত ধারণা থেকে আসার বিষয়ে কৌতূহল পেয়েছি যেখানে তারা ~একটি নির্দিষ্ট রিটার্ন ভেরিয়েবল উপেক্ষা করার জন্য সিনট্যাক্স হিসাবে ব্যবহার করে
jxramos

3
আপনি সমাধান হিসাবে ভুল উত্তরটি নির্বাচন করেছেন
এজিপি

উত্তর:


241

একটি সাধারণ কনভেনশন হ'ল যে টিউপলটি আপনি উপেক্ষা করতে চান তার উপাদানগুলির জন্য একটি পরিবর্তনশীল নাম হিসাবে "_" ব্যবহার করা use এই ক্ষেত্রে:

def f():
    return 1, 2, 3

_, _, x = f()

89
-1: আপনি অন্যের কোডে গেটেক্সট কার্যকারিতা যুক্ত করার সময় এই "কনভেনশন" সফল হয় (এটি '_' নামক একটি ফাংশন সংজ্ঞায়িত করে) তাই এটি নিষিদ্ধ করা উচিত
কোডে গেটেক্সট nosklo

27
ভালো কথা - যদিও " " নামক একটি ফাংশন ইনস্টল করার বিষয়ে গেটেক্সটেক্সের জোর দেওয়া ভাল ধারণা কিনা তা বিতর্কযোগ্য able ব্যক্তিগতভাবে আমি এটিকে কিছুটা কুৎসিত মনে করি। নির্বিশেষে, থ্রোওয়ে ভেরিয়েবল হিসাবে " " এর ব্যবহার ব্যাপক।
ব্রায়ান ক্ল্যাপার

25
-1: _ এর অর্থ আইপিথনে "শেষ আউটপুট"। আমি এটিতে কিছু বরাদ্দ করব না।
এন্ডোলিথ

20
ঠিক আছে, আমি "আমি" লক্ষ্য করিনি - রেফারেন্সের জন্য ধন্যবাদ। IMHO আপনি আশা করতে পারবেন না যে অন্যরা কোনও ভেরিয়েবল ব্যবহার করবেন না কারণ একটি পাইথন অ্যাপ তার নিজস্ব যাদু ব্যবহারের জন্য সংজ্ঞা দেয়।
ড্রাগন

8
কিছু আইডিই যেমন পিডিএভ আপনাকে এই সম্পর্কে একটি সতর্কতা দেবে, কারণ আপনার অব্যবহৃত ভেরিয়েবল রয়েছে।
teeks99

593

আপনি x = func()[0]প্রথম মানটি x = func()[1]ফেরত দিতে, দ্বিতীয়টি ফেরত দিতে এবং আরও অনেক কিছু ব্যবহার করতে পারেন ।

আপনি যদি একসাথে একাধিক মান পেতে চান তবে এর মতো কিছু ব্যবহার করুন x, y = func()[2:4]


92
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আপনি func()[2:4]যদি কিছু কিছু ফেরতের মান চান তবে আপনি এমন জিনিসগুলিও ব্যবহার করতে পারেন।
এন্ডোলিথ

11
এটি ফাংশনটিকে একাধিকবার কল করে না: >>> ডিএফ টেস্ট (): ... "এখানে" মুদ্রণ করুন ... ফেরত 1,2,3 ... >>> এ, বি = পরীক্ষা () [: 2 ] এখানে [সম্পাদনা করুন: দুঃখিত যে কোডটি আসে নি, স্পষ্টতই আপনি মন্তব্যগুলিতে কেবল একটি লাইন পান।
অচেনা

32
@ টাইলারলং: আমি মনে করি _, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()ফাংশনটি একাধিকবার কল করার চেয়ে কম পরিষ্কার, তবে এটি আমার মতামত। যদি আপনার ফাংশন আয় অনেক আইটেম, আমি numpy ব্যবহার হবে বাঞ্ছনীয় মনে করি যে:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
endolith

24
@ এন্ডোলিথ আমি মনে করি এটি আরও ভাল এবং এটি বিন্যাসের প্রয়োজন নেই এবং একাধিকবার ফানক () কল করতে হবে না: result = func() a = result[13] b = result[25]...
টাইলার লং

3
এই স্টাইলটি ভাল নয় যখন আপনি এর মধ্যে একটি বা কয়েকটি মান অগ্রাহ্য করতে চান, যেমনx, __, y = func()
এনডেমো

96

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

# Example 1: a is 1 and b is [2, 3]

a, *b = [1, 2, 3]

# Example 2: a is 1, b is [2, 3], and c is 4

a, *b, c = [1, 2, 3, 4]

# Example 3: b is [1, 2] and c is 3

*b, c = [1, 2, 3]       

# Example 4: a is 1 and b is []

a, *b = [1]

2
আপনি a, *_ = f()পরে ফিরে আসা মানগুলির নির্বিচার সংখ্যাকে উপেক্ষা করতেও ব্যবহার করতে পারেন a
THN

21

মনে রাখবেন, আপনি যখন একাধিক আইটেম ফিরিয়ে দেন, আপনি সত্যিকার অর্থে একটি টুপল ফিরে আসছেন। সুতরাং আপনি এই জাতীয় জিনিস করতে পারেন:

def func():
    return 1, 2

print func()[0] # prints 1
print func()[1] # prints 2

17

সাধারণ অনুশীলন হ'ল ডামি ভেরিয়েবল ব্যবহার করা _ (একক আন্ডারস্কোর) ব্যবহার করা, যেমনটি এখানে আগে হয়েছে।

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

x, __ = func()

মোটেই খারাপ ধারণা নয়। তবে '_ _' নাম স্থানে একটি পরিবর্তনশীল ঘোষণা করে। যদিও উপরের মতো অ্যাসাইনমেন্ট স্টেটমেন্টের বাম দিকে সুনির্দিষ্টভাবে ব্যবহৃত না হলে '_' ঘোষণা করে না a, _, _ = 1,8,9। এই পয়েন্ট অবধি, এটি সম্পাদিত সর্বশেষ বিবৃতিটির ফলাফল সংরক্ষণ করে যা আপনি যদি ধরতে চান তবে আপনি সেই মানটি সংরক্ষণ করতে সাধারণত একটি পরিবর্তনশীল ব্যবহার করতে চান। আর এ কারণেই '_' হ'ল জাঙ্ক মানগুলি ধরার জন্য প্রস্তাবিত পরিবর্তনশীল নাম। '_' মানগুলি অন্য বিবৃতি কার্যকর হওয়ার সাথে সাথেই ওভাররাইট হয়ে যায়। '_ _' এর ক্ষেত্রে, জিসি এটিকে পরিষ্কার না করা পর্যন্ত মান সেখানেই থাকবে।
আর্কিট কাপুর

16

তিনটি সহজ পছন্দ।

সুস্পষ্ট

x, _ = func()

x, junk = func()

অসহ্য

x = func()[0]

এবং একটি সাজসজ্জার দিয়ে এটি করার উপায় আছে।

def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0

func0= val0(func)

5
আমি সত্যিই _পরিবর্তনশীল পছন্দ । এটি খুব সুস্পষ্ট যে আপনি কোনও মান উপেক্ষা করছেন
ক্লডিউ

21
আপনার উদাহরণগুলি পিছনের দিকে। x, _ = func()জঘন্য এবং x = func()[0]স্পষ্টতই। কোনও ভেরিয়েবলের জন্য বরাদ্দ এবং তারপরে এটি ব্যবহার না করে? ফাংশন একটি tuple ফিরছে; এটি একটি tuple মত সূচি।
এন্ডোলিথ

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

4
লিস্টিং প্রসেসিং ল্যাঙ্গুয়েজের জন্য, পাইথন থেকে প্রাপ্ত ;), তালিকা অ্যাকসেসর যেমন a[0], a[:](তালিকার অনুলিপি), a[::2](প্রতি দুটি উপাদান) এবং a[i:] + a[:i](একটি তালিকা ঘোরানো), প্রকৃতপক্ষে, সুস্পষ্ট এবং ক্যানোনিকালও।
cod3monk3y

7

অর্থহীন টিপলগুলি ফিরিয়ে দেওয়ার পরিবর্তে জিনিসগুলির নামকরণ করা সম্ভবত সেরা সমাধান। ফিরে আসা আইটেমগুলির অর্ডের পিছনে কিছু যুক্তি না থাকলে।

def func():
    return {'lat': 1, 'lng': 2}

latitude = func()['lat']

আপনি কী ফিরিয়ে দিচ্ছেন সে সম্পর্কে অতিরিক্ত তথ্য যুক্ত করতে চাইলে আপনি নামধারী ব্যবহার করতে পারেন (এটি কেবল একটি অভিধান নয়, এগুলি সমন্বয়কারী):

from collections import namedtuple 

Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

def func():
    return Coordinates(lat=1, lng=2)

latitude = func().lat

যদি আপনার অভিধান / টিপলের মধ্যে থাকা বস্তুগুলি দৃ strongly়তার সাথে একত্রে আবদ্ধ থাকে তবে এটির জন্য কোনও শ্রেণি সংজ্ঞায়িত করা ভাল ধারণা হতে পারে। এইভাবে আপনি এই ধরণের অবজেক্টগুলির মধ্যে মিথস্ক্রিয়া সংজ্ঞায়িত করতে এবং তাদের সাথে কীভাবে কাজ করবেন তার জন্য একটি API দিতে সক্ষম হবেন। একটি প্রাকৃতিক প্রশ্ন যা নিম্নলিখিত: আমি পাইথনে ক্লাস কখন ব্যবহার করব?


4

এটি আমার কাছে সেরা পছন্দ বলে মনে হচ্ছে:

val1, val2, ignored1, ignored2 = some_function()

এটি গুপ্ত বা কুরুচিপূর্ণ নয় (ফানক () [সূচক] পদ্ধতির মতো) এবং আপনার উদ্দেশ্যটি পরিষ্কারভাবে জানিয়েছে।


4

এটি প্রশ্নের সরাসরি উত্তর নয়। বরং এটি এই প্রশ্নের উত্তর দেয়: "আমি কীভাবে অনেকগুলি সম্ভাব্য বিকল্প থেকে একটি নির্দিষ্ট ফাংশন আউটপুট চয়ন করব?"

আপনি যদি ফাংশনটি লিখতে সক্ষম হন (যেমন, এটি কোনও গ্রন্থাগারে নেই যা আপনি সংশোধন করতে পারবেন না), তবে একটি ইনপুট যুক্তি যুক্ত করুন যা আপনাকে ফাংশন থেকে বেরিয়ে আসতে চান তা নির্দেশ করে। এটি একটি ডিফল্ট মান সহ একটি নামযুক্ত যুক্তি তৈরি করুন যাতে "সাধারণ ক্ষেত্রে" আপনার এমনকি এটি নির্দিষ্ট করতে হবে না।

    def fancy_function( arg1, arg2, return_type=1 ):
        ret_val = None
        if( 1 == return_type ):
            ret_val = arg1 + arg2
        elif( 2 == return_type ):
            ret_val = [ arg1, arg2, arg1 * arg2 ]
        else:
            ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 ) 
        return( ret_val )

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


2

এটি যদি এমন কোনও ফাংশন হয় যা আপনি সর্বদা ব্যবহার করেন তবে সর্বদা দ্বিতীয় যুক্তিটি বাতিল করেন তবে আমি যুক্তি দিয়ে বলব যে দ্বিতীয় রিটার্ন মানটি ব্যবহার না করে ফাংশনটির জন্য একটি এলিফ তৈরি করা কম অগোছালো lambda

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 

2

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

results = fct()
a,b = [results[i] for i in list_of_index]

ন্যূনতম কাজের উদাহরণ হিসাবে, প্রদর্শন করে যে ফাংশনটি কেবল একবার ডাকা হয়:

def fct(a):
    b=a*2
    c=a+2
    d=a+b
    e=b*2
    f=a*a
    print("fct called")
    return[a,b,c,d,e,f]

results=fct(3)
> fct called

x,y = [results[i] for i in [1,4]]

এবং মানগুলি প্রত্যাশার মতো:

results
> [3,6,5,9,12,9]
x
> 6
y
> 12

সুবিধার্থে পাইথন তালিকা সূচকগুলিও ব্যবহার করা যেতে পারে:

x,y = [results[i] for i in [0,-2]]

আয়: a = 3 এবং খ = 12

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