কিভাবে পাইথনের বেসিকস শিখবো?

বেসিক থেকে ইন্টারমিডিয়েট লেভেলের পাইথন প্রোগ্রামার হিসেবে নিজেকে গড়ে তোলা

শুরুতেই বলে রাখি, কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ আয়ত্ত করা সোজা কথা না। কারণ, আমি নিশ্চিতভাবেই বলতে পারি, প্রোগ্রামিং এর বিভিন্ন নতুন কনসেপ্ট গুলো বুঝে আত্মস্থ করা এবং সেটাকে কাজে লাগানো অনেক কঠিন, এটাই স্বাভাবিক তা না হলে আপনি অবশ্যই গিফটেড ;)। যদি সি এস ই বা কম্পিউটার সায়েন্স রিলেটেড সাবজেক্ট ব্যাকগ্রাউন্ড না থাকে তাহলে তো কথাই নাই শেখার পথটুকু আরো দুর্গম/কঠিন বৈকি। কিন্তু তবুও,

যেহেতু আপনি পাইথন সম্পর্কিত এই আর্টিকেল পড়ছেন সেহেতু, ধরে নিচ্ছি পাইথন শিখতে চাওয়ার আগ্রহ বা কৌতূহল আপনার আছে, আর সে কৌতূহলের  জন্যেই অভিবাদন জানাচ্ছি!

পাইথন প্রোগ্রামিং জগতে আপনাকে স্বাগতম!

পাইথন নিঃসন্দেহে অসাধারণ একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ। শিখতেও যেমন মজা তেমন কাজ করেও আরাম। আমার অত্যন্ত প্রিয় এই প্রোগ্রামিং ল্যাঙ্গুয়েজ কর্মক্ষেত্রেও আমার প্রাইমারী ল্যাঙ্গুয়েজ! 🙂 পাইথন সারাবিশ্বের অন্যতম জনপ্রিয় এবং বেস্ট পেইড প্রোগ্রামিং ল্যাঙ্গুয়েজ

পাইথন শিখতে আগ্রহী কিন্তু কিভাবে শুরু করবো? 

২০১২ এর শুরুর দিকে পাইথনের সাথে পরিচয় আমার। প্রথমদিকে ভিডিও টিউটোরিয়াল খুব বেশী ভালো লাগতো। তবে, এখন আর্টিকেল, পিডিএফই বেশী প্রাধান্য দেই। চেষ্টা করি নলেজ শেয়ারিং এর, তাই মাঝে মাঝে  টেক ও পাইথন রিলেটেড আর্টিকেল লিখি, এর সাথে সাথে টুকটাক ওপেন সোর্স কন্ট্রিবিউশান করি। এছাড়াও, বিভিন্ন কমিউনিটি গ্রুপে পাইথন সম্পর্কিত বিভিন্ন প্রশ্নের উত্তর দিয়ে সাহায্য করা, কিংবা পাইথন রিলেটেড প্রব্লেম এর এনালাইসিস, ব্যবছেদ ও সমাধান করতে পছন্দ করি।

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

আর্টিকেল

বর্তমানে পাইথনের অনেক বাংলা রিসোর্স অনলাইনে একটু সার্চ করলেই পাওয়া যায়। বেশকিছু ভিডিও টিউটোরিয়াল ও কন্টেন্ট ইউটিউব, ফেসবুক সহ বিভিন্ন সোশ্যাল মিডিয়াম গুলোতে পাওয়া যাচ্ছে। তবে, নিম্নোক্ত ব্লগগুলো সহজ ভাষায় লেখা এবং বেশ জনপ্রিয়ঃঃ

যদি ইংরেজীতে সাছন্দ্য বোধ করেন তবে, মিডিয়ামে প্রকাশিত এই আর্টিকেলটি আপনার জন্যে রিকমেন্ডেডঃ

