কম্পিউটার টিউটোরিয়াল

পাইথনে ইমিউটেবল ডেটা স্ট্রাকচার বাস্তবায়ন কীভাবে করবেন?


সমস্যা

আপনাকে পাইথনে ইমিউটেবল ডেটা স্ট্রাকচার বাস্তবায়ন করতে হবে।

পরিচয়..

ইমিউটেবল ডেটা স্ট্রাকচার খুব হ্যান্ডি যখন আপনি একই সময়ে প্যারালেল প্রোগ্রামিং-এ একাধিক লোক ডেটার এক টুকরো মডিফাই করতে চান তা রोकতে চান। মিউটেবল ডেটা স্ট্রাকচার (যেমন অ্যারের) যেকোনো সময় পরিবর্তন করা যায় কিন্তু ইমিউটেবল ডেটা স্ট্রাকচার পরিবর্তন করা যায় না।

কিভাবে করবেন..

আপনাকে ধাপে ধাপে দেখাচ্ছি কীভাবে ইমিউটেবল এবং মিউটেবল ডেটা স্ট্রাকচারের সাথে ডিল করতে হয়।

উদাহরণ

# STEP 01 - Create a Mutable array. # Define an array atp_players = ['Murray', 'Nadal', 'Djokovic'] print(f" *** Original Data in my array is - {atp_players}")

*** Original Data in my array is -

['Murray', 'Nadal', 'Djokovic']


# Changing the player name from Murray to Federer atp_players[0] = 'Federer' print(f" *** Modified Data in my array is - {atp_players}")

*** Modified Data in my array is -

['Federer', 'Nadal', 'Djokovic']

নিষ্কর্ষ

আমরা এত সহজে অ্যারে ভ্যালু পরিবর্তন করতে পেরেছি যা আপনার জন্য উপযোগী হতে পারে যদি আপনি এই অ্যারেতে একমাত্র ইউজার হন। যাইহোক, রিয়েল-টাইম প্রোডাকশনে একাধিক প্রোগ্রাম এই অ্যারেটি পরিবর্তনের জন্য ব্যবহার করতে পারে এবং অপ্রত্যাশিত ডেটা ফলাফল করতে পারে।

দूसरी দিকে টাপল কিছু ভিন্নভাবে বিহ্যাব করে, নিচের উদাহরণটি দেখুন।

# STEP 02 - Try changing a Tuple try: atp_players_tuple = ('Murray', 'Nadal', 'Djokovic') print(f" *** Original Data in my tuple is - {atp_players_tuple}") atp_players_tuple[0] = 'Federer' except Exception as error: print(f" *** Tried modifying data but ended up with - {error}")


*** Original Data in my tuple is - ('Murray', 'Nadal', 'Djokovic') *** Tried modifying data but ended up with - 'tuple' object does not support item assignment

নিষ্কর্ষ :

আপনি উপরে যা দেখেছেন, টাপল মডিফাই করা যায় না ? যাইহোক একটি এক্সেপশন আছে, যদি টাপলের ভিতরে অ্যারে থাকে তবে মান পরিবর্তন করা যায়।

atp_players_array_in_tuple = (['Murray'], ['Nadal'], ['Djokovic']) print(f" *** Original Data in my tuple with arrays is - {atp_players_array_in_tuple}") atp_players_array_in_tuple[0][0] = 'Federer' print(f" *** Modified Data in my tuple with arrays is - {atp_players_array_in_tuple}")


*** Original Data in my tuple with arrays is - (['Murray'], ['Nadal'], ['Djokovic']) *** Modified Data in my tuple with arrays is - (['Federer'], ['Nadal'], ['Djokovic'])

তাহলে ডেটা কীভাবে প্রোটেক্ট করব? হ্যাঁ, শুধু অ্যারেগুলো টাপলে কনভার্ট করে।

try: atp_players_tuple_in_tuple = (('Murray'), ('Nadal'), ('Djokovic')) print(f" *** Original Data in my tuple is - {atp_players_tuple_in_tuple}") atp_players_tuple_in_tuple[0] = 'Federer' except Exception as error: print(f" *** Tried modifying data in my tuple but ended up with - {error}")


