அகராதியின் பிரத்தியேக மு.வ.செயல்பாடுகளை இந்த அத்தியாயத்தில் காண்போம்.
1.clear()
அகராதியில் இடம்பெற்றிருக்கும் அனைத்து {சாவி:தரவுகள்} ஜோடிகளையும் ஒரே வரியில் நீக்க இந்த மு.வ.செயல்பாடு உதவுகிறது.
நிரல் 1:
நிரல் 2:
போன நிரலின் வெளியீட்டை ஒருகணம் கவனியுங்கள். அகராதியின் உள்ளடக்கம் தான் முழுமையாக நீக்கப்பட்டிருக்கிறதே ஒழிய, அவற்றைக் குறித்துக்கொண்டிருந்த அடையாளங்காட்டிக்கு எந்தவொரு சிக்கலுமில்லை. இதன் அர்த்தம் என்னவெனில், ஒருவேளை நிரலாளர் அதே அடையாளங்காட்டியில் மீண்டும் சாவி, தரவுகளைச் சேமிக்க விரும்பினால் அதற்கு எந்தவொரு தடையுமில்லை.
2.copy()
ஒரு அகராதியின் மொத்த உள்ளடக்கத்தையும் நகலெடுக்க இந்த செயல்பாடு பயன்படுகிறது.
நிரல் 3:
எப்படி நகல் எடுக்கப்படுகிறது?
ஆழமற்ற வகையில். மேற்கண்ட நிரலில் 2 அடையாளங்காட்டிகள் இடம்பெற்றுள்ளன. அசல் அகராதியைக் குறிக்க original_dict, அதன் நகலைக் குறிக்க copied_dict.
இரட்டைப் பிறவிகளில் யாரையாவது ஒருவரை அடித்தால் இன்னொருவருக்கு வலிக்குமா? உறுதியாக இல்லை. ஆனால் இந்த copy() செயல்பாட்டை வைத்து நகல் எடுக்கப்பட்ட தரவுகளில் ஏதாவதொன்றை மாற்றம் செய்தால், அது அசல் அகராதியின் தரவுகளையும் சேர்த்துப் பாதிக்கும். ஆனால், நிபந்தனைகளுக்கு உட்பட்டு.
அசல் தனி, நகல் தனி தானே? பிறகேன பாதிக்கிறது?
மேம்போக்காகப் பார்த்தால் நகல் எடுக்கப்படுவது போலத் தோன்றினாலும், உண்மையில் புதியதாக ஒரு அடையாளங்காட்டி உருவாக்கப்படுகிறது, அவ்வளவுதான். அது அசல் அகராதியோடு சேர்ந்துகொண்டு ஒருமுறை மட்டுமே உருவாக்கப்பட்ட {சாவி:தரவுகள்} ஜோடிகளைச் சுட்டத் தொடங்குகிறது.
ஆக நகல் என்ற பெயரில் {சாவி:தரவுகள்} ஜோடிகளைக் குறிக்க அடையாளங்கட்டிகளைத்தான் உருவாக்குகிறோம்.
1) இதன் காரணமாகவே copy() செயல்பாட்டைப் பயன்படுத்தி நகல் எடுக்கப்பட்டால் அதன் பெயர், ஆழமற்ற நகல்.
2) ஒருமுறை மட்டும் நிரலில் உருவாக்கப்பட்ட {சாவி:தரவுகள்} ஜோடிகளைத்தான் அசல், நகல் ஆகிய இரண்டுமே பயன்படுத்துகின்றன.
3) இதனால் அசல் அல்லது நகல், இவ்விரண்டில் ஏதாவதொரு தரவு மாற்றத்திற்கு உள்ளானால் அதன் தாக்கம் மற்றொன்றிலும் இருக்கும். இவ்விதி மாறும் தன்மைகொண்ட தரவு வகைகளுக்கு மட்டுமே பொருந்தும்.
4) மாறாத தன்மைகொண்ட தரவு வகை அசலிலோ (அ) நகலிலோ மாற்றத்திற்கு உள்ளானால், அதன் தாக்கம் ஒருபோதும் மற்றொன்றில் இருக்காது.
மேற்கண்ட நிபந்தனைக்கு உட்பட்டு copy() செயல்பாடு இயங்குகிறது.
நிரல் 4:
நாம் பார்த்த நிபந்தனைகள் அனைத்தையும் விளக்கும் வகையிலான ஒரு நிரல். அசலையும், நகலையும் உருவாக்கி அச்சிடுகிறோம். இப்போது நகலில் முறையே மாறும், மாறாத தரவு வகை ஒவ்வொன்றைத் தேர்ந்தெடுத்து மாற்றத்திற்கு உள்ளாக்குகிறோம். விதியின் படி, மாறும் தன்மைகொண்ட தரவு வகையின் தாக்கம் மட்டும் தான் அசலில் நிகழ்ந்திருக்கிறது.
3) fromkeys()
ஒரு அகராதியில் எத்தனை சாவிகள் இருந்தாலும் சரி, அதன் தரவுகள் எல்லாம் ஒரே மதிப்பைக்கொண்டிருந்தால் அதை மெனக்கெட்டு தட்டச்சு செய்து கொண்டிருக்கவேண்டாம் தானே? ஒரு அலுவலகத்தில் வேலை செய்வோருக்கு என ஒரு அகராதி இருப்பின், அதில் பணியிடம் எல்லோருக்கும் ஒன்று தானே? அதை எதற்கு ஒவ்வொருமுறையும் சொல்லிக்கொண்டிருக்க வேண்டும்? இம்மாதிரி சூழலில் தான், fromkeys() நமக்கு உதவுகிறார்.
சாவிகள் அனைத்தையும் ஒரு பட்டியலில் சேர்த்து, அதையும் அவற்றுக்கான தரவையும் அவருக்கு அனுப்பினால் சமர்த்தாக அகராதியை உருவாக்கி தந்திடுவார்.
நிரல் 5:
நிரல் 6:
ராம், ரஹீம் மற்றும் ஜான் ஆகிய மூவருக்கும் 30 வயது தான். fromkeys()ற்கு இந்த விவரங்கள் போதும், ஒரு அகராதியை உருவாக்க.
4) get()
ஒரு சாவியை அனுப்பி அதன் தரவை பெறும் வகையில் get() வடிவமைக்கப்பட்டிருக்கிறது. சாவி இருந்தால் சரி, ஒருவேளை நீங்கள் அனுப்பும் சாவி அகராதியில் இல்லாமல் இருந்தால்? None என்பதைப் பதிலாகத் தருவார் get().
அது என்ன None. நிரலாளர் தன் விருப்பத்திற்கு மாற்ற இயலாதா என்றால், முடியும். சாவியையும், ஒருவேளை அது அகராதியில் இல்லாமல் இருந்தால் என்ன அச்சிடப்பட வேண்டுமென்பதையும் get()ற்கு தெரியப்படுத்தலாம். இரண்டாவது நிரலாளரின் விருப்பம், தந்தால் தரலாம் இல்லையென்றால் None.
நிரல் 7:
சாவி அகராதியில் இடம்பெற்றிருக்கிறது, ஆகவே
1) அதன் தரவு அச்சிடப்பட்டிருக்கிறது
2) Unknownற்கு வேலையில்லை
நிரல் 8:
சாவி அகராதியில் இடம்பெறவில்லை, ஆகவே
1) அதன் தரவு அச்சிடப்படவில்லை
2) ‘N/A’ இடம்பெற்றிருக்கிறது
5) items()
ஒரே கல்லில் இரண்டு மாங்காய் என்பது போல, ஒரே நிரல் வரியில் சாவியையும், தரவுகளையும் பெற முடியுமா?
ஆம் என்கிறார் items().
நிரல் 9, 10:
பின்வரும் திரை சொட்டில் 2 நிரல்கள் உள்ளன. முதலில் items() செயல்பாட்டை நேரடியாகப் பயன்படுத்தி சாவியையும், தரவுகளையும் எடுக்கும் முறை பின்பற்றப்பட்டு இருக்கிறது. இதில் கவனிக்க வேண்டியது என்னவென்றால், அவ்வாறு பெறுகையில் அதன் வெளியீடு மாறா பட்டியல்களின் பட்டியலாக அச்சிடப்பட்டிருக்கிறது.
இரண்டாவது நிரல் கொஞ்சம் சிறப்பானது. காரணம், வழக்கமாக for loopன் ஒவ்வொரு செய்கையையும் குறிக்க ஒரு அடையாளங்காட்டியைத்தான் பயன்படுத்துவோம். மாறாக items() செயல்பாட்டோடு இயங்கும்போது மட்டும் for loopற்கு இரண்டு அடையாளங்காட்டிகள் தேவை. சாவியைக் குறிக்க ஒன்று, தரவுகளைக் குறிக்க மற்றொன்று. அகராதியின் நீளத்திற்கு மறுசெய்கை வரிகள் இயங்கி அதன் சாவியையும், தரவுகளையும் தனித்தனியே எடுத்து நிரல் 10ல் அச்சிடுகிறது.
6) keys()
நிரல் 11, 12:
பெயரிலேயே அதன் செயல்பாடு இருக்கிறது இல்லையா? திரை சொட்டில் இருக்கும் முதல் நிரல் சாவிகளை மட்டும் தனியே பிரித்தெடுத்து, அதைப் பட்டியலாக்கி அச்சிடுகிறது.
இரண்டாவது நிரலில், பெறப்படும் மொத்த சாவிகளின் பட்டியலை for loopஐ கொண்டு ஒவ்வொரு சாவியாக எடுத்து அச்சிடுகிறோம்.
சாவிக்கு என்று ஒரு செயல்பாடு இருக்கையில், தரவுகளுக்கென்று ஒன்று இல்லாமலா போய்விடும்?
7) values()
நிரல் 13, 14:
நீங்கள் நினைப்பது சரிதான். அதே வித்தியாசம் தான். அகராதியில் உள்ள தரவுகளை மட்டும் தனியே எடுத்து அச்சிடுகிறோம்.
8) pop()
இணைப்பது அணுகுவது குறித்து மட்டும் பார்த்துக்கொண்டே இருக்கிறோமே, நீக்குவது எப்படி என்று கேட்பவர்களுக்காகத் தான் pop(). ஒரு சாவியை இவரிடம் தந்தால் அதற்கு நிகரான தரவை கச்சிதமாக நீக்கி, இன்னதை நீக்கியிருக்கிறேன் என்று சமர்த்தாக நிரலாளருக்கு தகவல் தந்துவிடுவார். ஒருவேளை குறிப்பிட்ட அந்த சாவி அகராதியில் இடம்பெறாது இருந்தால், என்ன அச்சிடப்பட்ட வேண்டுமென்பதையும் (get() செயல்பாட்டில் செய்தது போல) இரண்டாவது அளவுருவாக pop()ற்கு அனுப்பி வைக்கலாம்.
நிரல் 15:
‘age’ என்கிற சாவி நிரலில் இடம்பெற்றிருக்கிறது, ஆகவே அதன் தரவு 25 நீக்கப்பட்டு அச்சிடப்பட்டிருக்கிறது.
நிரல் 16:
‘b’ என்கிற சாவி நிரலில் இடம்பெற்றிருக்கிறது, ஆகவே அதன் தரவு 2 நீக்கப்பட்டு அச்சிடப்பட்டிருக்கிறது. ஒருவேளை ‘b’ அகராதியில் இல்லாமலிருந்தால், -1 அச்சிடப்பட்டிருக்கும்.
9.popitem()
எனக்குச் சாவியும் தெரியாது, தரவுகளும் தெரியாது. அகராதியின் இறுதியில் இடம்பெற்றிருக்கும் {சாவி:தரவுகள்} ஜோடி நீக்கப்பட வேண்டும் என்பவர்களுக்காகவே உருவாக்கப்பட்டது popiten().
நிரல் 17, 18:
1) இரண்டு நிரல்களிலுமே popitem() பயன்படுத்தப்பட்டிருக்கிறது.
2) இரண்டிலும் அகராதியின் கடைசி {சாவி:தரவுகள்} ஜோடி நீக்கப்பட்டிருக்கிறது.
3) கடைசி உறுப்புகள் நீக்கப்பட்ட அகராதி அச்சிடப்பட்டிருக்கிறது.
10. setdefault()
அகராதியின் சாவியை அனுப்பி அதன் தரவுகளை எடுக்கும் வகையில் …, “இதே வடையைத் தானே get()ற்கும் சுட்ட?” என்பவர்கள் கொஞ்சம் பொறுமை காத்து மேலும் படிக்கவும்.
get() மற்றும் setdefault() இயங்கும் விதம் ஒன்றும் தான்.
1) இரண்டுமே சாவியை அனுப்பி, தரவுகளைப் பெறும் வகையில் வடிவமைக்கப்பட்டது தான்.
2) get()ல் சாவியை அனுப்பி தரவுகளை பெறுகிறோம். ஒருவேளை சாவி இல்லாமலிருந்தால், இரண்டாம் அளவுருவில் என்ன அச்சிடப்பட்ட வேண்டுமென்பதை குறிப்பிடுகிறோம்.
3) setdefault()ல் சாவியை அனுப்பி தரவுகளை பெறுகிறோம். ஒருவேளை சாவி இல்லாமலிருந்தால், இரண்டாம் அளவுருவில் குறிப்பிடப்பட்டுள்ளதை
தரவாகக் கொண்டு, இல்லாத சாவி புதிதாக உருவாக்கப்படும்.
நிரல் 19:
‘name’ என்ற சாவி அகராதியில் இருப்பதால் அதன் தரவு ‘Ashok’ அழகாக அச்சிடப்படுகிறது, ‘Unknown’ற்கு வேலையில்லை.
நிரல் 20:
‘history’ என்ற சாவி அகராதியில் இல்லை, எனவே அச்சாவி 0ஐ தரவாகக் கொண்டு அகராதியில் புதிதாக இணைக்கப்படுகிறது.
11. update()
ஒரு அகராதியை இன்னொரு அகராதியைக்கொண்டு புதுப்பிக்க update() உதவுகிறது.
நிரல் 21:
my_dict அகராதியை update_dict அகராதியைக்கொண்டு புதுப்பிக்கிறோம். இவ்விரண்டு அகராதிகளுக்கும் பொதுவான சாவி ஏதேனும் இருக்கிறதா என்று பாருங்கள், ஆம் ‘age’ பொதுவானதாக இருக்கிறது. எனில்
அதன் புதுப்பிக்கப்பட்ட மதிப்பை எடுத்து my_dictல் இடம்பெற்றிருக்கும் ageற்கு வழங்குகிறோம். ஆக, பழைய மதிப்பு புதுப்பிக்க பட்டுவிட்டது.
சாவி இருந்தால் இந்த சங்கதி சரி, ஒருவேளை இல்லாவிட்டால்?
நிரல் 22:
இந்நிரலில் கவனிக்கவேண்டியது
1) இரண்டு நிரல்களிலும் இடம்பெற்றிருக்கும் சாவி ‘b’, எனவே அதன் புதுப்பிக்கப்பட்ட மதிப்பு எடுத்துக்கொள்ளப்படும்.
2) புதுப்பிக்கப் பயன்படும் அகராதியில் புதிதாக ஒரு சாவி இருக்கிறது, அதனால் அது ஆதார அகராதியோடு இணைக்கப்படும்.
மேற்கண்ட இரண்டு நிரல்களையும் அடிப்படையாக வைத்துப் பார்த்தால், update() கீழ்க்காணும் விதிகளின் அடிப்படையில் இயங்குவதைக் காணலாம்.
1) இரண்டு அகராதிகளிலும் இடம்பெற்றிருக்கும் பொதுவான சாவி கண்டறியப்பட்டு, அதன் புதுப்பிக்கப்பட்ட மதிப்பு எடுத்துக்கொள்ளப்படும்.
2) புதுப்பிக்கப் பயன்படும் அகராதியில் மட்டும் ஒரு சாவி இடம்பெற்றிருந்தால் அதன் தரவுகளோடு சேர்த்து ஆதார அகராதியில் இணைக்கப்படும்.
in இயக்கியும் சாவியும்
நிரல் 23:
ஒரு அகராதியில் குறிப்பிட்ட சாவி இடம்பெற்றிருக்கிறதா என்பதை in இயக்கியைக்கொண்ட பரிசோதித்துக் கொள்ளலாம்.
ஒருவேளை அச்சாவி இடம்பெற்றிருந்தால் True, இல்லையென்றால் False. in இயக்கி அகராதியில் இடம்பெற்றிருக்கும் சாவியோடு மட்டும் தான் உறவாடும், அதற்கும் தரவுகளுக்கும் ஒருபோதும் ஒட்டுமில்லை, உறவுமில்லை.
நிரல் 24:
12. len()
ஒரு அகராதியின் நீளத்தை, அதாவது எத்தனை உறுப்புகள் இடம்பெற்றிருக்கின்றன என்பதை எண்ணி அச்சிட len() உதவுகின்றது.
நிரல் 25:
நீளத்தைக் கணக்கிடுகையில் எத்தனை சாவிகள் உள்ளன என்பது மட்டும் தான் எண்ணப்பட வேண்டும், அல்லது {சாவி:தரவுகள்} ஜோடியை 1 என்றே கணக்கில் வைத்துக்கொள்ள வேண்டும். சாவி 1, அதன் தரவுகள் 2 ஒருபோதும் வராது.
நிரல் 26:
நிரல் 27:
முழு எண்களைக்கொண்ட பட்டியல் ஒன்று உருவாக்கப்பட்டு இருக்கிறது. அதன் ஒவ்வொரு உறுப்பும் எத்தனை முறை இடம்பெற்றுள்ளன என்பதை எண்ணி அதை அகராதியில் சேமிக்கிறோம். இதில் சாவி எண்கள், அதன் தரவுகளாக எத்தனைமுறை இடம்பெற்றுள்ளன(எண்கள்) என்பது இருக்கும்.
for loopஐ பயன்படுத்தி பட்டியலின் ஒவ்வொரு உறுப்பாக அணுகுகிறோம். குறிப்பிட்ட ஒரு எண் அகராதியில் இருக்கிறதா என மறுசெய்கை வரியின் ஒவ்வொரு இயக்கத்திலும் பரிசோதிக்கிறோம். முதல்முறை ஒரு எண் அணுகப்படும்போது கட்டாயம் அது அகராதியில் இருக்காது, எனவே அந்த எண்ணுக்கு 1 என்ற மதிப்பைத் தரவாக வழங்குகிறோம். அடுத்தமுறை அதே எண் பட்டியலில் வருகையில், ஏற்கனவே அது அகராதியில் ஒரு சாவியாக இடம்பெற்றிருக்கும் காரணத்தால், அதன் தரவை 1ஐ கொண்டு கூட்டுகிறோம், 1+1=2.
இப்படியே ஒவ்வொரு எண்ணாக அணுகி, அதன் தரவாக எத்தனை முறை இடம்பெற்றிருக்கிறது என்பதைக் கண்டறிந்து அகராதியில் சேமிக்கிறோம்.
நிரல் 28:
இரு வெவ்வேறு அகராதிகளை ஒன்றாக்குதல். இந்நிரலில் உள்ள அகராதிகளுக்கு பொதுவான சாவி ‘b’, ஆகவே அதன் இறுதி மதிப்பு தரவாக எடுத்துக் கொள்ளப்படுகிறது.
நிரல் 29:
இரண்டு அகராதிகளிலும் ஒரே {சாவி:தரவுகள்} ஜோடி இடம்பெற்றுள்ளதா என்பதை இந்நிரலின் மூலம் தெரிந்துகொள்ளலாம். முதலில் குறிப்பிட்ட சாவி இரண்டு அகராதிகளிலும் உள்ளது என்று உறுதி செய்தபின் அதன் தரவுகளும் ஒரே மதிப்பைத்தான் கொண்டிருக்கிறதா என்பதை உறுதி செய்கிறோம். அவ்வாறு இருக்கும் {சாவி:தரவுகள்} ஜோடியைப் புதிதாக ஒரு அகராதியில் இணைக்கிறோம்.
நிரல் 30:
சாவி ஒன்று, அதன் தரவுகள் மற்றொன்று என இரண்டு பட்டியல்கள் உருவாக்கப்பட்டுள்ளன. அவ்விரண்டையும் for loopன் துணையோடு அகராதியாக மாற்றியிருக்கிறோம்.
முதல் பட்டியலிலிருந்து ஒவ்வொரு உறுப்பாக எடுத்து சாவியாகவும், இரண்டாவது பட்டியலிலிருந்து ஒவ்வொரு உறுப்பாக எடுத்து அதைத் தரவுகளாகவும் அகராதியில் சேமித்திருக்கிறோம்.
நிரல் 31:
ஒரு அகராதிக்குள் மூன்று அகராதிகளை உருவாக்கியிருக்கிறோம், nested dictionary என்ற பெயரால் இதை அழைக்கலாம். மிக எளிதான ஒரு நிரல், dry runற்கு சிறந்தது. முயன்று பாருங்கள்.
இந்த அத்தியாயத்தோடு அகராதி முடிவுக்கு வருகிறது.
(தொடரும்).