হাতে-কলমে পাইথন: পর্ব ৬ (ফাঁকা লাইনের রহস্য ও ফেলুদা)

June 17, 2016

পর্ব-৫ এ আমরা দেখেছিলাম কিভাবে ফাইলে প্রোগ্রাম সেভ করে রাখতে হয়; এখন থেকে আমাদের আর কষ্ট করে বার বার একই কোড টাইপ করতে হবেনা! যাই হউক, এবার আমাদের লেখা ফাইলটাকে Spyder এ ওপেন কর। এবার খেয়াল করে দেখুন Spyder এর নিচে, ডান/বাম পাশে একটি IPython Console আছে :D ওখানে headlines লিখে দেখি তো আমাদের headlines ভ্যারিয়েবলকে পাওয়া যায় কিনা! হাজার হোক ওর ঠিক পাশেই আমাদের প্রোগ্রামের কোড - অতএব…।

কি বলে headlines not defined! আমরা স্পষ্ট দেখতে পাচ্ছি যে, কোডে সুন্দরমত headlines ডিফাইন করা আছে :/ ঘটনা কি হল এখানে? একটু দুই মিনিট সময় নিয়ে ভেবে দেখবেন কি? চিন্তার সময় শুরু হল… এখন! 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0। সময় শেষ।

আর হ্যাঁ, আমি এত বড় নাম্বারের সিকোয়েন্স আমি হাতে লিখিনি নিশ্চয়ই :/ এজন্য পাইথন আমাকে সাহায্য করেছে। পাইথনকে বলেছিলাম range(0,120)[::-1] আর পাইথন এত্তগুলা ভালো ইন্টারপ্রেটারের মত আমাকে সুন্দর একটা লিস্টি বানিয়ে দিয়েছে!

