Map – ফ্রি পাইথন কোর্স ২০২০ – ক্লাস ২৭

map, filter এবং reduce হ’ল কার্যকরী প্রোগ্রামিংয়ের দৃষ্টান্ত। তারা প্রোগ্রামারকে সহজ এবং সংক্ষিপ্ত কোড লেখার অনুমতি দেয়, অগত্যা লুপ এবং ব্রাঞ্চিংয়ের মতো জটিলতা সম্পর্কে বিরক্ত হওয়া ছাড়াই।

মূলত, এই তিনটি ফাংশন আপনাকে একটি সম্পূর্ণ সাফল্যে কয়েকটি পুনরাবৃত্তি জুড়ে একটি ফাংশন প্রয়োগ করতে দেয়। পাইথনের সাথে map এবং filter অন্তর্নির্মিত হয় ( __builtins__ মডিউলে) এবং কোনও ইম্পোর্ট এর প্রয়োজন হয় না। তবে reduce ব্যবহার করতে ইম্পোর্ট করা দরকার কারণ এটি functools মডিউলে থাকে। আসুন map দিয়ে শুরু করে তারা কীভাবে সমস্ত কাজ করে সে সম্পর্কে আরও ভালভাবে বুঝতে পারি।

Map

পাইথনের map() ফাংশনে নিম্নলিখিত বাক্য গঠন রয়েছে:

map(func, *iterables)

এখানে func হল সেই ফাংশন যার উপর ইটারেবলস এর প্রতিটি উপাদান প্রয়োগ করা হবে। ইটারেবলস এর উপর তারকাচিহ্ন (*) লক্ষ্য করুন? এর অর্থ এটি যতটা সম্ভব ইটারেবলস থাকতে পারে, এখনও পর্যন্ত func প্রয়োজনীয় ইনপুট আর্গুমেন্টের মতো সঠিক সংখ্যা রয়েছে। আমরা একটি উদাহরণে এগিয়ে যাওয়ার আগে, আপনার নিম্নলিখিতগুলি নোট করা গুরুত্বপূর্ণ:

  • পাইথন 2-এ, map() ফাংশন একটি লিস্ট রিটার্ন করে। পাইথন 3-তে, ফাংশনটি একটি map অবজেক্ট দেয় যা জেনারেটর অবজেক্ট। একটি লিস্ট হিসাবে ফলাফল পেতে, অন্তর্নির্মিত list() ফাংশন map অবজেক্টে কল করা যেতে পারে। অর্থাৎ list(map(func, *iterables))
  • ফানকে আর্গুমেন্টের সংখ্যা অবশ্যই তালিকাবদ্ধ ইটারেবল এর সংখ্যা হতে হবে।

নীচের উদাহরণগুলির সাথে এই নিয়মগুলি কীভাবে কার্যকর হয় তা দেখুন।

ধরুন, আমার কাছে আমার প্রিয় পোষা প্রাণীর নামগুলির একটি লিস্ট (ইটারেবল) আছে, সমস্ত ছোট হাতের এবং আমার বড় হাতের অক্ষরে এগুলি প্রয়োজন। ঐতিহ্যগতভাবে, সাধারণ পাইথোনিংয়ে আমি এই জাতীয় কিছু করব:

my_pets = ['alfred', 'tabitha', 'william', 'arla']
uppered_pets = []

for pet in my_pets:
    pet_ = pet.upper()
    uppered_pets.append(pet_)

print(uppered_pets)

ফলাফল:

['ALFRED', 'TABITHA', 'WILLIAM', 'ARLA']

যা তখন আউটপুট করবে [‘ALFRED’, ‘TABITHA’, ‘WILLIAM’, ‘ARLA’]

map() ফাংশন সহ, এটি কেবল সহজ নয়, এটি আরও অনেক নমনীয়ও। যেমন:

# Python 3
my_pets = ['alfred', 'tabitha', 'william', 'arla']

uppered_pets = list(map(str.upper, my_pets))

print(uppered_pets)

ফলাফল:

['ALFRED', 'TABITHA', 'WILLIAM', 'ARLA']

