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 ...


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

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.


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.


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

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")

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]

3

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


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.


1
Jawaban tidak lengkap, tapi tautannya bagus.
Stephen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.