পাইথনের বিভিন্ন ট্রিকস এবং ইস্টার এগ‍্স

পাইথন এমনিতেই সহজ এবং মজার একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ, তার উপর আবার এতে অনেক ইস্টার এগ, জোকস, হিউমার ঢুকিয়ে রাখা আছে। তাতেও যদি প্রোগ্রামাররা মজা না পায় তাহলে আর কী করার। হয়তো অনেকের কাছে এসব অজানা। তাই আমি এই পোস্টে পাইথন প্রোগ্রামিং ল্যাঙ্গুয়েজের বিভিন্ন টিপস, ট্রিকস এবং ইস্টার এগ সম্পর্কে জানাতে চেষ্টা করেছি। ভবিষ্যতে এই পোস্টে আরো টিপস, ট্রিকস এবং ইস্টার এগ যুক্ত করা হবে।

পাইথনের কবিতা (Easter Egg)

import this

উপরের কোডটি রান করালে পাইথনকে নিয়ে লেখা একটি ১৯ লাইনের কবিতা টাইপের টেক্সট দেখা যাবে। এটিই একমাত্র ইস্টার এগ যেটা পাইথনের অফিসিয়াল ডকুমেন্টেশনের মধ্যে “ইস্টার এগ” হিসেবে উল্লেখিত রয়েছে। পাইথন প্রোগ্রামিং ল্যাঙ্গুয়েজ ডেভেলপ করার সময় যে ১৯টি নীতি ডেভেলপাররা মাথায় রেখেছিলেন সেগুলোকেই এখানে নির্দেশ করা হয়েছে।

হ্যালো ওয়ার্ল্ড প্রিন্ট করার মডিউল!!! (Easter Egg)

আমরা অধিকাংশরাই সম্ভবত পাইথনে হ্যালো ওয়ার্ল্ড প্রিন্ট করার মাধ্যমে প্রোগ্রামিংয়ে প্রবেশ করেছি। কিন্তু সেটা কীভাবে করেছি, print("Hello world!") লাইনটি লিখে। অবাক করার ব্যাপার হচ্ছে যে, এই হ্যালো ওয়ার্ল্ড প্রিন্ট করার মতো সহজ কাজটি করার জন্যেও পাইথনে একটা নয় বরং দুই দুইটি মডিউল (গোপন) রয়েছে!!!

import __hello__
import __phello__

ইন্ডেন্টেশনের বদলে ব্র্যাকেট ব্যবহার (Easter Egg)

অধিকাংশ প্রোগ্রামিং ল্যাঙ্গুয়েজে কার্লি ব্র্যাকেট “{ }” ব্যবহার করা গেলেও পাইথনে কার্লি ব্র্যাকেটের পরিবর্তে ইন্ডেন্টেশন করতে হয়। সি, সি++ বা জাভার মতো ল্যাঙ্গুয়েজ থেকে পাইথনে আসলে এই ইন্ডেন্টেশন ব্যাপারটা রপ্ত করতে একটু সময় লাগে। তবে পাইথনেও ইন্ডেন্টেশনের বদলে ব্র্যাকেট ব্যবহার করা যায়। এজন্য __future__ মডিউলের braces ক্লাসটি ইমপোর্ট করতে হবে।

from __future__ import braces

কিন্তু না। পাইথন এটা হতে দেবে না!

File "<stdin>", line 1
SyntaxError: not a chance

পাইথনে কমিকস (Easter Egg)

সারাদিন কোড লিখতে লিখতে বিরক্ত হয়ে গেলে নিচের কোডটি রান করিয়ে কমিকস পড়া যাবে! এই কমিকসেও পাইথনের গুণগান করা হয়েছে।

import antigravity

গোপন কিওয়ার্ড (Easter Egg)

পাইথনের 9 ভার্সনে একটি গোপন কিওয়ার্ড আছে যেটা টাইপ করলে পাইথন এরর থ্রো করে বলবে আমরা একটি ইস্টার এগ খুঁজে পেয়েছি।