যা একই ফলাফল আউটপুট হবে। নোট করুন যে উপরের সংজ্ঞায়িত map() সিনট্যাক্স ব্যবহার করে, এই ক্ষেত্রে ফানক হ’ল str.upper এবং ইটারেবলগুলি my_pets তালিকা – কেবল একটি ইটারেবল। এছাড়াও নোট করুন যে আমরা str.upper ফাংশনটি কল করি নি (এটি করে: str.upper()), যেমন map ফাংশনটি আমাদের জন্য my_pets তালিকার প্রতিটি উপাদানকে দেয়।

আরও লক্ষণীয় যে, str.upper ফাংশনটির সংজ্ঞা অনুসারে কেবল একটি আর্গুমেন্টের প্রয়োজন এবং তাই আমরা এটিতে কেবল একটি ইটারেবল পাস করেছি। সুতরাং, আপনি যে ফাংশনটি পার করছেন তার জন্য যদি দুটি, তিনটি, বা n আর্গুমেন্টের প্রয়োজন হয়, তবে আপনাকে এটিতে দুটি, তিন বা n ইটারেবল করতে হবে। আমি এটি আরও একটি উদাহরণ দিয়ে স্পষ্ট করি।

পাইথন ইতিমধ্যে আমাদের round() অন্তর্নির্মিত ফাংশন দিয়ে আশীর্বাদ করে যা দুটি আর্গুমেন্ট গ্রহণ করে – সংখ্যাকে round(দশমিক থেকে পূর্ণসংখ্যা) করার জন্য সংখ্যা এবং দশমিক স্থানের সংখ্যা। সুতরাং, যেহেতু ফাংশনটিতে দুটি আর্গুমেন্ট প্রয়োজন, আমাদের দুটি ইটারেবল পাস করতে হবে।

# Python 3

circle_areas = [3.56773, 5.57668, 4.00914, 56.24241, 9.01344, 32.00013]

result = list(map(round, circle_areas, range(1,7)))

print(result)

ফলাফল:

[3.6, 5.58, 4.009, 56.2424, 9.01344, 32.00013]

round(1,7) ফাংশনটি রাউন্ড ফাংশনের দ্বিতীয় আর্গুমেন্ট হিসাবে কাজ করে (ইটারেবল প্রয়োজনীয় দশমিক স্থানের সংখ্যা)। সুতরাং যেমন প্রথম ইটারেবল এর সময় map টি circle_areas মাধ্যমে ইটারেট করে, circle_areas প্রথম উপাদানটি 3.56773 এর সাথে প্রথম range(1,7), 1 দিয়ে বৃত্তাকার হয়ে যায়, এটি কার্যকরভাবে round(3.56773, 1) হয়ে যায়। দ্বিতীয় ইটারেবল এর সময়, circle_areas এর দ্বিতীয় উপাদান, 5.57668 এর সাথে পরিসরের দ্বিতীয় উপাদান (1,7), 2 কে round এ পাস করা হয় যার ফলে এটি round(5.57668, 2) হয়। circle_areas তালিকার শেষ না হওয়া পর্যন্ত এটি ঘটে।

আমি নিশ্চিত যে আপনি ভাবছেন: “আমি যদি প্রথম ইটারেবল এর দৈর্ঘ্যের চেয়ে কম বা তার চেয়ে বেশি মান পাস করি তবে, আমি যদি range(1,3) বা range(1, 9999) পাস করি তবে কী হবে? উপরের ফাংশনটিতে দ্বিতীয় ইটারেবল “। এবং উত্তরটি সহজ: কিছুই না! ঠিক আছে, এটা সত্য নয়। “কিছুই নয়” এই অর্থে ঘটে যে map() ফাংশনটি কোনও ব্যতিক্রম বাড়িয়ে তুলবে না, যতক্ষণ না এটি ফাংশনটির জন্য দ্বিতীয় আর্গুমেন্ট খুঁজে না পায় ততক্ষণ এটি উপাদানগুলির উপরে ইটারেট করবে, যেখানে এটি কেবল থামবে এবং ফলাফলটি প্রত্যাবর্তন করবে।

