Có cách nào để thực hiện nếu if trong trò chơi lambda của python


358

Trong python 2.6 , tôi muốn làm:

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

Đây rõ ràng không phải là cú pháp. Có thể thực hiện một iftrong lambdavà nếu vậy làm thế nào để làm điều đó?

cảm ơn


2
Bạn không thể in hoặc nuôi trong lambda. Lambdas chỉ là chức năng, thay vào đó bạn có thể sử dụng một chức năng.
Lennart Regebro

10
Tôi không đông y vơi bạn. Tôi cần 4 hàm khác nhau, rất ngắn như hàm trên cần được đưa vào danh sách / từ điển để tôi có thể lặp lại chúng và chọn những hàm nào sẽ sử dụng trong mỗi lần lặp. Thay vì nhiều dòng mã chỉ inits, trước khi lặp, bản thân tôi có thể đưa nó xuống chỉ còn 4 dòng mã init. Càng ít càng tốt ..
Guy

5
4 dòng mã không phải là một giải pháp đáng khen ngợi khi người khác phải đọc, giải thích, hiểu và duy trì mã. Hơn nữa, vấn đề "in / nâng cao" trong ví dụ cho thấy điều này không thể và không nên được thực hiện trong lambdas.
S.Lott

@LennartRegebro lambdas không phải là chức năng của python, chúng chỉ là biểu thức, đó là lý do tại sao có nhiều điều bạn không thể làm với chúng.
Aaron McMillin

1
@AaronMcMillin Lambdas là các chức năng. Chúng bị giới hạn trong các biểu thức vì lý do cú pháp, nhưng chúng là các hàm.
Lennart Regebro

Câu trả lời:


660

Cú pháp bạn đang tìm kiếm:

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

Nhưng bạn không thể sử dụng printhoặc raisetrong lambda.


33
trong python 3, bạn có thể sử dụng in
đệ quy

11
Chắc chắn, nhưng câu hỏi là "làm thế nào để tôi sử dụng iftrong lambda?" không phải "cách tốt nhất để viết lambda trả về True nếu số chẵn là gì?"
Robert Rossney

99
Đó là một cú pháp khủng khiếp - dễ dàng là cấu trúc ngôn ngữ Python tồi tệ nhất, tiếp cận mức độ vô lý của Perl trong đánh giá không theo thứ tự của nó - nhưng đó là những gì được yêu cầu. Bạn đang nghiêm túc bỏ phiếu trả lời cho đúng?
Glenn Maynard

41
Đây là câu trả lời chính xác cho câu hỏi "Làm thế nào để tôi viết hàm lambda cho tôi biết nếu một số chẵn?" Tuy nhiên, đây không phải là một câu trả lời chính xác cho câu hỏi mà OP ban đầu hỏi. Tuy nhiên nhiều bạn không giống như ví dụ tôi contrived, bài viết của tôi không , trên thực tế, trả lời rõ ràng câu hỏi của OP.
Robert Rossney

10
Rõ ràng là bất cứ ai đề xuất "x% 2 == 0" - hoặc bỏ phiếu nhận xét đề xuất nó, điều này khiến ít nhất bảy người - thậm chí không đọc câu hỏi ban đầu.
Glenn Maynard

40

Tại sao bạn không chỉ định nghĩa một chức năng?

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

thực sự không có lý do nào để sử dụng lambda trong trường hợp này.


3
printchưa phải là một chức năng trong 2.6. :)
Lukáš Lalinský

7
@ Lukáš Lalinský: nó vẫn hoạt động trong 2.x. nó sẽ được coi là một cặp dấu ngoặc thừa
newacct

24
Bạn không biết trường hợp sử dụng thực tế của anh ấy, vì vậy không có cách nào bạn có thể nói không có lý do để sử dụng lambda.
Glenn Maynard

6
@Glenn Maynard: Hầu như không có lý do để sử dụng lambda, kỳ. Việc gán lambda cho một biến - như là một thay thế def- nói chung là một ý tưởng rất tệ (tm). Chỉ cần sử dụng một deflập trình viên đơn thuần để có thể đọc, giải thích, hiểu và duy trì nó.
S.Lott