হুম, এবার তাহলে ঘটনা কি ঘটল? আসলে আমাদের এডিটরের কোড কিন্তু এডিটরেই রয়ে গেছে। আমরা যে iPython শেলে লিখছিলাম, সেখানে ওই কোড এক্সিকিউট হয়নি! যার ফলে headlines নামের কোন ভ্যারিয়েবল আদৌ তৈরিই হয়নি। পাইথন তো ঠিক কথাই বলেছে আমাদের; বেচারাকে দোষ দিয়েন না। :(

এবার আসুন দেখি কিভাবে আমাদের পুরো কোড আইপাইথন শেলে এক্সিকিউট করাবো! গতকালকের মতই ওই রেঞ্চওয়ালা রান বাটনে চাপ দিন। (মনে না থাকলে আগের ব্লগ পোস্ট দ্রষ্টব্য) এরপর নতুন উইন্ডোটি থেকে Execute in current Python or IPython console সিলেক্ট করে Run বাটনে চাপ দিন।

যথারীতি গতকালকের মত আউটপুট দেখাবে। এবার আপনি IPython কনসোলটিতে লিখে দেখুন headlines, ভ্যালু দেখাবে!

ইয়েস! এবার আরামসে এক্সপেরিমেন্ট করা যাবে। এবার এক কাজ করি, আজকের প্রথম হেডলাইনটি নিয়ে কাজ করি। প্রথম বা 0-তম হেডলাইন পাওয়ার জন্য করণীয় headlines[0], এবং ওই হেডলাইনের লেখা পাওয়ার জন্য করণীয় headlines[0].text। খুব দ্রুত dir(headlines[0].text) দিয়ে দেখি তো এই স্ট্রিং কি করা যায়!

দুষ্টু স্ট্রিংদের লাইনে আনা

এবার ছোট্ট একটা উদাহরণ। ধরুন আপনার কাছে একটা স্ট্রিং আছে,

  I love Python.      

খেয়াল করে দেখুন লাইনটির শেষে ৭টি স্পেস আছে, এবং শুরুতে ২টি! এখন এই অদ্ভুত স্ট্রিংকে প্রিন্ট করলে দেখা যাবে কেমন একটা পচা পচাভাবে দেখা যাবে, কনসোলের সাথে aligned থাকবে না। :(

ছিঃ কি রকম বিশ্রি দেখাচ্ছে :| এমন কুৎসিত্য (!) সহ্য করা সম্ভব নয়। এর একটা বিহীত করা দরকার; শুরু ও শেষে থেকে পচা পচা অতিরিক্ত স্পেসগুলো সরিয়ে ফেলতে হবে। এজন্য পাইথনে… ধরে ফেলেছেন! বিল্ট-ইন ফাংশন আছে। strip()। এজন্য আমাদের ছোট্ট একটু কাজ করতে হবে,

print(message.strip())

ইয়ে! ক্লিন হয়ে গেছে! নিশ্চিত হওয়ার জন্য আমরা len() ফাংশনটির সাহায্য বলে দিতে পারি। ও হচ্ছে পাইথনের মাপামাপির লোক; প্রায় যেকোন কিছুর length বলে দিতে পারে! (list, string….!) অস্থির এক ফাংশন বটে।

len(message) - len(message.strip())

হুম, আসলেই দুষ্টু স্পেসগুলো গায়েবুন! বিয়োগের ব্যাপারটা নিয়ে একটু চিন্তা করে দেখুন; অস্থির না?

এসো নিজে করি && নিজে না করে যাবেন না: শুধুমাত্র একগাদা স্পেস নিয়ে একটা স্ট্রিং বানিয়ে দেখুন তো সেটাকে স্ট্রিপ করলে কি হয় :D

শর্ত প্রযোজ্য

পেপার খুলে যখনই দেখি মোবাইল কোম্পানি বিজ্ঞাপন, তখন নিচে একদম ছোট্ট করে লেখা থাকে, শর্ত প্রযোজ্য, আসলে ১০ পয়সা না, বিল হল ২৫ পয়সা… ইত্যাদি। পাইথন শর্ত নিয়ে এত ডিসেপ্টিভ না; পাইথন একজন সৎ, সত্যবাদী ও ন্যায়পন্থী ইন্টারপ্রেটার। বিশ্বাস না হলে নিজেই টেস্ট করে দেখুন! আইপাইথন কনসোলে লিখুন 2 > 5। পাইথন উত্তরে কি বলল? ;)

একজন সত্যবাদী পাইথন! মনে আছে? আমরা শুরু দিকের একটি পর্বে not ব্যবহার করেছিলাম? ওইটা দিয়ে আরেকটু এক্সপেরিমেন্ট করে দেখুন তো নিজে নিজে :p আমরা যে আউটপুটগুলো পেলাম, এগুলোকে ইউনিভার্সিটির ফ্যাকাল্টি গাম্ভীর্যের সঙ্গে বলেন Truth value এবং প্রোগ্রামাররা ভাব নিয়ে বলেন Boolean value। বিশ্বাস না হলে পাইথনকেই জিজ্ঞেস করুন।

আরেকটা ছোট্ট উদাহরণ দিলে আপনার মাথায় এই রহস্য সমাধানের আরেকটি প্রি-রেক্যুইজিট ইন্সটল হয়ে যাবে।

if 2 > 5:
	print("Two is greater than Five")
else:
	print("Two is less than or equal to Five")

(ট্যাবের, ইন্ডেন্টেশনের কথা ভুললে চলবে না, পাইথনে কোডের ব্লক ডিফাইন হয় ইন্ডেন্টেশন দিয়ে, সেকেন্ড ব্র্যাকেটের বেইল নাই)

রহস্য সমাধান

মিশন: সব নিউজ প্রিন্ট করলে কেন ফাঁকা লাইন আসে বের করা। ফাঁকা লাইনের কালপ্রিটকে পুলিশে ধরিয়ে দেওয়া।

আমাদের হাতে কয়েকটি গুরুত্বপূর্ণ ক্লু আছে। ১। স্ট্রিংয়ের লেংথ বা দৈর্ঘ্য বের করা সম্ভব। ২। স্ট্রিংকে স্ট্রিপ করলে সকল অবাঞ্চিত স্পেস গায়েবুন হয়ে যায়। ৩। খালি স্পেসই আছে, এমন স্ট্রিংকে স্ট্রিপ করলে স্ট্রিং ফাঁকা হয়ে যায়, তখন লেংথ হয় 0.

তার মানে যেসকল strip() করা স্ট্রিং এর লেংথ ১ বা তার বেশি, তারা নিষ্পাপ ভালো হেডলাইন! অতএব এক অর্থে বলা যায়,

if len(headline.text.strip()) > 0:
	our string is good, he is not the culprit

এবার আমাদের আগের পাইথন প্রোগ্রামে হাত দেই, জায়গামত লজিকটি বসিয়ে দিলে…

এবার রান করলে একদম মোক্ষম রেজাল্ট পাওয়া যাবে! (কিছু ইনকনসিস্টেনসি আছে, কিন্তু এটি ওয়েব স্ক্র্যাপিং এর টিউটোরিয়াল নয়, পাইথন শেখার টিউটোরিয়াল বলে সেগুলোকে স্কিপ করছি।) আগামী পর্বই আমাদের শেষ পর্ব হবে, এবং সেখানে আমরা গুণে দেখব কোন ইংরেজি শব্দ কতবার করে ব্যবহার হয়েছে। ততক্ষণ এক্সপ্লোর করুন!

comments powered by Disqus