পাইথন 3 তে কি 'ফোরচ' ফাংশন আছে?


139

আমি যখন জাভাস্ক্রিপ্টে পরিস্থিতিটি পূরণ করতে পারি তখন আমি সবসময় মনে করি যদি কোনও 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জন্য হয়।
ব্যবহারকারী 2357112

2
লুপের জন্য
কোনও অসুবিধে নেই

6
@ ব্যবহারকারী 2357112, তালিকার আইটেম প্রতি একবার ফাংশন কল করার জন্য শর্টহ্যান্ড থাকা বাঞ্ছনীয়। আইএমও এর list.each(func)চেয়ে পরিষ্কার for item in list: func(item)। সমস্যাটি হ'ল পাইথন ফাংশনাল ফেভারিটগুলিকে পছন্দ করার মতো map()এবং filter()তালিকা বোঝার সাথে প্রতিস্থাপনের জন্য ভাল কাজ করেছে যা কেবল তার অন্তর্নির্মিত forএবং if(যা সমজাতীয় এবং পঠনযোগ্য) প্রসারিত করে এবং একটি নির্দিষ্ট এর .each()বিরুদ্ধে যেতে পারে।
সেভকো

sum(0 for _ in map(f, seq))একটি পঠনযোগ্য workaround।
জোহানেস স্কাউব - লিটব

উত্তর:


171

