Apakah ada cara untuk melakukan "jika" di lambda python

358

Dalam python 2.6 , saya ingin melakukan:

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

Ini jelas bukan sintaks. Apakah mungkin untuk melakukan ifin lambdadan jika demikian bagaimana melakukannya?

Terima kasih

Orang
sumber
2
Anda tidak dapat mencetak atau membesarkan dalam lambda. Lambdas hanyalah fungsi, Anda dapat menggunakan fungsi sebagai gantinya.
Lennart Regebro
10
Saya tidak setuju dengan Anda. Saya membutuhkan 4 fungsi yang berbeda, sangat singkat seperti yang di atas yang perlu dimasukkan ke dalam daftar / kamus sehingga saya dapat beralih di atasnya dan memilih mana yang akan digunakan dalam setiap iterasi. Alih-alih banyak baris kode hanya init, sebelum iterasi, itu sendiri saya bisa membawanya ke hanya 4 baris kode init. Semakin sedikit lebih meriah ..
Guy
5
4 baris kode bukanlah solusi yang terpuji ketika orang lain harus membaca, menafsirkan, memahami dan memelihara kode tersebut. Lebih lanjut, masalah "cetak / naikkan" dalam contoh menunjukkan ini yang tidak bisa dan tidak boleh dilakukan dalam lambdas.
S.Lott
@LennartRegebro lambdas tidak berfungsi dalam python, mereka hanya ekspresi, itu sebabnya ada banyak hal yang tidak dapat Anda lakukan dengan mereka.
Aaron McMillin
1
@AaronMcMillin Lambdas adalah fungsi. Mereka dibatasi untuk ekspresi karena alasan sintaks, tetapi mereka ADALAH fungsi.
Lennart Regebro

Jawaban:

660

Sintaks yang Anda cari:

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

Tapi Anda tidak bisa menggunakan printatau raiselambda.

Robert Rossney
sumber
33
dalam python 3, Anda dapat menggunakan print
recursive
11
Tentu, tetapi pertanyaannya adalah "bagaimana cara saya menggunakan iflambda?" bukan "apa cara terbaik untuk menulis lambda yang mengembalikan Benar jika nomor genap?"
Robert Rossney
99
Ini sintaks yang mengerikan - mudah konstruksi bahasa Python terburuk, mendekati tingkat absurditas Perl dalam evaluasi out-of-order - tapi itu yang diminta. Anda dengan serius memberi suara untuk jawaban yang benar?
Glenn Maynard
41
Ini jawaban yang benar untuk pertanyaan "Bagaimana cara saya menulis fungsi lambda yang memberi tahu saya jika nomornya genap?" Namun, ini bukan jawaban yang benar untuk pertanyaan yang awalnya diajukan OP. Namun banyak yang tidak seperti contoh saya dibikin, posting saya tidak , pada kenyataannya, jelas menjawab pertanyaan OP.
Robert Rossney
10
Sangat jelas bahwa siapa pun yang menyarankan "x% 2 == 0" - atau memilih komentar merekomendasikannya, yang membuat setidaknya tujuh orang - bahkan tidak membaca pertanyaan aslinya.
Glenn Maynard
40

mengapa Anda tidak mendefinisikan suatu fungsi saja?

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

benar-benar tidak ada pembenaran untuk menggunakan lambda dalam kasus ini.

SilentGhost
sumber
3
printbelum berfungsi dalam 2.6. :)
Lukáš Lalinský
7
@ Lukáš Lalinský: masih berfungsi di 2.x. itu akan diperlakukan sebagai sepasang kurung yang redundan
newacct
24
Anda tidak tahu kasus penggunaannya yang sebenarnya, jadi tidak mungkin Anda bisa mengatakan tidak ada alasan untuk menggunakan lambda.
Glenn Maynard
6
@ Glenn Maynard: Hampir tidak ada alasan untuk menggunakan lambda, titik. Menugaskan lambda ke variabel - sebagai pengganti untuk def- umumnya adalah Ide yang Sangat Buruk (tm). Cukup gunakan defsehingga pemrogram fana hanya bisa membaca, menafsirkan, memahami dan mempertahankannya.
S.Lott
17
Ada banyak penggunaan lambda yang sah. Jika Anda tidak dapat memikirkan apa pun, maka itu bukan kesalahan lambda. (Saya bukan penggemar sintaks itu sendiri, tentu saja - ini adalah solusi canggung untuk fakta bahwa sintaks lekukan Python yang kurang dipahami tidak dapat menangani fungsi inline seperti bahasa normal.)
Glenn Maynard
25