__peg_parser__

ডিকশনারি অবজেক্ট সুন্দরভাবে প্রিন্ট করা (Tips)

পাইথনে ডিকশনারি অবজেক্টগুলোর ডাটা সাধারণভাবে দেখার সময় খুব হিজিবিজি টাইপের লাগে। json মডিউলের dumps() ফাংশন ব্যবহার করে খুব সুন্দর সাজানো-গোছানো ভাবে ডিকশনারির ডাটাগুলো দেখা যায়।

import json
d = {'a': 12, 'b': 'hello', 'c': 890}
print(json.dumps(d, indent = 4))

উপরের কোডটি রান করলে নিচের মতো আউটপুট পাওয়া যাবে।

{
    "a": 12,
    "b": "hello",
    "c": 890
}

এক লাইনেই ভ্যালু সোয়াপ (Tips)

দুইটি ভেরিয়েবলের ভ্যালু সোয়াপ করার জন্য একটি ক্লাসিক উপায় হলো তৃতীয় একটি ভেরিয়েবল ব্যবহার করা। কিন্তু এক্ষেত্রে এই একটা কাজ করার জন্য তিন লাইন কোড লেখা লাগে আবার অতিরিক্ত মেমোরিও ব্যবহার করা লাগে। পাইথনে খুব সহজে এক লাইনে এবং অতিরিক্ত কোনো মেমোরি খরচ না করেই এই কাজটি করা যায়।

a = 23
b = 56
a, b = b, a    # swapping part

পাইথনের বিল্ট-ইন এইচটিটিপি সার্ভার (Tips)

পাইথনের স্ট্যান্ডার্ড লাইব্রেরীতে এর নিজস্ব একটি এইচটিটিপি সার্ভার রয়েছে। ওয়েবসাইট প্রিভিউ করার জন্য এটি খুব কাজে দেয়। সার্ভার চালু করার জন্য নির্দিষ্ট ফোল্ডার/ডিরেক্টরিতে গিয়ে কমান্ড-প্রম্ট/টার্মিনাল ব্যবহার করে নিম্নোক্ত কমান্ডটি দিতে হবে। এতে করে http://localhost:8000/ -লিংকে সার্ভার সার্ভ করবে।

python3 -m http.server

পাইথন প্রোগ্রামের পর্দার পেছনের অংশে উঁকি মারা (Tips)

একটি পাইথন প্রোগ্রামকে যখন কম্পাইল করা হয় তখন পাইথন ইন্টারপ্রেটার প্রোগ্রামটিকে প্রথমে বাইটকোডে রুপান্তরিত করে (বাইটকোড মনে করো এমন কিছু যেটা পাইথন ইন্টারপ্রেটার আর মেশিন বুঝতে পারে)। আমরা চাইলেই একটি পাইথন প্রোগ্রামের বাইটকোড দেখতে পারি।

import dis

def greet(name):
    return "Hello, " + name + "!"

dis.dis(greet)

আউটপুট:

4     0 LOAD_CONST      1 ('Hello, ')
      2 LOAD_FAST       0 (name)
      4 BINARY_ADD
      6 LOAD_CONST      2 ('!')
      8 BINARY_ADD
      10 RETURN_VALUE

লিস্ট স্লাইসিং ব্যবহার করে লিস্ট কপি করা (Tricks)

পাইথনে একটি লিস্ট অবজেক্টকে একাধিক ভেরিয়েবলে অ্যাসাইন করলে ভেরিয়েবলগুলোতে লিস্টের রেফারেন্স কপি হয়। ফলে লিস্টের মধ্যে পরিবর্তন করলে সবগুলো ভেরিয়েবলে ভ্যালু চেঞ্জ হয়ে যায়। আমরা লিস্ট স্লাইসিং ব্যবহার করে খুব সহজেই লিস্টের শ্যালো কপি তৈরি করতে পারি।