পি ডি এফ/অনলাইন বুকস

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

  • Automate the Boring Stuff with Python: Practical Programming for Total Beginners
    এই বইটি আমার খুবই ভালো লাগে। কারণ, বইয়ের উদাহরণগুলো প্রজেক্ট এর মতোই! ফলে, একটা একটা স্টেপ বা, প্রজেেেক্ট শেষ করেই প্রাপ্তির স্বাদ পাওয়া যায়। যেমন, স্ক্রিপ্ট এর মাধ্যমে বিভিন্ন ওয়েবসাইট ভিজিট করা ও ওয়েবসাইট এর বিভিন্ন এলেমেন্ট এর সাথে ইন্টারেক্ট করা ইত্যাদি ।
  • Fluent Python
    এই বইটির বিশেষত্ব হলো পাইথনের স্পেশাল ফিচার গুলো কে খুব ভালোভাবেই কভার করেছে। পাইথনিক ভাবে কোড লেখার উপরে গুরুত্ব দেয়ার কারণে বইটি আরও আকর্ষণীয় হয়ে উঠেছে। ফলে, আপনার যদি অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে শেখা প্যাটার্ন গুলো ভুলে গিয়ে সুন্দর পাইথনিক কোড লিখার নিয়মাবলী জানতে পারবেন।
  • Python Cookbook
    এই বইটা রেসাইপে ভরপুর। কি নেই এই বইয়ে? প্রজেক্ট বেইজড এই বইয়ে সকল মৌলিক বিষয়গুলোর সাথে সাথে, সচরাচর করা কাজগুলো যেমন ডাটা প্রসেসিং বা নেটওয়ার্ক প্রোগ্রামিং সহ নানাবিদ টপিকসে আলোচনা করা হয়েছে। এডভান্সড লেভেলের টপিক যেমন মেটা প্রোগ্রামিং ও কভার করার কারণে বলা চলে, আগের বইগুলো থেকে এটা একটু এডভান্সড বৈকি। তবে নিঃসন্দেহে বিগিনার জন্যে অনেক কিছুই শেখার আছে এই বইয়ে!
  • Pro Python
    আরেকটা এডভান্সড বই। পাইথনের বেস্ট প্র্যাক্টিস জানার জন্যে এই বইয়ের বিকল্প আরেকটি বই খুঁজে পাওয়া দুস্কর। আপনার পাইথন স্কিলকে প্রফেশনাল লেভেলে নিতে চাইলে, বইটি পড়ে ফেলুুুন। 

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

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

এছাড়াও স্মার্ট ফোনে পি ডি এফ ডাউনলোড করে রাখলে সেটা, বিভিন্ন অবসরে কিংবা ট্রাফিক জ্যামে বই পড়তে কাজে লাগে! 
 

চর্চা 

পরিশেষে আবারো বলবো চর্চার কোন বিকল্প নাই, যতই বই পড়েন, ভিডিও দেখেন চর্চা না করলে তা কাজে আসবে না। তাই, যখনই কোন আর্টিকেল বা বই ফলো করবেন তখনই ওই বই বা আর্টিকেল এর প্রোগ্রাম গুলো টাইপ করে করে রান করে দেখবেন। এতে করে আপনার কোডিং এবং টাইপিং দুটো স্কিলই বাড়বে। 

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

Classic 2048 - 4x4 Board Game

Classic 2048 Game Tips & Tricks

ক্ল্যাসিক ২০৪৮ গেইম টিপস ও ট্রিকস 

আজকে আমি ২০৪৮ গেইম এর এন্ড্রয়েড সংস্করণ এর প্রথম ভার্সন রিলিজ দিয়েছি নাম – CLASSIC 2048

Image result for get it on google play

২০৪৮ গেইম – মূলতঃ  ৪ x ৪ বোর্ডের একটি গেইম যেটা জোড় সংখ্যার যোগফলের উপর ভিত্তি করে তৈরি করা হয়েছে। খেলার শুরুতে টাইলসের নাম্বার থাকে ২ পরবর্তীতে একই সংখ্যার টাইলস গুলো কে একত্র করে করে বড় বেজোড় সংখ্যা গুলো তৈরি করা যায়। তবে একত্র করার রুল কিন্তু একটাই শুধুমাত্র সেইম নাম্বার এর টাইলসকেই একত্র করা যাবে। এরকম একত্র করে করে ২০৪৮ সংখ্যার একটি টাইলস বানাতে পারলেই কেল্লাফতে!

তবে, আমার রিলিজ করা গেইমটি ২০৪৮ টাইলস এর পরেও খেলা চালিয়ে যাওয়ার ব্যবস্থা রেখেছি। আর মুভ ফিরিয়ে নেয়ার কোন ব্যবস্থা রাখা হচ্ছে না। যাতে করে স্কোরের স্বচ্ছতা বজায় থাকে। ২০৪৮ গেইম এর হিস্টোরি কিন্তু বেশীদিনের না। ইতালির একজন গেইম ডেভেলপার এইতো সেদিন( ২০১৪ সালের দিকে) এই গেইমটি আবিষ্কার করেন। তিনি জাভাস্ক্রিপট আর সি এস এস দিয়েই গেইম এর ডেমো বানিয়ে সবাই কে তাক লাগিয়ে দেন!

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

