लंबोदर में काम क्यों नहीं छपता?


163

यह काम क्यों नहीं करता है?

lambda: print "x"

क्या यह एक कथन नहीं है, या यह कुछ और है? एक मेमने में अनुमति दी गई है पर प्रलेखन थोड़ा विरल लगता है ...


1
docs.python.org/reference/expressions.html#lambda । यह "अभिव्यक्ति" कहता है, जो सभी संभावित अभिव्यक्तियों की एक पूरी परिभाषा की एक कड़ी है। यह "विरल" कैसे है? क्या गलत था या अधूरा?
S.Lott

3
@ मुझे इस बात की गलतफहमी थी कि अभिव्यक्ति / कथन क्या है और प्रिंट कहां है। यह अब समझ में आता है
एनकॉर्न

जवाबों:


187

एक lambdaशरीर की एक ही अभिव्यक्ति होनी चाहिए । पायथन 2.x में, printएक बयान है। हालाँकि, पायथन 3 में, printएक फंक्शन है (और एक फंक्शन एप्लिकेशन एक एक्सप्रेशन है, इसलिए यह एक लैम्ब्डा में काम करेगा)। अगर आप नवीनतम पायथन 2.x का उपयोग कर रहे हैं, तो आप (और आगे की संगतता के लिए) बैक-पोर्टेड प्रिंट फ़ंक्शन का उपयोग कर सकते हैं।

In [1324]: from __future__ import print_function

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

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

5
अब मैं देखता हूं कि इसे एक समारोह बनाने के लिए इतनी बड़ी बात क्यों थी। एक डिफ़ॉल्ट kwarg के रूप में प्रिंट का उपयोग करना चाहते थे और इसने इसे ठीक कर दिया। धन्यवाद।
थॉमस डिगन

1
क्या मुझे पता है कि from __future__ import print_functionकोड की शुरुआत में क्यों होना चाहिए? thx
बेन

मैं यहां जो कुछ भी लिखा है उसके प्रिंट्स को कहां देखूंगा?
स्क। इरफान

मैं बेन की टिप्पणी से सहमत हूं: मुझे यह आयात नहीं मिला। पायथन (2 या 3) print()में अंतर्निहित विधि है।
ivanleoncz

27

ऐसे मामलों में जहां मैं इसे सरल स्टबिंग के लिए उपयोग कर रहा हूं मैं इसका उपयोग करता हूं:

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

जो पूरी तरह से काम करता है।


3
एक अतिरिक्त नोट के रूप में - ऊपर से भविष्य का उपयोग करें। इसे केवल उसी जगह पर उपयोग करें जहां यह उपलब्ध नहीं है - जो अभी गंभीर रूप से पुराना है।
डैनी स्टेपल

24

आपने जो लिखा है वह उसके बराबर है

def anon():
    return print "x"

जिसके परिणामस्वरूप सिंटेक्सएर्रर भी होता है, अजगर आपको 2.xx में प्रिंट करने के लिए एक मान प्रदान नहीं करता है; python3 में आप कह सकते हैं

lambda: print('hi')

और यह काम करेगा क्योंकि उन्होंने एक बयान के बजाय एक फ़ंक्शन होने के लिए प्रिंट बदल दिया है।


3
वहाँ भी है from __future__ import print_function, जो इस py2.x में सक्षम बनाता है
tzaman

5
या वैकल्पिक रूप सेlambda: sys.stdout.write('hi')
चिह्नित करें

@ चिह्न: सिवाय इसके कि 2.x में यह सरल नहीं है: आपको sys.stdout.softspace को हैंडल करने की आवश्यकता है और (कम से कम) बाद में एक नई पंक्ति लिखें।
फ्रेड नर्क

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

पाइथन 3.x के साथ, प्रिंट कैन लैम्बडा में काम कर सकते हैं, लैम्बडा के शब्दार्थ को बदले बिना।

डिबगिंग के लिए एक विशेष तरीके से उपयोग किया जाता है। मैं यह 'देर से जवाब' पोस्ट करता हूं, क्योंकि यह एक व्यावहारिक चाल है जिसका मैं अक्सर उपयोग करता हूं।

मान लीजिए कि आपका 'अनइंस्टाल्ड' लंबोदर है:

lambda: 4

तब आपका 'वाद्य' लंबोदर है:

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

3

लंबोदर के शरीर की एक ही अभिव्यक्ति होनी है । printएक बयान है, तो यह दुर्भाग्य से बाहर है।


धन्यवाद, मैं अभिव्यक्ति बनाम कथन की परिभाषा के बारे में निश्चित नहीं था, अब यह समझ में आता है
एनिकॉर्न

2

यहाँ , आप अपने प्रश्न का उत्तर देखते हैं। printयह पायथन में अभिव्यक्ति नहीं है, यह कहता है।


1
अधूरा जवाब, लेकिन अच्छा लिंक।
स्टीफन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.