Python'un lambda'sında “if” yapmanın bir yolu var mı


360

In piton 2.6 , yapmak istediğim:

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

Bu açıkça sözdizimi değil. Bir ifgiriş yapmak mümkün mü lambdave eğer öyleyse nasıl yapılır?

Teşekkürler


2
Bir lambda yazdıramaz veya yükseltemezsiniz. Lambdas sadece işlevlerdir, bunun yerine bir işlevi kullanabilirsiniz.
Lennart Regebro

10
Sana katılmıyorum. Bir liste / sözlüğe konulması gereken yukarıdaki gibi 4 farklı, çok kısa fonksiyonlara ihtiyacım var, böylece onları tekrarlayabilir ve her bir yinelemede hangilerini kullanacağımı seçebilirim. Sadece inits kodunun birçok satırı yerine, yinelemeden önce, onu sadece 4 satır init koduna indirebilirim. Daha az merrier ..
Guy

5
Diğer insanlar kodu okumak, yorumlamak, anlamak ve sürdürmek zorunda kaldığında 4 satır kod övgüye değer bir çözüm değildir. Ayrıca, örnekteki "baskı / yükseltme" sorunu lambdalarda yapılamayan ve yapılmaması gereken durumu göstermektedir.
S.Lott

@LennartRegebro lambdas, python'da işlev değildir, sadece ifadelerdir, bu yüzden onlarla yapamayacağınız birçok şey vardır.
Aaron McMillin

1
@AaronMcMillin Lambdas fonksiyonlardır. Sözdizimi nedenleriyle ifadelerle sınırlıdır, ancak işlevlerdir.
Lennart Regebro

Yanıtlar:


662

Sözdizimi adlı kullanıcının sözleri:

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

Ama kullanamaz printveya raisebir lambda.


33
python 3'te print
recursive

11
Tabii, ama soru " iflambdada nasıl kullanırım ?" "Bir sayı çiftse True döndüren lambda yazmanın en iyi yolu nedir?"
Robert Rossney

99
Bu korkunç bir sözdizimidir - kolayca en kötü Python dil yapısı, Perl düzensizlik düzeylerinde sıra dışı değerlendirmesinde yaklaşır - ancak istenen şey budur. Doğru olmak için cevapları ciddiye alıyor musunuz?
Glenn Maynard

41
"Bana bir sayının çift olup olmadığını söyleyen lambda fonksiyonunu nasıl yazarım?" Bununla birlikte, OP'nin başlangıçta sorduğu soruya doğru bir cevap değildir. Ancak kadar ben yapmacık örnekte olduğu gibi benim sonrası yok mu , aslında, açıkça OP'ın soruya cevap.
Robert Rossney

10
"X% 2 == 0" öneren veya en az yedi kişi yapan bir yorum yapan herkesin orijinal soruyu bile okumaması acı verici bir şekilde açıktır.
Glenn Maynard

40

neden sadece bir fonksiyon tanımlamıyorsun?

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

bu durumda lambda kullanmanın bir gerekçesi yoktur.


3
printhenüz 2.6 sürümünde bir işlev değil. :)
Lukáš Lalinský

7
@ Lukáš Lalinský: hala 2.x'te çalisiyor. bir çift gereksiz parantez olarak ele alınacaktır
newacct

24
Gerçek kullanım durumunu bilmiyorsunuz, bu yüzden lambda kullanmak için bir neden olmadığını söyleyebilmenin bir yolu yok.
Glenn Maynard

6
@Glenn Maynard: Lambda kullanmak için neredeyse hiçbir neden yok, nokta. Değişkene bir lambda atamak - bunun için bir stand-in def- genellikle Çok Kötü Bir Fikirdir (tm). Sadece defölümcül programcılar okuyabilir, yorumlayabilir, anlayabilir ve bakımını yapabilir.
S.Lott