কর্নার গেইম!

Screenshot from 2018-11-11 01-54-44যে কোন একটি কর্নারকে টার্গেট করে, ওই কর্নারে বোর্ডের সবচেয়ে বড় টাইলসকে মুভ করে এই স্ট্রাটেজি কাজে লাগাতে পারেন। আমি সাধারণত নিচের যে কোন একটা কর্নারকে টার্গেট করে এর পরে ছোট থেকে বড় ক্রমানুসারে সাজানোর চেষ্টা করি। এইটা খুবই কাজে দেয় তবে, একটা জিনিস মাথায় রাখতে হবে তা হলো কোন ক্রমেই যাতে সবচেয়ে বড় সংখ্যার টাইলসটি যাতে কর্নার থেকে সরে না যায়। গেলে মহা বিপদ এবং বেশীর ভাগ ক্ষেত্রে রিকোভার করা আর পসিবল হয় না

তাই, ‘সবসময় চেষ্টা করতে হবে একদম কর্নারের টাইলস এ সবচেয়ে বড় সংখ্যাটি যেন স্থির থাকে।’ 

প্রটেক্ট কর্নার

আগেই যেটা বললাম শুধু মাত্র এদিক ঐদিকে সোয়াইপ করে আপনি হয়ত হাইয়েস্ট ২৫৬ রিচ করতে পারবেন। কিন্তু ২০৪৮ রিচ করা অনেক কঠিন হবে। কর্নার টাইলসের হাইয়েস্ট ভ্যালু এর টাইলস কে প্রটেক্ট করার আরেকটা টেকনিক হলো এর আশে পাশের টাইলস গুলোকে ও বড় করে তোলা। তখন, ওই কর্নার পিসের মুভ করার পসিবলিটি কমে যায়।

তাড়াহুড়ো না করা

অনেক সময় আমরা অবচেতন মনেই অনেক তাড়াহুড়ো করা শুরু করে দিই। এই গেইমের সোয়াইপ জেস্টার তাড়াহুড়ো করার প্রবণতা কে আরও বাড়িয়ে দেয়। বেশীর ভাগ ক্ষেত্রেই তাড়াহুড়োর কারণে অনেক ভালো ফরমেশন ও মুহূর্তে নষ্ট হয়ে যেতে পারে। তাই, ঠাণ্ডা মাথায় ধীরে সুস্থে খেলাটাই বুদ্ধিমত্তার পরিচায়ক।

শেষ রো ফিলাপ করে রাখা

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

বড় নাম্বার কে তাড়া না করা

সবসময় বড় নাম্বার কে তাড়া করে বেশিদূর জাওয়া পসিবল না। আপনাকে অবশ্যই সামগ্রিকভাবে চিন্তা করতে হবে। একটু প্ল্যানিং করে খেললেই খুব সহজেই ১০২৪ + স্কোর করে এমনকি ২০৪৮ রিচ করে ফেলতে পারেন। তাই, বড় নাম্বার কে তাড়া না করে সুন্দর ভাবে গেইম প্ল্যান সেটআপ করে নিবেন।

এক সাথে অনেক গুলো টাইলস মিলানো

এটা সবচেয়ে বেশী ইফেক্টিভ, যখনই সুযোগ পাবেন, এক সাথে কয়েকটা মিলানোর সাথেই সাথেই সুযোগ কাজে লাগাবেন। কয়েকটা টাইলস একসাথে মিলাতে পারলে দেখবেন বোর্ড ফাকা হয়ে যাবে। ফলে, আপনি সহজে আপনার প্ল্যান কাজে লাগাতে পারেবেন।

এছাড়াও, আপনার যদি কোন টিপস বা ট্রিকস থাকে তাহলে কমেন্টে জানাতে পারেন। 😉

সবশেষে, গেইম খেলার আমন্ত্রণ রইলো। নিচের লিংক থেকে গেইমটি আপনার এন্ড্রয়েড ডিভাইসে ইন্সটল করে ফিডব্যাক জানাতে ভুলবেন না।

https://play.google.com/store/apps/details?id=com.wasi0013.classic2048

 