Mungkin baris python terburuk yang saya tulis sejauh ini:

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

Jika x == 2 Anda mencetak,

jika x! = 2 Anda menaikkan.

jimifiki
sumber
kudos, saya pikir ini adalah satu-satunya jawaban pada halaman yang benar-benar menjawab pertanyaan
theEpsilon
22

Anda dapat dengan mudah mengajukan pengecualian dalam lambda, jika itu yang benar-benar ingin Anda lakukan.

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

Apakah ini ide yang bagus? Naluri saya secara umum adalah membiarkan kesalahan melaporkan dari lambdas; biarkan memiliki nilai Tidak ada dan meningkatkan kesalahan pada pemanggil. Saya tidak berpikir ini inheren jahat, meskipun - saya menganggap sintaks "y jika x else z" itu sendiri lebih buruk - hanya pastikan Anda tidak mencoba terlalu banyak hal ke dalam tubuh lambda.

Glenn Maynard
sumber
1
Membesarkannya dalam penelepon mungkin adalah metode yang lebih cantik jika Anda bertanya kepada saya.
Dominic Bou-Samra
Mungkin, tetapi ini sangat tergantung pada kasus tertentu. Tentu saja, Anda juga dapat menghias lambda setelah membuatnya. x = RaiseValueErrorOnNone(x), sekali lagi, tergantung pada kasingnya.
Glenn Maynard
15

Lambdas in Python cukup membatasi sehubungan dengan apa yang Anda boleh gunakan. Secara khusus, Anda tidak dapat memiliki kata kunci (kecuali untuk operator seperti and, not, or, dll) di dalam tubuh mereka.

Jadi, tidak mungkin Anda bisa menggunakan lambda sebagai contoh (karena Anda tidak bisa menggunakan raise), tetapi jika Anda mau mengakui itu ... Anda bisa menggunakan:

f = lambda x: x == 2 and x or None
David Wolever
sumber
16
Batasan spesifik lambda adalah bahwa Anda tidak diperbolehkan menggunakan pernyataan, hanya ekspresi.
Daniel Werner
13

perhatikan Anda dapat menggunakan beberapa yang lain ... jika pernyataan dalam definisi lambda Anda:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1
filotn
sumber
2

Jika Anda masih ingin mencetak, Anda dapat mengimpor modul yang akan datang

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False
Juan Pablo Lopez
sumber
2

Anda juga dapat menggunakan Operator Logika untuk memiliki sesuatu seperti Conditional

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

Anda dapat melihat lebih banyak tentang Logical Operator di sini

Victor Lucas
sumber
Itu tidak sesuai dengan filosofi python dalam hal kejelasan. Meskipun secara logika setara, ifsintaks selalu lebih disukai daripada ini. Cara yang jelas untuk memeriksa kondisi.
0xc0de
Terima kasih! Saya menggunakan ini dalam sebuah karya bahasa fungsional di perguruan tinggi karena pembatasan yang diberlakukan profesor yang mengatakan bahwa saya tidak dapat menggunakan ifpernyataan, jadi saya menemukan ini dengan cara yang tidak jelas .
Victor Lucas
2

apa yang Anda butuhkan sebenarnya

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

sekarang panggil fungsi seperti yang Anda butuhkan

f(2)
f(3)
Manjunath Bhadrannavar
sumber
2

Cuplikan ini seharusnya membantu Anda:

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

print(x(40))
Adarsh ​​Somasundar
sumber
0

Kode contoh berikut berfungsi untuk saya. Tidak yakin apakah ini terkait langsung dengan pertanyaan ini, tetapi harap ini membantu dalam beberapa kasus lainnya.

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

Cobalah:

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

Di luar:

True
False
Benyamin Jafari
sumber
0

Cara mudah untuk melakukan if dalam lambda adalah dengan menggunakan daftar pemahaman.

Anda tidak dapat menaikkan pengecualian di lambda, tetapi ini adalah cara di Python 3.x untuk melakukan sesuatu yang dekat dengan contoh Anda:

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

Contoh lain:

kembalikan 1 jika M sebaliknya 0

f = lambda x: 1 if x=="M" else 0
Paul Cysne
sumber