سؤال

في بيثون 2.6, ، أريد أن أفعل:

f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception

من الواضح أن هذا ليس بناء الجملة. هل من الممكن إجراء if في lambda وإذا كان الأمر كذلك ، فكيف تفعل ذلك؟

شكرًا

هل كانت مفيدة؟

المحلول

بناء الجملة الذي تبحث عنه:

lambda x: True if x % 2 == 0 else False

لكن لا يمكنك استخدام print أو raise في لامدا.

نصائح أخرى

لماذا لا تحدد وظيفة؟

def f(x):
    if x == 2:
        print(x)
    else:
        raise ValueError

لا يوجد بالفعل مبرر لاستخدام Lambda في هذه الحالة.

يمكنك بسهولة جمع استثناء في Lambda ، إذا كان هذا هو ما تريد فعله حقًا.

def Raise(exception):
    raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))

هل هذه فكرة جيدة؟ غريزتي بشكل عام هي ترك الخطأ الذي يخرج عن Lambdas ؛ دعها تحتوي على قيمة لا شيء ورفع الخطأ في المتصل. لا أعتقد أن هذا أمر شرير بطبيعته ، على الرغم من أنني أعتبر بناء جملة "y y آخر z" نفسه أسوأ-فقط تأكد من أنك لا تحاول أن تحاول الكثير في جسم Lambda.

ربما أسوأ خط بيثون الذي كتبته حتى الآن:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])

إذا x == 2 قمت بطباعة ،

إذا x! = 2 أنت ترفع.

Lambdas في Python مقيدة إلى حد ما فيما يتعلق بما يُسمح لك باستخدامه. على وجه التحديد ، لا يمكن أن يكون لديك أي كلمات رئيسية (باستثناء المشغلين مثل and, not, or, ، إلخ) في أجسامهم.

لذلك ، لا توجد طريقة يمكنك استخدام Lambda لمثالك (لأنه لا يمكنك استخدام raise) ، ولكن إذا كنت على استعداد للتنازل عن ذلك ... يمكنك استخدام:

f = lambda x: x == 2 and x or None

ملاحظة يمكنك استخدام العديد آخر ... إذا بيانات في تعريف Lambda الخاص بك:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1

إذا كنت لا تزال ترغب في الطباعة ، يمكنك استيراد وحدة المستقبل

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False

ما تحتاجه بالضبط هو

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

اتصل الآن بالوظيفة بالطريقة التي تحتاجها

f(2)
f(3)

يجب أن يساعدك هذا المقتطف:

x = lambda age: 'Older' if age > 30 else 'Younger'

print(x(40))

يمكنك أيضًا استخدام المشغلين المنطقيين للحصول على شيء مثل المشروط

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

يمكنك معرفة المزيد عن المشغلين المنطقيين هنا

يلي رمز النماذج يعمل بالنسبة لي. لست متأكدًا مما إذا كان يتعلق مباشرة بهذا السؤال ، ولكن آمل أن يساعد ذلك في بعض الحالات الأخرى.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))

جربها:

is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))

خارج:

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