"ফরচ" এর প্রতিটি ঘটনা আমি দেখেছি (পিএইচপি, সি #, ...) মূলত "স্টেটমেন্ট" এর জন্য অজগর হিসাবে একই রকম হয়।

এগুলি কম বেশি সমতুল্য:

// 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
এটি মানচিত্র () নয়, কারণ মানচিত্র () সংগ্রহ করে একটি তালিকা প্রদান করে, যখন পূর্বাভাস () দেয় না। আপনি যদি আইটেমগুলির দীর্ঘ তালিকার উপরে পুনরাবৃত্তি করেন তবে পার্থক্যটি বেশ ব্যয়বহুল হতে পারে। সম্মত হয়েছে যে () এর জন্য কৌশলটি করে।
কানক

2
আমি এটিকে ইন- লুপ হিসাবে উল্লেখ করেছি ।
ভক্স

5
তারা ফাংশন সম্পর্কে জিজ্ঞাসা করেছিল, কিন্তু আপনি জবাব দিয়েছিলেন।
জোহানেস স্কাউব - লিটব

@ জোহানেস শ্যাব-লিটব জিনিসটি তিনি ঠিক বলেছেন ... 'অজগরের জন্য' আক্ষরিক অর্থেই 'ফোরচ' অন্যান্য ভাষায় পরিচিত ... যেমন টিসিএল তে 'লুপ' এর জন্য এমন কিছু হবে {স্টাফ শুরুতে দৌড়েছিল লুপ} {শর্ত এখানে} {স্টাফ যা প্রতিটি পুনরাবৃত্তির উপর চলে} {কমান্ডগুলি এখানে ...} যেমন: {সেট x 1} {x <= 10} r incr x} {puts uts x for এর জন্য আপনি অতিরিক্ত যুক্ত করতে পারেন ';' ব্যবহার করে পুনরাবৃত্তির ধনুর্বন্ধনীগুলির ভিতরে পরীক্ষা করে। আমার কাছে আরও বোঝা যাবে যে তিনি যদি এখানে এসে জিজ্ঞাসা করেন অজগরটির সত্য 'লুপের জন্য' আছে
ফ্রান্সিসকো

3
@ ফ্রেঞ্চিসকো আমি এও বলেছি যে পৃথিবী সমতল নয়। তবে আমি এটিকে উত্তর হিসাবে যুক্ত করব না।
জোহানেস স্কাউব - 18:44

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অলস। এটি, এটি এখন একটি পুনরাবৃত্তি প্রদান করে, ইতিমধ্যে গণনা করা তালিকা নয়। ফলাফলের তালিকার মাধ্যমে আপনি পুনরাবৃত্তি না করা পর্যন্ত পার্শ্ব-প্রতিক্রিয়াগুলি ঘটবে না।
লরেন্স গনসাল্ভেস

এটি সত্য এবং অবশ্যই একটি বৈধ পয়েন্ট, তবে প্রশ্নটি পরামর্শ দেয় যে ওপি সম্ভবত এই জাতীয় সূক্ষ্মতার সাথে উদ্বিগ্ন নয়।
ফিলিপ মেঘ

ধন্যবাদ পাইথন ৩.
ফিলিপ ক্লাউড

এটি কুৎসিত, এটি forলুপের মতো প্রায় দীর্ঘ এবং যদি পুনরাবৃত্তীয় দীর্ঘ হয় (সম্ভবত অসীম) বা ফাংশনের রিটার্ন মানগুলি বড় হয় তবে এটি একটি দিয়ে ব্রেক হয় MemoryError
ব্যবহারকারী 2357112

কুরুচিপূর্ণ কি? প্রথম উদাহরণ? অবশ্যই, তবে এটি প্রশ্নের উত্তর দেয়। আমি কেবল একটি সরল forলুপের কাজগুলি, পাশাপাশি তালিকাগুলিও ব্যবহার করে উল্লেখ করেছি mentioned
ফিলিপ মেঘ

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

এটি পাইথন ২.x এর একটি তালিকা এবং পাইথন ৩-এ একটি পুনরাবৃত্তি প্রদান করে

যদি আপনার ফাংশনটি একাধিক যুক্তি নেয় এবং আর্গুমেন্টগুলি ইতিমধ্যে টিপলস আকারে (বা পাইথন ২.6 থেকে কোনও পুনরাবৃত্ত) আপনি ব্যবহার করতে পারেন itertools.starmap। (যা আপনি যা চেয়েছিলেন তার সাথে খুব মিলের সিনট্যাক্স রয়েছে)। এটি একটি পুনরাবৃত্তি প্রদান করে।

যেমন

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

আমাদের 8 এবং 9 দেয়


3
mapএবং foreachবিভিন্ন অর্থ আছে। mapফলাফলের তালিকা সরবরাহ করে (যা বোঝায় একটি তালিকা তৈরি করা, বা একটি প্রচুর পরিমাণ কাঠামো, বা এমন একটি কাঠামো যা গ্রাস করা হবে, এবং তাই এখনই বলা হয় না), foreachফলাফলকে উপেক্ষা করে প্রতিটি আইটেমের ফাংশনটি কল করে।
njzk2

1
Foreachউদ্দেশ্যমূলকভাবে ফলাফলটি ফেরত দিতে হবে। বলছেন যে পূর্বাভাসের পরিবর্তে পুনরাবৃত্তি তৈরি করা পছন্দ করা মোট ক্র্যাপ।
ছোট এলিয়েন

map()ফলাফল উপেক্ষা করার সময় ব্যবহার করা একটি বিরোধী-নিদর্শন। পরিবর্তে লুপের জন্য আপনার ব্যবহার করা উচিত।
odie5533

1
mapফলাফলগুলি ব্যবহার করা এবং উপেক্ষা করা পাইথন 3 এ অনাকাঙ্ক্ষিত ফলাফল আনবে কারণ mapফলাফলের তালিকাটি গ্রাস করার পরে এখন অলসভাবে মূল্যায়ন করা হয়। যদি এর ফলাফলটি mapকখনও গ্রাস না করা হয় তবে কলগুলি কখনই প্রয়োগ করা হয় না।
দিমিত্রি বি।


5

হ্যাঁ, যদিও এটি লুপের জন্য একই বাক্য গঠন ব্যবহার করে।

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

দুর্ভাগ্যক্রমে এটি নয়forEach
নেহেম

আপনি যদি চান তবে @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

তাকান এই নিবন্ধটিনমপি প্যাকেজ থেকে পুনরুক্তি করা অবজেক্ট এনডিটার , নুমপি 1.6-এ প্রবর্তিত, নিয়মিত পদ্ধতিতে এক বা একাধিক অ্যারের সমস্ত উপাদান দেখার জন্য অনেক নমনীয় উপায় সরবরাহ করে।

উদাহরণ:

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)")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.