ทำไมไม่พิมพ์งานแลมบ์ดา?


163

ทำไมมันไม่ทำงาน

lambda: print "x"

นี่ไม่ใช่คำสั่งเดียวหรือเป็นอย่างอื่นใช่ไหม เอกสารดูเหมือนกระจัดกระจายเล็กน้อยในสิ่งที่ได้รับอนุญาตในแลมบ์ดา ...


1
docs.python.org/reference/expressions.html#lambda มันบอกว่า "expression" ซึ่งเป็นลิงค์ไปยังนิยามที่สมบูรณ์ของนิพจน์ที่เป็นไปได้ทั้งหมด สิ่งนี้ "กระจัดกระจาย" เป็นอย่างไร อะไรที่ไม่ถูกต้องหรือไม่สมบูรณ์
S.Lott

3
@Lott ฉันเข้าใจผิดว่านิพจน์ / คำสั่งคืออะไรและพิมพ์อยู่ที่ไหน มันสมเหตุสมผลแล้ว
Anycorn

คำตอบ:


187

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

5
ตอนนี้ฉันเห็นแล้วว่าทำไมมันถึงเป็นเรื่องใหญ่ที่ทำให้มันเป็นฟังก์ชั่น ต้องการใช้การพิมพ์เป็นค่าเริ่มต้น kwarg และสิ่งนี้ได้รับการแก้ไข ขอบคุณ
Thomas Dignan

1
ฉันขอทราบได้ไหมว่าทำไมfrom __future__ import print_functionต้องเป็นจุดเริ่มต้นของรหัส ขอบคุณ
Ben

ฉันจะดูภาพสิ่งที่เราเขียนที่นี่ได้ที่ไหน
. Irfan

ฉันเห็นด้วยกับความคิดเห็นของเบ็น: ฉันไม่ได้รับการนำเข้านี้ Python (2 หรือ 3) มีprint()วิธีการในตัว
ivanleoncz

27

ในกรณีที่ฉันใช้สิ่งนี้เพื่อขัดออกฉันใช้สิ่งนี้:

fn = lambda x: sys.stdout.write(str(x) + "\n")

ซึ่งทำงานได้อย่างสมบูรณ์แบบ


3
ในฐานะที่เป็นบันทึกเพิ่มเติม - ใช้จากอนาคตข้างต้น ใช้สิ่งนี้เฉพาะในกรณีที่ไม่สามารถใช้ได้ - ซึ่งจะเป็นรุ่นที่ล้าสมัยอย่างจริงจังในขณะนี้
Danny Staple

24

สิ่งที่คุณเขียนเทียบเท่ากับ

def anon():
    return print "x"

ซึ่งผลลัพธ์ใน SyntaxError, python ไม่อนุญาตให้คุณกำหนดค่าให้พิมพ์ใน 2.xx; ใน python3 คุณสามารถพูดได้

lambda: print('hi')

และมันจะทำงานได้เพราะพวกเขาเปลี่ยนการพิมพ์เป็นฟังก์ชั่นแทนที่จะเป็นคำสั่ง


3
นอกจากนี้ยังมีfrom __future__ import print_functionซึ่งเปิดใช้งานสิ่งนี้ใน py2.x
tzaman

5
หรืออีกทางเลือกหนึ่งlambda: sys.stdout.write('hi')
fmark

@fmark: ยกเว้นว่าไม่ใช่เรื่องง่ายใน 2.x: คุณต้องจัดการ sys.stdout.softspace และ (อย่างน้อย) เขียนบรรทัดใหม่หลังจากนั้น
เฟร็ด Nurk

11

เนื้อความของแลมบ์ดาต้องเป็นนิพจน์ที่คืนค่า เป็นคำสั่งที่ไม่ได้อะไรกลับมาไม่ได้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

11

คุณสามารถทำอะไรเช่นนี้

สร้างฟังก์ชั่นเพื่อแปลงคำสั่งการพิมพ์เป็นฟังก์ชัน:

def printf(text):
   print text

และพิมพ์:

lambda: printf("Testing")

ยืดหยุ่นมากขึ้น:def printf(fmt, *args): print(fmt % args)
IvyMike

4

ด้วย Python 3.x การพิมพ์สามารถทำงานในแลมบ์ดาโดยไม่ต้องเปลี่ยนซีแมนทิกส์ของแลมบ์ดา

ใช้วิธีพิเศษนี้มีประโยชน์มากสำหรับการแก้ไขข้อบกพร่อง ฉันโพสต์นี้ 'ตอบช้า' เพราะมันเป็นกลอุบายที่ฉันมักใช้

สมมติว่าแลมบ์ดา 'ไม่มีเอกสาร' ของคุณคือ:

lambda: 4

แลมบ์ดา 'ของคุณ' คือ:

lambda: (print (3), 4) [1]

3

ร่างกายของแลมบ์ดาจะต้องมีความเป็นหนึ่งเดียวแสดงออก printเป็นคำสั่งดังนั้นมันออกมาน่าเสียดาย


ขอบคุณฉันไม่แน่ใจเกี่ยวกับคำจำกัดความของการแสดงออกเมื่อเทียบกับคำสั่งตอนนี้มันทำให้รู้สึก
Anycorn

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.