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


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.


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.


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.


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.


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

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

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

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


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)


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.