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 ...
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 ...
Jawaban:
lambda
Tubuh A harus berupa ekspresi tunggal . Dalam Python 2.x, print
adalah pernyataan. Namun, dalam Python 3, print
adalah 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
from __future__ import print_function
harus berada di awal kode? thx
print()
metode bawaan.
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.
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.
from __future__ import print_function
, yang memungkinkan ini di py2.x
lambda: sys.stdout.write('hi')
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 print
ke 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
Anda dapat melakukan sesuatu seperti ini.
Buat fungsi untuk mengubah pernyataan cetak menjadi fungsi:
def printf(text):
print text
Dan cetak:
lambda: printf("Testing")
def printf(fmt, *args): print(fmt % args)
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]