ในpython 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
และถ้าเป็นเช่นนั้นจะทำอย่างไร?
ขอบคุณ
ในpython 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
แลมบ์ดาได้
if
ในแลมบ์ดาได้อย่างไร" ไม่ใช่ "วิธีที่ดีที่สุดในการเขียนแลมบ์ดาที่ส่งคืนค่า True หากตัวเลขเป็นเลขคู่?"
ทำไมคุณไม่กำหนดฟังก์ชั่น?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
ไม่มีเหตุผลที่แท้จริงที่จะใช้แลมบ์ดาในกรณีนี้
print
ยังไม่มีฟังก์ชั่นใน 2.6 :)
def
- โดยทั่วไปแล้วเป็นความคิดที่แย่มาก (tm) เพียงแค่ใช้def
โปรแกรมเมอร์ผู้ตายเท่านั้นที่สามารถอ่านตีความเข้าใจและดูแลรักษาได้
อาจเป็นงูหลามที่แย่ที่สุดที่ฉันเคยเขียน:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
ถ้า x == 2 คุณพิมพ์
ถ้า x! = 2 คุณเพิ่ม
คุณสามารถยกข้อยกเว้นได้อย่างง่ายดายในแลมบ์ดาถ้านั่นคือสิ่งที่คุณต้องการทำ
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
นี่เป็นความคิดที่ดีหรือไม่? สัญชาตญาณของฉันโดยทั่วไปคือการทิ้งข้อผิดพลาดในการรายงานจาก lambdas; ปล่อยให้มันมีค่าเป็นไม่มีและเพิ่มข้อผิดพลาดในการโทร ฉันไม่คิดว่านี่เป็นสิ่งที่ชั่วร้าย แต่ฉันคิดว่า "y if x else z" นั้นเลวร้ายยิ่งกว่าเดิม - ตรวจสอบให้แน่ใจว่าคุณไม่ได้พยายามยัดของแลมบ์ดามากเกินไป
x = RaiseValueErrorOnNone(x)
อีกครั้งขึ้นอยู่กับกรณี
Lambdas ใน Python ค่อนข้างเข้มงวดเกี่ยวกับสิ่งที่คุณได้รับอนุญาตให้ใช้ โดยเฉพาะคุณไม่สามารถมีคำหลักใด ๆ (ยกเว้นสำหรับผู้ประกอบการเช่นand
, not
,or
ฯลฯ ) ในร่างกายของพวกเขา
ดังนั้นจึงไม่มีวิธีที่คุณสามารถใช้แลมบ์ดาสำหรับตัวอย่างของคุณ (เพราะคุณไม่สามารถใช้raise
) แต่ถ้าคุณยินดีที่จะยอมรับในเรื่องนั้น ... คุณสามารถใช้:
f = lambda x: x == 2 and x or None
ทราบว่าคุณสามารถใช้อื่น ๆ ... ถ้างบในคำนิยามแลมบ์ดาของคุณ:
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
คุณยังสามารถใช้ตัวดำเนินการทางลอจิคัลเพื่อมีเงื่อนไขเช่น
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับผู้ประกอบการทางตรรกะได้ที่นี่
if
ไวยากรณ์ก็ยังดีกว่า ที่เห็นได้ชัดวิธีการตรวจสอบเงื่อนไข
if
คำสั่งเพื่อให้ฉันพบนี้ไม่ชัดเจนทาง
สิ่งที่คุณต้องการคือ
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))
รหัสตัวอย่างต่อไปนี้ใช้งานได้สำหรับฉัน ไม่แน่ใจว่าเกี่ยวข้องโดยตรงกับคำถามนี้หรือไม่ แต่หวังว่าจะช่วยได้ในบางกรณี
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
วิธีง่ายๆในการดำเนินการถ้าในแลมบ์ดาคือการใช้รายการความเข้าใจ
คุณไม่สามารถยกข้อยกเว้นในแลมบ์ดาได้ แต่นี่เป็นวิธีใน Python 3.x เพื่อทำบางสิ่งที่ใกล้เคียงกับตัวอย่างของคุณ:
f = lambda x: print(x) if x==2 else print("exception")
ตัวอย่างอื่น:
ส่งคืน 1 ถ้า M เป็นอย่างอื่น 0
f = lambda x: 1 if x=="M" else 0