17
Có rất nhiều sử dụng hợp pháp của lambdas. Nếu bạn không thể nghĩ ra bất kỳ điều gì, thì đó không phải là lỗi của lambda. (Tôi không phải là fan hâm mộ của cú pháp riêng của mình, tất nhiên - đó là một workaround vụng về cho một thực tế rằng Python kém thai nghén thụt đầu dòng cú pháp không thể xử lý các chức năng inline như ngôn ngữ bình thường.)
Glenn Maynard

25

Có lẽ là dòng trăn tồi tệ nhất tôi đã viết cho đến nay:

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

Nếu x == 2 bạn in,

nếu x! = 2 bạn tăng.


Kudos, tôi nghĩ rằng đây là câu trả lời duy nhất trên trang thực sự trả lời câu hỏi
theEpsilon

22

Bạn có thể dễ dàng đưa ra một ngoại lệ trong lambda, nếu đó là điều bạn thực sự muốn làm.

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

Đây có phải là một ý tưởng tốt? Bản năng của tôi nói chung là để lại lỗi báo cáo ra khỏi lambdas; hãy để nó có giá trị là Không và tăng lỗi trong trình gọi. Tuy nhiên, tôi không nghĩ rằng điều này là xấu xa - tôi coi cú pháp "y if x other z" tệ hơn - chỉ cần đảm bảo rằng bạn không cố gắng nhét quá nhiều vào cơ thể lambda.


1
Tăng nó trong một người gọi có lẽ là phương pháp đẹp hơn nếu bạn hỏi tôi.
Đaminh Bou-Samra

Có thể, nhưng nó phụ thuộc rất nhiều vào trường hợp cụ thể. Tất nhiên, bạn cũng có thể trang trí lambda sau khi tạo nó. x = RaiseValueErrorOnNone(x), một lần nữa, tùy trường hợp.
Glenn Maynard

15

Lambdas trong Python khá hạn chế đối với những gì bạn được phép sử dụng. Đặc biệt, bạn không thể có bất kỳ từ khóa (trừ các nhà khai thác thích and, not, or, vv) trong cơ thể của họ.

Vì vậy, không có cách nào bạn có thể sử dụng lambda cho ví dụ của mình (vì bạn không thể sử dụng raise), nhưng nếu bạn sẵn sàng thừa nhận điều đó thì bạn có thể sử dụng:

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

16
Hạn chế cụ thể của lambda là bạn không được phép sử dụng các câu lệnh, chỉ các biểu thức.
Daniel Werner

13

lưu ý bạn có thể sử dụng một số khác ... nếu các câu trong định nghĩa lambda của bạn:

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

2

Nếu bạn vẫn muốn in, bạn có thể nhập mô-đun trong tương lai

from __future__ import print_function

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

2

Bạn cũng có thể sử dụng Toán tử logic để có một cái gì đó giống như một điều kiện

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

Bạn có thể xem thêm về Toán tử logic tại đây


Nó không đi với triết lý của python về sự rõ ràng. Mặc dù tương đương về mặt logic, ifcú pháp luôn được ưu tiên hơn cái này. Cách rõ ràng để kiểm tra điều kiện.
0xc0de

Cảm ơn bạn! Tôi đã sử dụng nó trong một công việc của ngôn ngữ chức năng ở trường đại học vì những hạn chế mà giáo sư đã áp đặt, người nói rằng tôi không thể sử dụng iftuyên bố, vì vậy tôi thấy điều này không rõ ràng .
Victor Lucas

2

những gì bạn cần chính xác là

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

Bây giờ gọi hàm theo cách bạn cần

f(2)
f(3)

2

Đoạn trích này sẽ giúp bạn:

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

print(x(40))

0

Mã mẫu sau đây làm việc cho tôi. Không chắc chắn nếu nó liên quan trực tiếp đến câu hỏi này, nhưng hy vọng nó sẽ giúp trong một số trường hợp khác.

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

0

Thử nó:

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

Ngoài:

True
False

0

Một cách dễ dàng để thực hiện nếu trong lambda là sử dụng tính năng hiểu danh sách.

Bạn không thể đưa ra một ngoại lệ trong lambda, nhưng đây là một cách trong Python 3.x để làm một cái gì đó gần với ví dụ của bạn:

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

Một vi dụ khac:

trả về 1 nếu M khác 0

f = lambda x: 1 if x=="M" else 0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.