سؤال

ويقول لدي وظيفة بيثون التي تقوم بإرجاع قيم متعددة في الصفوف (tuple):

def func():
    return 1, 2

هل هناك طريقة لطيفة لتجاهل واحدة من النتائج بدلا من مجرد تعيين إلى متغير مؤقت؟ أقول إذا كنت مهتم فقط في القيمة الأولى، هل هناك طريقة أفضل من هذا:

x, temp = func()
هل كانت مفيدة؟

المحلول

واحد مشترك للاتفاقية هو استخدام "_" كاسم متغير لعناصر من الصفوف (tuple) كنت ترغب في تجاهله. على سبيل المثال:

def f():
    return 1, 2, 3

_, _, x = f()

نصائح أخرى

ويمكنك استخدام x = func()[0] لإرجاع القيمة الأولى، x = func()[1] للعودة الثانية، وهلم جرا.

إذا كنت ترغب في الحصول على قيم متعددة في وقت واحد، استخدام شيء من هذا القبيل x, y = func()[2:4].

إذا كنت تستخدم بيثون 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]

وتذكر، وعند العودة أكثر من عنصر واحد، وأنت تعود حقا الصفوف (tuple). لذلك يمكنك أن تفعل أشياء من هذا القبيل:

def func():
    return 1, 2

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

وهذه الممارسة الشائعة هي استخدام _ متغير دمية (تسطير واحد)، ما يصل أبدوا هنا من قبل.

ومع ذلك، لتجنب التصادم مع استخدامات أخرى بهذا الاسم متغير (انظر هذا الرد ) قد يكون ممارسة أفضل لاستخدام __ (تسطير مزدوج) بدلا كمتغير بخس، كما أشار من قبل ncoghlan . منها مثلا:

x, __ = func()

وثلاثة خيارات بسيطة.

واضحة

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)

وهذا يبدو وكأنه الخيار الأفضل بالنسبة لي:

val1, val2, ignored1, ignored2 = some_function()

وانها ليست خفي أو قبيحة (مثل ظائفها () [المؤشر] طريقة)، وينص بوضوح الغرض الخاص.

وهذه ليست إجابة مباشرة على السؤال. بل يجيب على هذا السؤال: "كيف يمكنني اختيار الانتاج وظيفة محددة من العديد من الخيارات الممكنة"

إذا كنت قادرا على كتابة وظيفة (أي أنها ليست في مكتبة لا يمكنك تعديل)، ثم يضاف حجة المدخلات التي تشير إلى ما تريد من وظيفة. جعله حجة اسمه مع قيمة افتراضية حتى في "قضية مشتركة" لم يكن لديك حتى لتحديد ذلك.

    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 )

وهذه الطريقة تعطي وظيفة "تحذير متقدمة" بشأن النتيجة المرجوة. وبناء على ذلك فإنه يمكن تخطي معالجة لزوم لها وفقط للقيام بهذا العمل الضروري الحصول على إخراج المطلوب. أيضا لأن بيثون لا الطباعة ودينامية، يمكن للنوع الإرجاع تتغير. لاحظ كيف إرجاع سبيل المثال العددية، قائمة أو الصفوف (tuple) ... ما تريد!

وأفضل حل هو على الارجح لتسمية الأشياء بدلا من العودة الصفوف لا معنى لها. إلا أن هناك بعض المنطق وراء ترتيب البنود التي تم إرجاعها.

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

latitude = func()['lat']
print(latitude)

هل يمكن حتى استخدام <لأ href = "https://docs.python.org/3/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields" يختلط = "نوفولو noreferrer "> namedtuple إذا كنت ترغب في إضافة معلومات إضافية حول ما كنت ستعود:

from collections import namedtuple 
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

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

latitude = func().lat
print(latitude)

إذا الأشياء التي تعود غالبا ما تكون معا ومن ثم قد يكون فكرة جيدة لتعريف حتى فئة لذلك.

وإذا كانت هذه هي وظيفة التي تستخدمها في كل وقت ولكن دائما تجاهل الوسيطة الثانية، وأنا أزعم أنه أقل فوضوية لإنشاء اسم مستعار لوظيفة من دون قيمة الإرجاع الثانية باستخدام lambda.

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 

وعندما يكون لديك الكثير من الانتاج من وظيفة وأنت لا تريد أن يطلق عليه عدة مرات، وأعتقد أن أوضح طريقة لاختيار النتائج ستكون كما يلي:

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]]

وعودة: أ = 3 ب = 12

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top