সুতরাং, উদাহরণস্বরূপ, যদি আপনি ফলাফল = list(map(round, circle_areas, range(1,3%)) মূল্যায়ন করেন তবে আপনি circle_areas এর দৈর্ঘ্য এবং range(1,3) দৈর্ঘ্য হিসাবে কোনও ত্রুটি পাবেন না পার্থক্য থাকার পরেও, পাইথন এটি করে: এটি circle_areas এর প্রথম উপাদান এবং range(1,3) এর প্রথম উপাদান নেয় এবং এটি round কে পাস করে দেয়।

round এটি মূল্যায়ন করে ফলাফল সংরক্ষণ করে। তারপরে এটি দ্বিতীয় ইটারেবলে যায়, circle_areas দ্বিতীয় উপাদান এবং range(1,3) এর দ্বিতীয় উপাদান , আবার এটি সংরক্ষণ করে। এখন, তৃতীয় পুনরাবৃত্তিতে (circle_areas এর একটি তৃতীয় উপাদান রয়েছে), পাইথন circle_areas এর তৃতীয় উপাদান নেয় এবং তারপরে range(1,3) এর তৃতীয় উপাদান নেওয়ার চেষ্টা করে তবে range(1,3) যেহেতু তৃতীয় উপাদান নয় , পাইথন কেবল থেমে যায় এবং ফলাফলটি দেয়, যা এক্ষেত্রে কেবল [3.6, 5.58] হবে।

# Python 3

circle_areas = [3.56773, 5.57668, 4.00914, 56.24241, 9.01344, 32.00013]

result = list(map(round, circle_areas, range(1,3)))

print(result)

ফলাফল:

[3.6, 5.58]

একই জিনিসটি ঘটে যদি circle_areas দ্বিতীয় ইটারেবলের দৈর্ঘ্যের চেয়ে কম হয়। পাইথন কেবল তখন থামিয়ে দেয় যখন এটি ইটারেবলগুলির মধ্যে একটিতে পরবর্তী উপাদানটি খুঁজে না পায়।

msap() ফাংশন সম্পর্কে আমাদের জ্ঞান সুসংহত করতে, আমরা এটি আমাদের নিজস্ব কাস্টম জিপ () ফাংশন বাস্তবায়নের জন্য ব্যবহার করতে যাচ্ছি। zip() ফাংশনটি এমন একটি ফাংশন যা প্রচুর পরিমাণে ইটারেট হয় এবং তারপরে ইটারেবলের প্রতিটি উপাদানকে সমন্বিত একটি টাপল তৈরি করে। map() এর মতো পাইথন 3-তে এটি একটি জেনারেটর অবজেক্ট ফিরিয়ে দেয়, যা এতে বিল্ট-ইন তালিকা ফাংশনটিতে কল করে সহজেই কোনও তালিকায় রূপান্তর করা যায়। আমরা map() দিয়ে তৈরি করার আগে zip() এর গ্রিপ পেতে নীচের দোভাষী দের সেশনটি ব্যবহার করব:

# Python 3

my_strings = ['a', 'b', 'c', 'd', 'e']
my_numbers = [1,2,3,4,5]

results = list(zip(my_strings, my_numbers))

print(results)

ফলাফল:

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]

বোনাস হিসাবে, আপনি কি অনুমান করতে পারেন যে my_strings এবং my_numbers একই দৈর্ঘ্যের না হলে উপরের সেশনে কী হবে? না? চেষ্টা করে দেখুন! এর মধ্যে একটির দৈর্ঘ্য পরিবর্তন করুন।

আমাদের নিজস্ব কাস্টম zip() ফাংশনে!

# Python 3

my_strings = ['a', 'b', 'c', 'd', 'e']
my_numbers = [1,2,3,4,5]

results = list(map(lambda x, y: (x, y), my_strings, my_numbers))

print(results)

ফলাফল:

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]

শুধু তাকান! জিপ হিসাবে আমাদের একই ফলাফল।

আপনি কি লক্ষ্য করেছেন যে আমার কাছে def my_functon() স্ট্যান্ডার্ড উপায় ব্যবহার করে কোনও ফাংশন তৈরি করার দরকার নেই? সাধারণত map() এবং সাধারণভাবে পাইথন এমনই সহজ! আমি কেবল একটি lamda ফাংশন ব্যবহার করি। এটি বলার অপেক্ষা রাখে না যে স্ট্যান্ডার্ড ফাংশন সংজ্ঞা পদ্ধতি (def function_name() এর) ব্যবহারের অনুমতি নেই, এটি এখনও রয়েছে। আমি কেবল কম কোড লিখতে পছন্দ করি।

এই পর্যন্তই এরপর filter নিয়ে আলোচনা হবে।

Leave a Comment