Mengapa mencetak tidak berfungsi di lambda?

163

Mengapa ini tidak berhasil?

lambda: print "x"

Apakah ini bukan pernyataan tunggal, atau itu sesuatu yang lain? Dokumentasi tampaknya sedikit tentang apa yang diperbolehkan dalam ...

Anycorn
sumber
1
docs.python.org/reference/expressions.html#lambda . Itu mengatakan "ekspresi", yang merupakan tautan ke definisi lengkap dari semua ekspresi yang mungkin. Bagaimana ini "jarang"? Apa yang salah atau tidak lengkap?
S.Lott
3
@ Banyak Saya salah paham tentang apa ekspresi / pernyataan dan di mana cetakan berada. masuk akal sekarang
Anycorn

Jawaban:

187

lambdaTubuh A harus berupa ekspresi tunggal . Dalam Python 2.x, printadalah pernyataan. Namun, dalam Python 3, printadalah fungsi (dan aplikasi fungsi adalah ekspresi, sehingga akan berfungsi di lambda). Anda dapat (dan seharusnya, untuk kompatibilitas maju :) menggunakan fungsi cetak porting belakang jika Anda menggunakan Python 2.x terbaru:

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
sumber
5
Sekarang saya mengerti mengapa itu menjadi masalah besar untuk membuatnya berfungsi. Ingin menggunakan cetak sebagai kwarg default dan ini memperbaikinya. Terima kasih.
Thomas Dignan
1
Bolehkah saya tahu mengapa from __future__ import print_functionharus berada di awal kode? thx
Ben
Di mana saya akan melihat cetakan dari apa yang telah kami tulis di sini?
Sk. Irfan
Saya setuju dengan komentar Ben: Saya tidak mendapatkan impor ini. Python (2 atau 3) memiliki print()metode bawaan.
ivanleoncz
27

Dalam kasus di mana saya menggunakan ini untuk mematikan sederhana saya menggunakan ini:

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

yang bekerja dengan sempurna.

Danny Staple
sumber
3
Sebagai catatan tambahan - gunakan dari masa depan di atas. Gunakan ini hanya di tempat yang tidak tersedia - yang akan menjadi versi yang benar-benar ketinggalan zaman sekarang.
Danny Staple
24

setara dengan apa yang Anda tulis

def anon():
    return print "x"

yang juga menghasilkan SyntaxError, python tidak membiarkan Anda menetapkan nilai untuk mencetak dalam 2.xx; di python3 bisa dibilang

lambda: print('hi')

dan itu akan berhasil karena mereka telah mengubah cetak menjadi fungsi alih-alih pernyataan.

dagoof
sumber
3
Ada juga from __future__ import print_function, yang memungkinkan ini di py2.x
tzaman
5
Atau sebagai alternatiflambda: sys.stdout.write('hi')
fmark
@ tanda: Kecuali itu tidak sesederhana itu di 2.x: Anda perlu menangani sys.stdout.softspace dan (setidaknya) menulis baris baru sesudahnya.
Fred Nurk
11

Tubuh lambda harus berupa ekspresi yang mengembalikan nilai. print, menjadi pernyataan, tidak mengembalikan apa pun, bahkan tidak None. Demikian pula, Anda tidak dapat menetapkan hasil printke variabel:

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax

Anda juga tidak dapat menempatkan tugas variabel dalam lambda, karena tugas adalah pernyataan:

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax
Paul Kuliniewicz
sumber
11

Anda dapat melakukan sesuatu seperti ini.

Buat fungsi untuk mengubah pernyataan cetak menjadi fungsi:

def printf(text):
   print text

Dan cetak:

lambda: printf("Testing")
Victor C. Martins
sumber
Lebih fleksibel:def printf(fmt, *args): print(fmt % args)
IvyMike
4

Dengan Python 3.x, cetak BISA bekerja di lambda, tanpa mengubah semantik lambda.

Digunakan dengan cara khusus ini sangat berguna untuk debugging. Saya memposting 'jawaban terlambat' ini, karena ini adalah trik praktis yang sering saya gunakan.

Misalkan lambda Anda yang 'tidak memiliki informasi' adalah:

lambda: 4

Maka lambda 'yang diinstrumentasi' Anda adalah:

lambda: (print (3), 4) [1]
Jacques de Hooge
sumber
3

Tubuh lambda harus berupa ekspresi tunggal . printadalah pernyataan, jadi itu keluar, sayangnya.

tzaman
sumber
terima kasih, saya tidak yakin tentang definisi ekspresi versus pernyataan, sekarang masuk akal
Anycorn
2

Di sini , Anda melihat jawaban untuk pertanyaan Anda. printbukan ekspresi dalam Python, katanya.

vpit3833
sumber
1
Jawaban tidak lengkap, tapi tautannya bagus.
Stephen