क्या पायथन 3 में 'फॉरचेक' फंक्शन है?


139

जब मैं इस स्थिति को पूरा करता हूं तो मैं इसे जावास्क्रिप्ट में कर सकता हूं, मैं हमेशा सोचता हूं कि अगर कोई foreachफ़ंक्शन है तो यह सुविधा होगी। Foreach से मेरा मतलब है कि जो फ़ंक्शन नीचे वर्णित है:

def foreach(fn,iterable):
    for x in iterable:
        fn(x)

वे इसे हर तत्व पर करते हैं और कुछ उपज या वापस नहीं करते हैं, मुझे लगता है कि यह एक अंतर्निहित कार्य होना चाहिए और इसे शुद्ध पायथन के साथ लिखने की तुलना में अधिक तेज़ होना चाहिए, लेकिन मुझे यह सूची में नहीं मिला, या इसे सिर्फ एक और नाम कहा जाता है, या मैं यहाँ कुछ बिंदुओं को याद करता हूँ?

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

def fn(*args):
    for x in args:
       dosomething

लेकिन मुझे लगा कि दो तथ्यों के आधार पर अभी भी फॉर्च्यूनर का स्वागत है:

  1. सामान्य मामलों में, लोग केवल प्रदर्शन के बारे में परवाह नहीं करते हैं
  2. कुछ समय में एपीआई ने चलने योग्य वस्तु को स्वीकार नहीं किया और आप इसके स्रोत को फिर से नहीं लिख सकते।

3
केवल एक forलूप का उपयोग करने में क्या गलत है ?

1
यह वास्तव में forऐसा ही है।
user2357112

2
पाश के लिए कुछ भी गलत नहीं है, बस सुविधा के लिए
user2003548

6
@ user2357112, किसी सूची के आइटम के लिए किसी फ़ंक्शन को कॉल करने के लिए शॉर्टहैंड करना वांछनीय है। list.each(func)की तुलना में क्लीनर है for item in list: func(item), IMO। समस्या यह है कि पायथन ने कार्यात्मक पसंदीदा की जगह map()और filter()सूची समझ के साथ एक अच्छा काम किया है जो कि इसके बिल्ट-इन forऔर if(जो सजातीय और पठनीय हैं) का विस्तार करते हैं और एक विशिष्ट .each()इसके खिलाफ जा सकते हैं।
सेवको

sum(0 for _ in map(f, seq))एक पठनीय समाधान है।
जोहान्स शहाब -

जवाबों:


171