17
Lambdaların birçok meşru kullanımı vardır. Eğer düşünemiyorsanız, bu lambda'nın hatası değildir. (Ben sözdiziminin kendisinin hayranı değilim, elbette - Python'un zayıf tasarlanmış girinti sözdiziminin normal diller gibi satır içi işlevleri işleyememesi için beceriksiz bir çözüm.)
Glenn Maynard

25

Muhtemelen şimdiye kadar yazdığım en kötü python satırı:

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

X == 2 yazdırıyorsanız,

x! = 2 ise yükseltirsiniz.


kudos, sanırım bu soruya gerçekten cevap veren tek cevap bu
Epsilon

22

Gerçekten yapmak istediğiniz şey buysa, bir lambda'da kolayca bir istisna oluşturabilirsiniz.

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

Bu iyi bir fikir mi? Genel olarak içgüdüm hata bildirimini lambdaların dışında bırakmak; Hiçbiri değerine sahip olmasına izin verin ve arayan kişide hatayı yükseltin. Ben bunun doğal olarak kötü olduğunu düşünmüyorum - ben "y if x else z" sözdiziminin kendisini kötü düşünüyorum - sadece bir lambda gövdesine çok fazla şey yapmaya çalışmadığınızdan emin olun.


1
Bana sorarsanız, onu bir arayanda yetiştirmek muhtemelen daha güzel bir yöntemdir.
Dominic Bou-Samra

Muhtemelen, ancak büyük ölçüde özel duruma bağlıdır. Tabii ki, lambda'yı oluşturduktan sonra da dekore edebilirsiniz. x = RaiseValueErrorOnNone(x), yine duruma göre.
Glenn Maynard

15

Python'daki Lambdas, kullanmanıza izin verilenler açısından oldukça kısıtlayıcıdır. Özellikle, (hariç operatörleri gibi için herhangi bir anahtar kelimeyi olamaz and, not, orkendi vücudunda, vs).

Yani, örneğiniz için bir lambda kullanmanın bir yolu yok (çünkü kullanamazsınız raise), ancak bunu kabul etmeye istekliyseniz ...

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

16
lambda'nın özel kısıtlaması, ifadeleri değil, yalnızca ifadeleri kullanmanıza izin verilmesidir.
Daniel Werner

13

not lambda tanımınızda başka ifadeler de kullanabilirsiniz ... if :

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

2

Hala yazdırmak istiyorsanız gelecekteki modülü alabilirsiniz

from __future__ import print_function

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

2

Koşullu gibi bir şeye sahip olmak için Mantıksal İşleçleri de kullanabilirsiniz

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

Mantıksal Operatörler hakkında daha fazla bilgiyi burada bulabilirsiniz


Netlik açısından python'un felsefesi ile uyumlu değildir. Mantıksal olarak eşdeğer olsa da, ifsözdizimi her zaman bunun üzerinde tercih edilir. Koşulları kontrol etmenin bariz yolu.
0xc0de

Teşekkür ederim! Profesörün ififadeyi kullanamayacağımı söyleyenlere getirdiği kısıtlamalar nedeniyle bunu kolejde işlevsel bir dilde kullandım , bu yüzden açık bir şekilde buldum .
Victor Lucas

2

tam olarak ihtiyacınız olan şey

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

şimdi işlevi istediğiniz şekilde çağırın

f(2)
f(3)


0

Aşağıdaki örnek kod benim için çalışıyor. Doğrudan bu soru ile ilgili olup olmadığından emin değilim, ancak bazı diğer durumlarda yardımcı olacağını umuyoruz.

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

0

Dene:

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

Dışarı:

True
False

0

Lambda'da if yapmanın kolay bir yolu, liste kavrayışı kullanmaktır.

Lambda'da bir istisna oluşturamazsınız, ancak bu, Python 3.x'te örneğinize yakın bir şey yapmanın bir yoludur:

f = lambda x: print(x) if x==2 else print("exception")

Başka bir örnek:

M değilse 0 döndür 1

f = lambda x: 1 if x=="M" else 0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.