2015-09-19 10 views
5

के बजाय मैं अजगर में एक नौसिखिया हूं, और मैं लैम्ब्डा कार्यों के साथ खेल रहा था। मैं लैम्ब्डा फ़ंक्शन का उपयोग करके एक प्रोग्राम लिख रहा था जो अक्षर वर्णों को प्रिंट करने के लिए इनपुट वर्णों के एसीआईआई मान को +1 करता है। मेरा कोडपाइथन लैम्ब्डा फ़ंक्शन प्रिंटिंग <फ़ंक्शन <lambda> 0x7fcbbc740668 पर मूल्य

#!/usr/bin/python 
import sys 
try: 
    word = sys.argv[1] 
except: 
    print "No arguments passed" 
    sys.exit(1) 

def convert_ascii(char): 
    return "".join(chr(ord(char) + 1)) 

for i in word: 
    print convert_ascii(i) 
    print lambda x: chr(ord(i) + 1) 

मेरे पास एक फ़ंक्शन कन्वर्ट_एएससीआई है जो लैम्ब्डा जैसा ही काम करता है। हालांकि, मेरा आउटपुट

/usr/bin/python2.7 /home/user1/PycharmProjects/test/Tut1/asciipl2.py "abc def ghi" 
b 
<function <lambda> at 0x7f0310160668> 
c 
<function <lambda> at 0x7f0310160668> 
d 
<function <lambda> at 0x7f0310160668> 
! 
<function <lambda> at 0x7f0310160668> 
e 
<function <lambda> at 0x7f0310160668> 
f 
<function <lambda> at 0x7f0310160668> 
g 
<function <lambda> at 0x7f0310160668> 
! 
<function <lambda> at 0x7f0310160668> 
h 
<function <lambda> at 0x7f0310160668> 
i 
<function <lambda> at 0x7f0310160668> 
j 
<function <lambda> at 0x7f0310160668> 

इस स्क्रिप्ट का उद्देश्य लैम्ब्डा सीख रहा है, हालांकि इस कार्यक्रम को करने के अन्य तरीके हैं। कृपया मुझे बताएं कि मैं क्या गलत कर रहा हूं। निकास कोड 0

उत्तर

6

आप फ़ंक्शन को कॉल नहीं कर रहे हैं। यह वही है जैसे आपने print convert_ascii(i) के बजाय print convert_ascii लिखा था।

प्रयास करें

print (lambda x: chr(ord(x) + 1))(i) 

ध्यान दें कि मैं समारोह शरीर में ord(x) को ord(i) बदल दिया है।

+1

हालांकि ध्यान दें कि इस मामले में लैम्ब्डा बेकार है। इस उत्तर में कोड 'प्रिंट (सीआर (ord (x) + 1) के बराबर है)' – Atsch

+2

ओपी का यह उद्देश्य सीखना है कि लैम्ब्डा अभिव्यक्ति कैसे काम करती है। इसका उपयोग करने के लिए * उचित * कहां है, इस विशेष प्रश्न के लिए विषय-वस्तु है। – chepner

+0

हालांकि मैंने लैम्ब्डा कार्यों में एक्स के बजाय मुझे उपयोग किया, परिणाम भी वही था। लैम्ब्डा में, मैंने var को var के रूप में स्वीकार किया, लेकिन मैं इसे फिर से चालू कर दिया, और फिर भी यह काम करता था। कोई विचार क्यों? – pkill

3

वर्तमान में आप एक फ़ंक्शन ऑब्जेक्ट प्रिंट कर रहे हैं। आपको फ़ंक्शन को कॉल करना होगा।

एक चर में फ़ंक्शन प्राप्त करें और उसे पैरामीटर के साथ कॉल करें।

for i in word: 
    print convert_ascii(i) 
    fun=lambda x: chr(ord(x) + 1) 
    print fun(some_arg) 
+2

सही। लेकिन एक परिवर्तनीय रूप में लैम्ब्डा को सहेजना एक नामित फ़ंक्शन बनाना है जो लैम्ब्डा विचार के विपरीत है। उदाहरण के लिए, QuantifiedCode.com सेवा इसे एक चेतावनी उठाते हुए विरोधी पैटर्न के रूप में मानती है। –

+3

आपको फ़ंक्शन को एक चर को असाइन करने की आवश्यकता नहीं है; 'प्रिंट (लैम्ब्डा एक्स: सीआर (ord (x) + 1)) (i) 'वही काम करता है। – chepner

+1

एक लैम्ब्डा एक शाब्दिक कार्य है। यह गुमनाम होना नहीं है।एक समान रूप से अच्छी तरह से कह सकता है कि एक शाब्दिक स्ट्रिंग या शाब्दिक संख्या का नाम देना एक "विरोधी पैटर्न" है। – saulspatz

1

आप फ़ंक्शन को स्वयं प्रिंट करने की कोशिश कर रहे हैं। इसके बजाय, फ़ंक्शन को एक चर में असाइन करें, और चरम पर पैरामीटर पास करें, या प्रिंट के भीतर ही इसका उपयोग करें।

for i in word: 
    z = lambda x: chr(ord(x) + 1) 
    print z(i) 

या

for i in word: 
    print (lambda x: chr(ord(x) + 1))(i) 

या नक्शे में जानने के लिए, आप नक्शे उपयोग कर सकते हैं एक ही परिणाम

for i in word: 
    print "".join(map(lambda x: chr(ord(x) + 1), i)) 
+0

उसे कभी नहीं पता था। धन्यवाद – pkill

+0

सूची की सूची किसी उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन को मैप करने से अधिक कुशल होती है: '[chr (ord (x) + 1) शब्द में x के लिए] '। – chepner

+0

धन्यवाद chepner। मैंने प्रतिलिपि बनाई, और इसलिए मैंने ध्यान नहीं दिया। बदला हुआ। – nohup

2

लैम्ब्डा कीवर्ड एक गुमनाम फ़ंक्शन प्राप्त करने के लिए:

>>> func = lambda x: x+1 
>>> print(func) 
<function <lambda> at 0x7f0310160668> 
उपरोक्त

है (व्यवहार की गणना नहीं ing परदे जादू) के बराबर:

>>> def func(x): 
     return x+1 

>>> print(func) 
<function func at 0x7fa73d3e6bf8> 

समारोह, लैम्ब्डा आह्वान है या नहीं करने के लिए, आप अभी भी इसे कॉल करनी होगी:

>>> print(func) 
<function <lambda> at 0x7f0310160668> 
>>> func(123) 
124 

जिसके अनुसार, lambdas बहुत अच्छी तरह से करने के लिए उपयुक्त नहीं हैं इस स्थिति, और बेहतर तरीके से उपयोग किया जाता है यदि किसी फ़ंक्शन या निर्माण को एक छोटा फ़ंक्शन चाहिए।

>>> word = "spam" 
>>> map(lamda x: chr(ord(x) + 1), word) 
+0

@chepner, हाँ, बस उसे पकड़ लिया। ओपी के उदाहरण में बदल जाएगा। हां, सूची की समझ बेहतर होगी। – Atsch

संबंधित मुद्दे