*** Original Data in my tuple is - ('Murray', 'Nadal', 'Djokovic') *** Tried modifying data in my tuple but ended up with - 'tuple' object does not support item assignment

আরও আছে.. পাইথনে একটি চমৎকার বিল্ট-ইন টুল আছে যাকে NamedTuple বলা হয়। এটি একটি ক্লাস যা আপনি এক্সটেন্ড করে কনস্ট্রাক্টর তৈরি করতে পারেন। প্রোগ্রাম্যাটিক্যালি বুঝি।

# Create a simple class on Grandslam titles in pythons way. class GrandSlamsPythonWay: def __init__(self, player, titles): self.player = player self.titles = titles stats = GrandSlamsPythonWay("Federer", 20) print(f" *** Stats has details as {stats.player} - {stats.titles}")


*** Stats has details as Federer - 20

আপনি কী মনে করেন এই ক্লাসের সম্পর্কে, কি এটি ইমিউটেবল? ফেডারারকে নডাল বদলে চেক করি।

stats.player = 'Nadal' print(f" *** Stats has details as {stats.player} - {stats.titles}")


*** Stats has details as Nadal - 20

তো কোনো আশ্চর্য নেই এটি একটি ইমিউটেবল ডেটা স্ট্রাকচার নয় কারণ আমরা ফেডারারকে নডাল আপডেট করতে পেরেছি। এখন NamedTuple-এ একটি ক্লাস তৈরি করি এবং এর ডিফল্ট বিহ্যাভিয়ার দেখি।

from typing import NamedTuple class GrandSlamsWithNamedTuple(NamedTuple): player: str titles: int stats = GrandSlamsWithNamedTuple("Federer", 20) print(f" *** Stats has details as {stats.player} - {stats.titles}") stats.player = 'Djokovic' print(f" *** Stats has details as {stats.player} - {stats.titles}")


*** Stats has details as Federer - 20


--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 10 print(f" *** Stats has details as {stats.player} - {stats.titles}") 11 ---> 12 stats.player = 'Djokovic' 13 print(f" *** Stats has details as {stats.player} - {stats.titles}") AttributeError: can't set attribute

দেখতে পাচ্ছি জোকোভিচকে ২০ গ্র্যান্ড স্ল্যাম টাইটেল পেতে আরও কিছুক্ষণ অপেক্ষা করতে হবে।

যাইহোক আমরা _replace মেথড ব্যবহার করে একটি কপি তৈরি করে এবং _replace-এর সময় ভ্যালু আপডেট করতে পারি।

djokovic_stats = stats._replace(player="Djokovic", titles=17) print(f" *** djokovic_stats has details as {djokovic_stats.player} - {djokovic_stats.titles}")


*** djokovic_stats has details as Djokovic - 17

উদাহরণ

শেষে আমি একটি উদাহরণ দেব যা উপরে ব্যাখ্যা করা সবকিছু কভার করে।

এই উদাহরণের জন্য, অনুমান করুন আমরা একটি সবজি দোকানের জন্য সফটওয়্যার লিখছি।

from typing import Tuple # Create a Class to represent one purchase class Prices(NamedTuple): id: int name: str price: int # Price in dollars # Create a Class to track the purchase class Purchase(NamedTuple): purchase_id: int items: Tuple[Prices] # Create vegetable items and their corresponding prices carrot = Prices(1, "carrot", 2) tomato = Prices(2, "tomato", 3) eggplant = Prices(3, "eggplant", 5) # Now let say our first cusotmer Mr.Tom had purchased carrot and tomato tom_order = Purchase(1, (carrot, tomato)) # Know the total cost we need to charge Mr.Tom total_cost = sum(item.price for item in tom_order.items) print(f"*** Total Cost from Mr.Tom is - {total_cost}$")

আউটপুট

*** Total Cost from Mr.Tom is - 5$

  1. পাইথনে উইকিপিডিয়া ডেটা এক্সট্র্যাক্ট করা

  2. পাইথনে মিন-শিফট অ্যালগরিদম বাস্তবায়ন

  3. পাইথনে নন-লিনিয়ার ডেটাকে মডেলে ফিট করার পদ্ধতি

  4. পাইথনে Matplotlib চার্টে লেজেন্ড যোগ করার টিউটোরিয়াল