Classic 2048 – Game Play (Winning Strategy)

How to run Multiple Terminal Sessions on Linux VPS Server

maxresdefault

In this article, I will introduce you with one of the handy tool for your vps servers. It is an extremely useful app for maintaining multiple terminal sessions through just one window! This Command Line Utility is called Screen.

You may think of it as a Manager who manages different terminal sessions for you using shell. You don’t even need a X Server to run it!

How to Install Screen?

You can install it by typing the following commands:

sudo apt update 
sudo apt install screen

The above command should work on distros like Ubuntu 16.04 LTS, Xubuntu or, debian etc. If you have a different distro find appropriate installation information for it.

Common Commands of Screen

Try running the following command after successful installation:

screen

The output of the above command will be oddly surprising! You will see some texts about screen and you will be in terminal again!

Actually, the screen is running now! you can verify it by pressing `​ctrl+a ?` the output will be:

                       Screen key bindings, page 1 of 2.

                       Command key:  ^A   Literal ^A:  a

  break       ^B b         license     ,            removebuf   =         
  clear       C            lockscreen  ^X x         reset       Z         
  colon       :            log         H            screen      ^C c      
  copy        ^[ [         login       L            select      '         
  detach      ^D d         meta        a            silence     _         
  digraph     ^V           monitor     M            split       S         
  displays    *            next        ^@ ^N sp n   suspend     ^Z z      
  dumptermcap .            number      N            time        ^T t      
  fit         F            only        Q            title       A         
  flow        ^F f         other       ^A           vbell       ^G        
  focus       ^I           pow_break   B            version     v         
  hardcopy    h            pow_detach  D            width       W         
  help        ?            prev        ^H ^P p ^?   windows     ^W w      
  history     { }          quit        \            wrap        ^R r      
  info        i            readbuf     <            writebuf    >         
  kill        K k          redisplay   ^L l         xoff        ^S s      
  lastmsg     ^M m         remove      X            xon         ^Q q      

                  [Press Space for next page; Return to end.]

 

well, ctrl+a is a shortcut for different screen commands and the above output lists all of them! Feel free to explore all of them, as they will be quite handy!

I really liked this digital ocean’s tutorial of Screen commands. Read it if you want to learn the basics of screen

Helpful Resources:

How to create a .torrent file to share files or directories with a self hosted Private Tracker in Linux

What is Torrent File?

Torrent File contains metadata of file system and directories that you want to distribute using the BitTorrent File Distribution System. Along with the meta data it also contains list of trackers. The Network location of trackers are noted in the tracker list.

According to wikipedia:

BitTorrent tracker is a special type of server, one that assists in the communication between peers using the BitTorrent protocol. In peer-to-peer file sharing, a software client on an end-user PC requests a file, and portions of the requested file residing on peer machines are sent to the client, and then reassembled into a full copy of the requested file. The “tracker” server keeps track of where file copies reside on peer machines, which ones are available at time of the client request, and helps coordinate efficient transmission and reassembly of the copied file. Clients that have already begun downloading a file communicate with the tracker periodically to negotiate faster file transfer with new peers, and provide network performance statistics; however, after the initial peer-to-peer file download is started, peer-to-peer communication can continue without the connection to a tracker.

Alright, now that we know about torrent file and trackers lets just jump right into it 🙂

You will need:

  • A Computer to use it as a server. A LINUX based VPS Server is recommended though.  You can get one from Linode. It is quite cheap and very stable (around 5$ per month)
    Use my referral to get free credits:
    https://www.linode.com/?r=00453cca3ebd20582030ca874fbdd626a88b66cd
  • For this tutorial I’m gonna use Ubuntu 16.04 LTS, but you can choose any debian based distro and it should work.
  • Idea of Basic Linux commands & file structure

Setting up a VPS on Linode

You can use the Linode Promo code: DOCS10 to get 10$ credit on a new account! Linode’s documentation is great! It will get you started in minutes. Once you complete this return to this article.
Note: It is always a good idea to secure your vps server as much as possible. So, use a strong password for the root user and, optionally you can install packages like fail2ban, ufw etc.  You can also follow this instructions if you like.

Install Dependencies

Once, you are done with initial vps setup. Follow the following instructions to install the necessary packages for creating our own torrent tracker. Here we will be using bittornado & ctorrent for creating tracker and torrent file respectively. We will also use screen command to run multiple terminal sessions. To install all of them you can run the following command:

apt install bittornado ctorrent screen

Start the tracker

Now that, we have screen installed, we can create a new screen terminal session by running the command:

screen

You will be redirected to a new terminal prompt. You can check out the various screen commands by pressing ctrl+A ? (press ‘enter’ or, hit ‘return’ to exit the help menu)

In the new screen session, you can start your tracker by running the following commands:

mkdir ~/.bttrack
bttrack --port 6969 --dfile ~/.bttrack/dstate --logfile ~/.bttrack/tracker.log --nat_check 0 --scrape_allowed full

The first command will create a new hidden directory in your home folder called ​bttrack and the second command will start your own private torrent tracker!

Detach the screen session by pressing ctrl+A d

It will switch you back to the terminal and keep the tracker running in background screen terminal session which you can resume later if you wish.

Upload your File/Directory to VPS

You will have to upload the file/directory that you wish to share using .torrent file on your vps, In order to seed it from your vps using your private tracker. There are numerous ways to upload files on vps, I prefer ssh though.

If you have enabled ssh login to your server from your local computer. You can share your file with a single scp command from your local computer:

scp -r <source_file_path_of_your_local_directory>  <user>@<ip_address>:<destination_file_path>

example from my local computer I typed:

scp -r  ~/Desktop/MyFile/torrent_this.mp4 root@127.000.000.001:/MyFile/torrent_this.mp4

Here I’m uploading my ​ torrent_this.mp4 file to my vps using ssh. Note that, my username is root and ip address is 127.000.00.001 you will have to put your  username & ip address instead of those.

Creating .torrent file using ctorrent

So far, we have enabled our tracker and uploaded the file we wished to share using torrent. Now, lets make the .torrent file using ctorrent, the command is quite simple!

ctorrent -t -u "http://YOUR_SERVER_IP:6969/announce" -s torrent_file_name.torrent file_or_folder_for_torrent

It will create a .torrent file in the current directory! Voila!

Seed your .torrent file

to seed your .torrent file. Just run the command screen from the torrent file/directory location and run the command:

screen ctorrent torrent_file_name.torrent

It will start to seed your torrent file.  Press ctrl+A d to detach the screen session and keep seeding in background. Now you can distribute your .torrent file.

People will be able to download it and seed it using any torrent client!

 

Python Nested List Comprehension for…in goes from left to right!

The Confusion

Scenario: You were asked to write the equivalent list comprehension of the following code:
for i in range(6):
    for j in range(i):
        j
Before, starting with the above one we try the simplest one:
t = []
for i in range(6):
   t.append(i**2)
We already know the syntax of list comprehension is as follows: expression for expr in sequence1 So, for the above code we write:
 [i**2 for  i in range(6)]
You might have already started to smell the confusion, didn’t you? If not Read on… 🙂 Now, if I ask you to write the list comprehension for the first example code, you might end up with the following:
[ j for j in range(i) for i in range(6)]
when you execute the above code: Surprise, surprise! You will get a  NameError instead!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined

What went wrong?

The nested fors in the list comprehension are evaluated from left to right. So, the correct list comprehension is:
[j for i in range(6) for j in range(i)]
In  the official documentation they explained it thoroughly!
List comprehensions have the form:
 [ expression for expr in sequence1
              for expr2 in sequence2 ...
              for exprN in sequenceN
              if condition ]
The for…in clauses contain the sequences to be iterated over. The sequences do not have to be the same length, because they are not iterated over in parallel, but from left to right; this is explained more clearly in the following paragraphs. The elements of the generated list will be the successive values of expression. The final if clause is optional; if present, expression is only evaluated and added to the result if condition is true. To make the semantics very clear, a list comprehension is equivalent to the following Python code:
for expr1 in sequence1:
    for expr2 in sequence2:
    ...
        for exprN in sequenceN:
             if (condition):
                  # Append the value of
                  # the expression to the
                  # resulting list.
  credit: https://stackoverflow.com/questions/52565893/nameerror-in-python-nested-for-loops-of-list-comprehension

How to take Password input in Python

Did you know? There is a python module in Python Standard Library called getpass. The purpose of this library is to securely take input from user!

The module is very handy for sensitive inputs such as passwords / keys or any kind of credentials.

Simplest example of getpass could be this:

import getpass
password = getpass.getpass("enter password:")

The code is pretty straight forward! This password prompt will act similarly to unix password prompt, and it won’t echo user inputs (i.e. the key presses) hence, the password you type won’t be visible to end users. The best thing about this module is it is cross platform. So, you can use it on Windows, Linux or Mac.

There are only two functions listed in  The official documentation.
These are:

  •  getpass() – password prompt
  • getuser() – collects username from different environment variables

But, there are more than that, let me show you 😉

>>> import getpass
>>> dir(getpass)
['GetPassWarning', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_raw_input', 'contextlib', 'fallback_getpass', 'getpass', 'getuser', 'io', 'os', 'sys', 'termios', 'unix_getpass', 'warnings', 'win_getpass']

If you inspect carefully you will notice there are two more functions listed in the __dir__

  • unix_getpass( )
    unix_getpass(prompt='Password: ', stream=None)
     Prompt for a password, with echo turned off.
     
     Args:
     prompt: Written on stream to ask for the input. Default: 'Password: '
     stream: A writable file object to display the prompt. Defaults to
     the tty. If no tty is available defaults to sys.stderr.
     Returns:
     The seKr3t input.
     Raises:
     EOFError: If our input tty or stdin was closed.
     GetPassWarning: When we were unable to turn echo off on the input.
     
     Always restores terminal settings before returning.
  • win_getpass( )
    Help on function win_getpass in module getpass:
    
    win_getpass(prompt='Password: ', stream=None)
     Prompt for password with echo off, using Windows getch().

The docstring of these functions tells it all doesn’t it? 🙂

Note that, the win_getpass function uses the Windows getch() so, it requires the msvcrt module.

 

 

When to use Abstract Class in Python?

In this article, I would like to answer a common question that pops up in mind whenever we start to learn Object Oriented Programming in Python.  But before we begin exploring the use case, first lets briefly discuss about what really is an abstract class in python:

abstract_base_class_python

Abstract Class

Abstract Class is a class that contains one or more abstract methods. These abstract methods are  methods without any implementation!

Sounds weird right?  Actually it is true for most of the Object Oriented Programming Language. Abstract method has no implementation in other words no function body! Sub classes implement these abstract methods to fulfill their needs.
But, Python’s abstract method is somewhat different as it is possible to create abstract method with body in python! To know more about python’s abstract class checkout this tutorial 

Now, lets move on to our original question when to use abstract class?

Use of Abstract Class

Abstract class is useful when we want to define many different classes with similar class structure e.g. with same method signatures. Now I will try to explain it with an example. Lets say we want to create classes for different shapes such as Triangle, Rectangle, Pentagon, Hexagon and so on…

In this case, you will find a lot of attributes that are common in each shape but, require different implementation.
For example, consider the attribute area, for all these shapes you will need different formulas to calculate area. Hence, for each classes of Triangle, Rectangle and other shapes there will always be a method called area which will calculate area but, the implementation of this method ‘area’ will vary from one to another.
Like the area attribute there are tons of different attributes that are common in each shape but requires different implementation for each classes. These common properties will be pretty cumbersome to handle if we don’t group them.
Thus, it opens up an opportunity to abstract things little bit so that we can maintain them in a better way.

We can simply create an Abstract class and name it say as `Polygon` with all the common attribute/properties of shapes and, use it to create rest of the classes for different shapes.

from abc import ABC, abstractmethod


class Polygon(ABC):
    @abstractmethod
    def area(self):
        pass
    @abstractmethod
    def perimeter(self):
        pass

The plus point is, abstract class can’t be instantiated. So, object creation by instantiating the Abstract Class Polygon won’t be possible.

If you try to instantiate the Polygon object like below:

obj = Polygon()

It will raise an Exception

TypeError: Can't instantiate abstract class Polygon with abstract methods area

Now that we have our abstract base class for different shapes we can create different sub classes for these shapes just like below:


P.S. Whenever you find a situation where many of your classes has a common structure but require different implementations you can use abstract class to construct a Base Class for abstraction. 

Why Abstract Class is necessary?

Abstract class offer many things such as semantic contract between clients & class implementations, also provides protection from missing implementations of must needed methods of sub classes. It means rather than getting an AttributeError at run time just to know that you forgot to implement something really important, the abstract class will let you know straight at initialization that you have forgotten to implement an important method(abstract)!

By making sure at instantiation time  that the sub classes implement some particular methods while maintaining class hierarchy Python’s Abstract Base class saves you from bugs and overheads.

I would recommend reading this stack overflow question and answers for the in depth discussion on the above question.