ทำไมมันไม่ทำงาน
lambda: print "x"
นี่ไม่ใช่คำสั่งเดียวหรือเป็นอย่างอื่นใช่ไหม เอกสารดูเหมือนกระจัดกระจายเล็กน้อยในสิ่งที่ได้รับอนุญาตในแลมบ์ดา ...
ทำไมมันไม่ทำงาน
lambda: print "x"
นี่ไม่ใช่คำสั่งเดียวหรือเป็นอย่างอื่นใช่ไหม เอกสารดูเหมือนกระจัดกระจายเล็กน้อยในสิ่งที่ได้รับอนุญาตในแลมบ์ดา ...
คำตอบ:
lambda
ร่างกายจะต้องมีการแสดงออกเดียว ใน Python 2.x print
เป็นคำสั่ง อย่างไรก็ตามใน Python 3 print
เป็นฟังก์ชั่น (และแอปพลิเคชันฟังก์ชั่นเป็นการแสดงออกดังนั้นมันจะทำงานในแลมบ์ดา) คุณสามารถ (และควร, เพื่อความเข้ากันได้ไปข้างหน้า :) ใช้ฟังก์ชั่นการพิมพ์ย้อนกลับหากคุณใช้ Python 2.x รุ่นล่าสุด:
In [1324]: from __future__ import print_function
In [1325]: f = lambda x: print(x)
In [1326]: f("HI")
HI
from __future__ import print_function
ต้องเป็นจุดเริ่มต้นของรหัส ขอบคุณ
print()
วิธีการในตัว
ในกรณีที่ฉันใช้สิ่งนี้เพื่อขัดออกฉันใช้สิ่งนี้:
fn = lambda x: sys.stdout.write(str(x) + "\n")
ซึ่งทำงานได้อย่างสมบูรณ์แบบ
สิ่งที่คุณเขียนเทียบเท่ากับ
def anon():
return print "x"
ซึ่งผลลัพธ์ใน SyntaxError, python ไม่อนุญาตให้คุณกำหนดค่าให้พิมพ์ใน 2.xx; ใน python3 คุณสามารถพูดได้
lambda: print('hi')
และมันจะทำงานได้เพราะพวกเขาเปลี่ยนการพิมพ์เป็นฟังก์ชั่นแทนที่จะเป็นคำสั่ง
from __future__ import print_function
ซึ่งเปิดใช้งานสิ่งนี้ใน py2.x
lambda: sys.stdout.write('hi')
เนื้อความของแลมบ์ดาต้องเป็นนิพจน์ที่คืนค่า เป็นคำสั่งที่ไม่ได้อะไรกลับมาไม่ได้print
None
คุณไม่สามารถกำหนดผลลัพธ์print
ให้กับตัวแปรในทำนองเดียวกัน:
>>> x = print "hello"
File "<stdin>", line 1
x = print "hello"
^
SyntaxError: invalid syntax
คุณยังไม่สามารถกำหนดตัวแปรในแลมบ์ดาได้เนื่องจากการกำหนดค่าเป็นข้อความสั่ง:
>>> lambda y: (x = y)
File "<stdin>", line 1
lambda y: (x = y)
^
SyntaxError: invalid syntax
คุณสามารถทำอะไรเช่นนี้
สร้างฟังก์ชั่นเพื่อแปลงคำสั่งการพิมพ์เป็นฟังก์ชัน:
def printf(text):
print text
และพิมพ์:
lambda: printf("Testing")
def printf(fmt, *args): print(fmt % args)
ด้วย Python 3.x การพิมพ์สามารถทำงานในแลมบ์ดาโดยไม่ต้องเปลี่ยนซีแมนทิกส์ของแลมบ์ดา
ใช้วิธีพิเศษนี้มีประโยชน์มากสำหรับการแก้ไขข้อบกพร่อง ฉันโพสต์นี้ 'ตอบช้า' เพราะมันเป็นกลอุบายที่ฉันมักใช้
สมมติว่าแลมบ์ดา 'ไม่มีเอกสาร' ของคุณคือ:
lambda: 4
แลมบ์ดา 'ของคุณ' คือ:
lambda: (print (3), 4) [1]
ร่างกายของแลมบ์ดาจะต้องมีความเป็นหนึ่งเดียวแสดงออก print
เป็นคำสั่งดังนั้นมันออกมาน่าเสียดาย