2013-09-23 8 views
12

पाइथन में रूबी के Array.each विधि के बराबर क्या है? क्या पाइथन के लिए एक अच्छा और छोटा बंद/लैम्ब्डा वाक्यविन्यास है?रूबी Array.each विधि

[1,2,3].each do |x| 
    puts x 
end 

उत्तर

28

करता अजगर इसके लिए एक अच्छा और कम बंद/लैम्ब्डा वाक्य रचना है?

हाँ, लेकिन आप इसे इस मामले में नहीं चाहते हैं।

कि रूबी कोड के सबसे करीब बराबर है:

new_values = map(print, [1, 2, 3]) 

यह सुंदर अच्छा लग रहा है जब आप पहले से ही एक समारोह के आसपास झूठ बोल रही है, print की तरह है। आप केवल किसी स्वैच्छिक अभिव्यक्ति है और आप map में इसका उपयोग करना चाहते हैं, तो आप इस प्रकार का def या एक lambda साथ इसे से बाहर एक समारोह बनाने के लिए, की जरूरत है:

new_values = map(lambda x: print(x), [1, 2, 3]) 

कुरूपता आप जाहिरा तौर पर बचना चाहते है कि ।

new_values = [print(x) for x in values] 

हालांकि, इस मामले में, तुम बस, प्रत्येक मान के लिए कुछ बयान पर अमल प्रत्येक मान के लिए नए मूल्यों को जमा नहीं करने के लिए कोशिश कर रहे हैं: और अजगर यह से बचने के लिए एक अच्छा तरीका है: comprehensions। इसलिए, यह काम करेगा (आप None मानों की एक सूची वापस प्राप्त करेंगे), यह निश्चित रूप से बेवकूफ नहीं है।

for x in values: 
    print x 
+0

यह शायद सबसे अच्छा और सबसे पूरा उत्तर है क्योंकि वास्तव में इस सवाल में बताए गए लैम्ब्स के मुद्दों को संबोधित किया गया था, जिसका मेरा जवाब नहीं था। +1 – Shashank

+1

धन्यवाद। आप हर बिंदु पर हिट करते थे जिसके बारे में मैं सोच रहा था। – BuddyJoe

+0

यह संभवतः यह इंगित करने लायक है कि मेरे विशिष्ट उदाहरण केवल पायथन 3.x (या, 2.6-2.7 में, यदि आप __future__ आयात print_function' से करते हैं) में काम करते हैं; हो सकता है कि मुझे 'sys.stdout.write' या कुछ' प्रिंट 'के बदले 'puts' के बदले समकक्ष के रूप में कुछ इस्तेमाल किया जाना चाहिए ... लेकिन अगर आप सब कुछ समझ गए हैं, तो मुझे लगता है कि यह काफी अच्छा है। – abarnert

12

सबसे मुहावरेदार:

for x in [1,2,3]: 
    print x 
2

आप एक सरणी से अधिक vectorized अंकगणित के लिए numpy उपयोग कर सकते हैं:

इस मामले में, ऐसा करना सही यह स्पष्ट रूप से नहीं बंद किया जाना, कोई काम करता है, कोई comprehensions, बस एक पाश लिखने के लिए:

>>> import numpy as np 
>>> a = np.array([1, 2, 3]) 
>>> a * 3 
array([3, 6, 9]) 

आप आसानी से एक लैम्ब्डा कि एक सरणी के प्रत्येक तत्व से अधिक इस्तेमाल किया जा सकता परिभाषित कर सकते हैं:

>>> array_lambda=np.vectorize(lambda x: x * x) 
>>> array_lambda([1, 2, 3]) 
array([1, 4, 9]) 

लेकिन जैसा कि अन्य ने कहा है, अगर आप केवल प्रत्येक को मुद्रित करना चाहते हैं, तो लूप का उपयोग करें।

0

ऐसे पुस्तकालय भी हैं जो ऑब्जेक्ट को सभी सामान्य कार्यात्मक प्रोग्रामिंग सामग्री का पर्दाफाश करने के लिए लपेटते हैं।

जैसे pydash आप इस तरह काम करने के लिए अनुमति देता है:

>>> from pydash import py_ 
>>> from __future__ import print_function 
>>> x = py_([1,2,3,4]).map(lambda x: x*2).each(print).value() 
2 
4 
6 
8 
>>> x 
[2, 4, 6, 8] 

(बस हमेशा अंत में करने के लिए "ट्रिगर" निष्पादन और/या .value() साथ अन-लपेट लपेट मूल्यों के लिए याद!)

+0

मुझे इस तरह के कोड लिखने के बारे में व्यक्तिगत रूप से क्या पसंद है यह है कि यह बाएं से दाएं पढ़ता है। डेटा/मूल्य प्रवाह का पालन करना आसान है। –

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