Neden bir lambda'da baskı işi yapmıyor?


163

Bu neden çalışmıyor?

lambda: print "x"

Bu tek bir ifade değil mi, yoksa başka bir şey mi? Belgeler, lambda'da izin verilenler üzerinde biraz seyrek görünüyor ...


1
docs.python.org/reference/expressions.html#lambda . Olası tüm ifadelerin tam tanımına bir bağlantı olan "ifade" der. Bu nasıl "seyrek"? Yanlış veya eksik olan neydi?
S.Lott

3
@Lott İfadenin / ifadenin ne olduğu ve baskının nereye ait olduğu konusunda yanlış anlaşıldım. şimdi mantıklı
Anycorn

Yanıtlar:


187

Bir lambdabedeninin tek bir ifade olması gerekir . Python 2.x'te printbir deyimdir. Bununla birlikte, Python 3'te printbir işlevdir (ve bir işlev uygulaması bir ifadedir, bu yüzden bir lambdada çalışacaktır). En son Python 2.x kullanıyorsanız, ileriye dönük uyumluluk için :) geri taşınan yazdırma işlevini kullanabilirsiniz (ve kullanmalısınız):

In [1324]: from __future__ import print_function

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

In [1326]: f("HI")
HI

5
Şimdi onu bir işlev haline getirmenin neden bu kadar önemli olduğunu anlıyorum. Yazdırmayı varsayılan kwarg olarak kullanmak istedim ve bu düzeltildi. Teşekkürler.
Thomas Dignan

1
Neden from __future__ import print_functionkodun başında olması gerektiğini biliyor muyum ? thx
Ben

Burada yazdıklarımızın baskılarını nerede görebilirim?
Sk. Irfan

Ben'in yorumuna katılıyorum: Bu ithalatı alamıyorum. Python (2 veya 3) print()yerleşik bir metoda sahiptir.
ivanleoncz

27

Bu basit saplama için kullanıyorum durumlarda ben bunu kullanın:

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

hangi mükemmel çalışır.


3
Ek bir not olarak - yukarıdaki gelecekten kullanın. Bunu yalnızca şu anda mevcut olmayan bir yerde kullanın; bu, şu anda ciddi bir şekilde güncel olmayan bir sürüm olacaktır.
Danny Staple

24

yazdıklarınız eşdeğerdir

def anon():
    return print "x"

SyntaxError ile sonuçlanan python, 2.xx içinde yazdırmak için bir değer atamanıza izin vermez; python3'te diyebilirsin

lambda: print('hi')

ve yazdırmayı bir ifade yerine bir işlev olarak değiştirdikleri için işe yarayacaktı.


3
Ayrıca from __future__ import print_function, py2.x
tzaman

5
Veya alternatiflambda: sys.stdout.write('hi')
fmark

@fmark: 2.x'te o kadar basit olmasa da: sys.stdout.softspace ile başa çıkmanız ve (en azından) daha sonra yeni bir satır yazmanız gerekir.
Fred Nurk

11

Bir lambda'nın gövdesi, değer döndüren bir ifade olmalıdır. print, bir ifade olmak, hiçbir şey döndürmez, hatta None. Benzer şekilde, sonucunu printbir değişkene atayamazsınız :

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

Ayrıca atamalar ifadeler olduğu için lambda'ya değişken atama koyamazsınız:

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

11

Böyle bir şey yapabilirsiniz.

Print deyimini bir işleve dönüştürmek için bir işlev oluşturun:

def printf(text):
   print text

Ve yazdırın:

lambda: printf("Testing")

Daha esnek:def printf(fmt, *args): print(fmt % args)
IvyMike

4

Python 3.x ile, baskı lambda anlamını değiştirmeden lambda içinde çalışabilir.

Özel bir şekilde kullanıldığında bu hata ayıklama için çok kullanışlıdır. Bu 'geç cevabı' gönderiyorum, çünkü sıklıkla kullandığım pratik bir numara.

'Gösterişsiz' lambda'nızın:

lambda: 4

O zaman 'enstrümanlı' lambda:

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

3

Bir lambda'nın gövdesi tek bir ifade olmalıdır . printbir ifade, bu yüzden ne yazık ki çıktı.


teşekkür ederim, ifadenin ifadeye karşı tanımından emin değildim, şimdi mantıklı
Anycorn

2

Burada sorunuzun yanıtını görüyorsunuz. printdiyor ki, Python'da ifade değil.


1
Eksik cevap, ancak hoş bir bağlantı.
Stephen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.