2011-10-13 6 views
21

मैं कुछ है कि कार्यात्मक इस के बराबर है क्या करने की जरूरत:क्या पाइथन का नक्शा फ़ंक्शन कॉल ऑब्जेक्ट सदस्य फ़ंक्शन कर सकता है?

for foo in foos: 
    bar = foo.get_bar() 
    # Do something with bar 

मेरी पहली वृत्ति map उपयोग करने के लिए था, लेकिन इस काम नहीं किया:

for bar in map(get_bar, foos): 
    # Do something with bar 

क्या मैं पूरा करने के लिए कोशिश कर रहा हूँ है map के साथ संभव है? क्या मुझे इसकी बजाय एक सूची समझ का उपयोग करने की ज़रूरत है? इसके लिए सबसे पाइथनिक मुहावरे क्या है?

+3

आप केवल सूची समझ का उपयोग क्यों नहीं करेंगे? – agf

उत्तर

35

या तो lambda साथ:

for bar in map(lambda foo: foo.get_bar(), foos): 

या methodcaller साथ:

import operator 
get_bar = operator.methodcaller('get_bar') 
for bar in map(get_bar, foos): 

या एक जनरेटर अभिव्यक्ति के साथ:

for bar in (foo.get_bar() for foo in foos): 
+8

वे पाइथोनिक कैसे हैं के विपरीत क्रम में। – agf

+12

इसके अलावा, 'मानचित्र (Foo.get_bar, foos)' जहां 'foo'' foos' में ऑब्जेक्ट्स का वर्ग है। – agf

+0

मैंने लैम्ब्डा के साथ जाने का फैसला किया क्योंकि मुझे एहसास हुआ कि मुझे इस परिवर्तन को कोड में दो स्थानों पर करने की ज़रूरत है, और 'बार को स्ट्रिंग और कम करने की आवश्यकता है। :) –

7

आप operator.methodcaller() चाहते हैं। या, ज़ाहिर है, एक सूची या जनरेटर समझ।

+0

मुझे लगता है कि पाइथन के नए संस्करणों में सूची की समझ को प्राथमिकता दी जाती है, है ना? यदि आप मेरे उदाहरण के लिए एलसी का उपयोग करके नमूना कोड शामिल करने के लिए इसे अपडेट करते हैं तो मुझे आपके उत्तर को स्वीकार करने में खुशी होगी। :) –

+0

@ जोशग्लोवर "पायथन के नए संस्करण"? वे कम से कम 2.3 पर वापस जाते हैं। – agf

+0

पायथन 2.0 में सूची समझें शामिल की गईं। –

1

यह संशोधित कोड काम करेगा:

for bar in map(lambda f: f.get_bar(), foos): 
# Do something with bar 

आप यहां लैम्ब्डा फ़ंक्शन प्रदान करते हैं। बस get_bar प्रदान नहीं करता है क्योंकि यह केवल कक्षा (f.get_bar()) के उदाहरण के माध्यम से पहुंच योग्य है, कभी भी स्वयं ही नहीं।

1

आप लैम्ब्डा उपयोग कर सकते हैं

for bar in map(lambda foo: foo.get_bar(), foos): 
    # Do something with bar 
1

मुझे लगता है कि स्पष्ट तरीका -loop पूरी तरह से for छोड़ और एक सूची समझ का उपयोग करने के लिए है:

bars = [foo.get_bar() for foo in foos] 

इस उत्तर में कुछ दूसरे के करीब है उत्तर लेकिन इसमें भिन्नता है कि सूची वास्तव में वापस आती है और बाद के लूप में उपयोग नहीं की जाती है। bars के साथ आप जो करते हैं उसके आधार पर, आप वहां एक सूची समझ का उपयोग करने में सक्षम हो सकते हैं।

मुझे नहीं लगता कि maplambdas के साथ फ़ंक्शन कणिका पठनीय हैं, map के लिए ओवरहेड के अलावा काफी महत्वपूर्ण है।

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