"Foreach" की प्रत्येक घटना मैंने देखी है (PHP, C #, ...) मूल रूप से "बयान" के लिए अजगर के समान है।

ये कमोबेश बराबर हैं:

// PHP:
foreach ($array as $val) {
    print($val);
}

// C#
foreach (String val in array) {
    console.writeline(val);
}

// Python
for val in array:
    print(val)

तो, हाँ, अजगर में एक "फॉर्च्यूनर" है। इसे "के लिए" कहा जाता है।

आप जो वर्णन कर रहे हैं वह एक "सरणी मानचित्र" फ़ंक्शन है। यह अजगर में सूची की समझ के साथ किया जा सकता है :

names = ['tom', 'john', 'simon']

namesCapitalized = [capitalize(n) for n in names]

5
यह मानचित्र () नहीं है, क्योंकि मानचित्र () सूची को जमा करता है और लौटाता है, जबकि foreach () नहीं करता है। यदि आप मदों की लंबी सूची से अधिक पुनरावृत्ति कर रहे हैं तो यह अंतर काफी महंगा हो सकता है। सहमत है कि (के लिए) चाल है।
Canuck

2
मैंने इसे फॉर-इन लूप के रूप में संदर्भित किया है।
वोक्स

5
उन्होंने समारोह के बारे में पूछा, लेकिन आपने वक्तव्य के साथ उत्तर दिया।
जोहान्स शहाब -

@ जोहान्सचैब-लिट बात यह है कि वह सही है ... अजगर में 'के लिए' का शाब्दिक अर्थ है 'foreach' को अन्य भाषाओं में जाना जाता है ... tcl for उदा 'a' for 'loop' कुछ इस तरह होगा {सामान की शुरुआत पर भाग गया लूप} {स्थिति यहां} {सामान जो प्रत्येक पुनरावृत्ति पर चलता है} {कमांड यहां ...} उदाहरण के लिए: {सेट x 1} {$ x <= 10} {incr x} {पुट $ x} आप अतिरिक्त भी जोड़ सकते हैं ';' का उपयोग करके पुनरावृत्ति ब्रेसिज़ के अंदर की जाँच करता है। मेरे लिए और अधिक समझ में आता है अगर वह पूछ रहा है कि क्या अजगर 'लूप के लिए एक सच्चे' था
फ्रांसिस्को

3
@Francisco मैं यह कहने में भी सही हूँ कि पृथ्वी समतल नहीं है। लेकिन मैं इसे एक जवाब के रूप में नहीं जोड़ूंगा।
जोहान्स शाउब -

49

अजगर के पास प्रतिforeach कथन नहीं है । यह भाषा में निर्मित लूप है।for

for element in iterable:
    operate(element)

यदि आप वास्तव में चाहते हैं, तो आप अपने स्वयं के foreachकार्य को परिभाषित कर सकते हैं :

def foreach(function, iterable):
    for element in iterable:
        function(element)

एक तरफ ध्यान दें कि for element in iterableसिंटैक्स एबीसी प्रोग्रामिंग भाषा से आता है , जो पायथन के प्रभावों में से एक है।


14
यदि आप मैपिंग के परिणाम के बजाय साइड-इफेक्ट्स के लिए ऐसा कर रहे हैं, तो mapइस तरह से उपयोग करना वास्तव में पायथन 3 में काम नहीं करने वाला है जहां mapआलसी है। यही है, यह अब एक पुनरावृत्त लौटाता है, न कि पहले से गणना की गई सूची। जब तक आप परिणामी सूची के माध्यम से पुनरावृत्ति नहीं करेंगे तब तक दुष्प्रभाव नहीं होंगे।
लॉरेंस गोन्साल्व्स

यह सच है और निश्चित रूप से एक वैध बिंदु है, लेकिन सवाल यह है कि ओपी शायद ऐसी सूक्ष्मताओं से चिंतित नहीं है।
फिलिप क्लाउड

@LaurenceGonsalves धन्यवाद। मैंने पायथन 3 में पहला उदाहरण सही बनाने के लिए संपादित किया है।
फिलिप क्लाउड

यह बदसूरत है, यह लगभग forलूप जितना लंबा है , और यदि चलने योग्य लंबा है (शायद अनंत) या फ़ंक्शन रिटर्न मान बड़े हैं, तो यह ए के साथ टूट जाता है MemoryError
user2357112

क्या बदसूरत है? पहला उदाहरण? ज़रूर, लेकिन यह सवाल का जवाब देता है। मैंने केवल एक सादे forलूप कार्यों का उपयोग करने का उल्लेख किया है , साथ ही सूची की समझ भी।
फिलिप क्लाउड

31

अन्य उदाहरण:

अजगर फोर्क लूप:

array = ['a', 'b']
for value in array:
    print(value)
    # a
    # b

लूप के लिए पायथन:

array = ['a', 'b']
for index in range(len(array)):
    print("index: %s | value: %s" % (index, array[index]))
    # index: 0 | value: a
    # index: 1 | value: b

9

map प्रश्न में वर्णित स्थिति के लिए इस्तेमाल किया जा सकता है।

उदाहरण के लिए

map(len, ['abcd','abc', 'a']) # 4 3 1

ऐसे कार्यों के लिए जो कई तर्क देते हैं, मानचित्र के लिए अधिक तर्क दिए जा सकते हैं:

map(pow, [2, 3], [4,2]) # 16 9

यह अजगर 2.x में एक सूची देता है और अजगर 3 में एक पुनरावृत्ति करता है

यदि आपका कार्य कई तर्कों को लेता है और तर्क पहले से ही tuples (या अजगर 2.6 के बाद से किसी भी चलने योग्य) के रूप में हैं itertools.starmap। (जो आप के लिए देख रहे थे एक बहुत ही समान वाक्य रचना है)। यह एक पुनरावृत्ति देता है।

उदाहरण के लिए

for num in starmap(pow, [(2,3), (3,2)]):
    print(num)

हमें 8 और 9 देता है


3
mapऔर foreachअलग अर्थ है। mapपरिणाम की सूची लौटाता है (जिसका तात्पर्य है कि एक सूची, या एक गणना योग्य संरचना, या एक ऐसी संरचना, जिसका उपभोग किया जाएगा, और इसलिए इसे तुरंत नहीं कहा जाता है), foreachपरिणाम की अनदेखी करते हुए प्रत्येक आइटम पर फ़ंक्शन को कॉल करता है।
njzk2

1
Foreachimediately परिणाम वापस करना चाहिए। यह कहना कि फ़ॉरचैट के बजाय इटरेटर बनाना कुल बकवास है।
थोड़ा विदेशी

map()जब परिणाम को नजरअंदाज किया जाता है तो उपयोग करना एक विरोधी पैटर्न है। आपको इसके बजाय लूप के लिए उपयोग करना चाहिए।
ओडी ५३५३३

1
mapपरिणामों का उपयोग करना और अनदेखा करना पायथन 3 में अवांछित परिणामों का उत्पादन करेगा क्योंकि mapअब आलसी का मूल्यांकन केवल तब किया जाता है जब परिणामी सूची का उपभोग किया जाता है। यदि परिणाम का mapकभी उपभोग नहीं किया जाता है, तो कॉल कभी लागू नहीं होते हैं।
दिमित्री बी।


5

हां, हालांकि यह लूप के लिए समान सिंटैक्स का उपयोग करता है।

for x in ['a', 'b']: print(x)

दुर्भाग्य से यह नहीं हैforEach
nehem

@nehem यदि आप चाहें तो इसे एक फंक्शन में लपेटें।
केवमैन

@nehem प्रश्न देखें
गुफाओं का आदमी

2

अगर मैं आपको सही समझ रहा हूं, तो आपका मतलब है कि यदि आपके पास कोई फ़ंक्शन 'फंक' है, तो आप सूची में प्रत्येक आइटम के लिए जांचना चाहते हैं कि क्या फंक (आइटम) सही है; यदि आप सभी के लिए सही हैं, तो कुछ करें।

आप 'सभी' का उपयोग कर सकते हैं।

उदाहरण के लिए: मैं सूची में सभी प्रमुख संख्याओं को 0-10 की श्रेणी में लाना चाहता हूं:

from math import sqrt
primes = [x for x in range(10) if x > 2 and all(x % i !=0 for i in range(2, int(sqrt(x)) + 1))]

2

पायथन में तत्व अनुक्रमित के साथ - साथ "फॉर्च" निर्माण का उदाहरण यहां दिया गया है :

for idx, val in enumerate([3, 4, 5]):
    print (idx, val)

1

देखो इस लेख । NumPy 1.6 में पेश किया गया खसखस पैकेज से इटैटर ऑब्जेक्ट nditer , एक व्यवस्थित फैशन में एक या एक से अधिक सरणियों के सभी तत्वों का दौरा करने के लिए कई लचीले तरीके प्रदान करता है।

उदाहरण:

import random
import numpy as np

ptrs = np.int32([[0, 0], [400, 0], [0, 400], [400, 400]])

for ptr in np.nditer(ptrs, op_flags=['readwrite']):
    # apply random shift on 1 for each element of the matrix
    ptr += random.choice([-1, 1])

print(ptrs)

d:\>python nditer.py
[[ -1   1]
 [399  -1]
 [  1 399]
 [399 401]]

1

आप रख सकते हैं आप सिर्फ एक अधिक संक्षिप्त वाक्य रचना के लिए देख रहे हैं के लिए एक पंक्ति में पाश:

array = ['a', 'b']
for value in array: print(value)

बस एक अर्धविराम के साथ अतिरिक्त बयानों को अलग करें।

array = ['a', 'b']
for value in array: print(value); print('hello')

यह आपके स्थानीय शैली मार्गदर्शक के अनुरूप नहीं हो सकता है, लेकिन जब आप कंसोल में इधर-उधर खेल रहे होते हैं, तो यह इस तरह से समझ में आता है।


0

मुझे लगता है कि यह आपके प्रश्न का उत्तर देता है, क्योंकि यह "प्रत्येक के लिए" लूप की तरह है।
नीचे दी गई स्क्रिप्ट अजगर में मान्य है (संस्करण 3.8):

a=[1,7,77,7777,77777,777777,7777777,765,456,345,2342,4]
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.