a = [1, 2, 3, 4]
b = a       # does a reference copy
b = a[:]    # does a shallow copy

ল্যাম্বডা কিওয়ার্ড (Tricks)

def evenOdd(x):
    if x % 2 == 0:
        return "even"
    else:
        return "odd"

উপরে জোড় বিজোড় নির্ণয় করার একটি ফাংশন লেখা হয়েছে। আমরা চাইলে lambda কিওয়ার্ড ব্যবহার করে এক লাইনেই এই কাজটি করে ফেলতে পারি।

evenOdd = lambda x: "even" if x % 2 == 0 else "odd"

ল্যাম্বডা কিওয়ার্ড খুব কাজের একটা জিনিস। তবে মনে রাখতে হবে, ল্যাম্বডা কিওয়ার্ড দিয়ে শুধুমাত্র একটি এক্সপ্রেশন ওয়ালা ফাংশন তৈরি করা যায়।

একটি ইটারেবলের সকল বিন্যাস বের করা (Tricks)

অনেক সময় আমাদেরকে একটি স্ট্রিং (যা একটি ইটারেবল) এর সকল সম্ভাব্য বিন্যাস বের করার দরকার হয়। কয়েকটি নেস্টেড লুপ চালিয়েই এ কাজ করা যায়। কিন্তু আমরা চাইলে itertools মডিউলের permutations() ফাংশনটি ব্যবহার করেও কাজটি করতে পারি। যেমন: "MUSHFIQ" স্ট্রিংটির সকল বিন্যাস বের করতে চাইলে এভাবে কোড করতে হবে:-

import itertools
for p in itertools.permutations("MUSHFIQ"):
    print(p)

একটি ইটারেবলে সবচেয়ে বেশি থাকা উপাদানটি বের করা (Tricks)

একটি ইটারেবলে (স্ট্রিং, লিস্ট, সেট, টাপল, ডিকশনারি, রেঞ্জ ইত্যাদি) সবচেয়ে বেশি থাকা উপাদানটি (most common element) বের করতে আমরা collections মডিউলের Counter ক্লাসের most_common() ফাংশনটি ব্যবহার করতে পারি। যেমন: "hello world" স্ট্রিংটির মোস্ট কমন ইলিমেন্ট বের করতে চাইলে এভাবে কোড করতে হবে:-

import collections
c = collections.Counter("hello world")
c.most_common(1)

লিস্ট কম্প্রিহেনশন (Tricks)

পাইথনের একটি স্বতন্ত্র ফিচার হলো লিস্ট কম্প্রিহেনশন। এই ফিচার ব্যবহার করে আমরা একাধিক লাইনের লিস্ট জেনারেশন প্রসেসকে এক লাইনে নিয়ে আসতে পারি। সাধারণত লিস্ট কম্প্রিহেনশন তখনই ব্যবহার করা হয় যখন অন্য একটি ইটারেবল থেকে তার কিছু উপাদানের উপর বিভিন্ন এক্সপ্রেশন বা কন্ডিশন চালিয়ে নতুন একটি লিস্ট তৈরি করার প্রয়োজন পড়ে। লিস্ট কম্প্রিহেনশনের সিনট্যাক্স মোটামুটি এরকম:

newList = [expression for item in iterable if condition]

যেমন: ১ থেকে ১০০ এর মধ্যেকার সকল জোড় সংখ্যা নিয়ে একটি লিস্ট তৈরি করতে পারি এভাবে:-

even = [i for i in range(1, 101) if i % 2 == 0]

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

উইন্ডোজ পিসি থেকে কোনো সফটওয়্যার পুরোপুরি আনইন্সটল করার নিয়ম

উইন্ডোজ পিসির গতি বৃদ্ধি করার উপায়

কম্পিটিটিভ প্রোগ্রামিংয়ের দুনিয়ায় প্রবেশের গল্প