Skip to content
This page has been auto-translated and may contain errors.View in English

मॉड्यूल्स और स्टैंडर्ड लाइब्रेरी

Python के साथ उपयोग के लिए तैयार उपकरणों का एक विशाल संग्रह आता है: रैंडमनेस, गणित, तिथियाँ, फ़ाइल पाथ्स, और बहुत कुछ। ये उपकरण मॉड्यूल्स में रहते हैं, और आप उन्हें import के साथ अपने कोड में लाते हैं। आप पिछले अध्याय में पहले ही import json का उपयोग कर चुके हैं। यह अध्याय imports को पूरी तरह से कवर करता है और स्टैंडर्ड लाइब्रेरी के सबसे उपयोगी हिस्सों का परिचय देता है।

Python की स्टैंडर्ड लाइब्रेरी सामान्य समस्याओं के लिए परीक्षित, प्रलेखित समाधान प्रदान करती है। मॉड्यूल्स कोड संगठन की इकाई हैं: प्रत्येक फ़ाइल एक मॉड्यूल है, __init__.py वाली प्रत्येक डायरेक्टरी एक पैकेज है। import सिस्टम मॉड्यूल्स को ढूँढता है, यदि आवश्यक हो तो उन्हें कंपाइल करता है, और उन्हें sys.modules में कैश करता है ताकि वे केवल एक बार लोड हों।

इम्पोर्ट सिस्टम एक स्तरित मशीनरी है: finders मॉड्यूल्स को खोजते हैं और loaders उन्हें कंपाइल और निष्पादित करते हैं। परिणाम sys.modules में कैश किए जाते हैं। import foo एक बार foo.py चलाता है और मॉड्यूल ऑब्जेक्ट को वर्तमान नेमस्पेस में foo से बाइंड करता है। from foo import bar केवल bar को बाइंड करता है। पैकेजेस बनाने के लिए sys.path, __init__.py, और रिलेटिव इम्पोर्ट्स को समझना आवश्यक है।

मॉड्यूल्स इम्पोर्ट करना

सबसे सरल इम्पोर्ट एक पूरे मॉड्यूल को लाता है और आपको डॉट नोटेशन के साथ उसकी सामग्री का उपयोग करने देता है। आप एक मॉड्यूल से विशिष्ट नाम भी इम्पोर्ट कर सकते हैं ताकि उन्हें प्रीफिक्स के बिना सीधे उपयोग किया जा सके। उपनाम (aliases) लंबे नामों को छोटा करते हैं।

import module मॉड्यूल ऑब्जेक्ट को वर्तमान स्कोप में module नाम से बाइंड करता है। from module import name केवल name को बाइंड करता है। उपनाम (import module as alias) थर्ड-पार्टी लाइब्रेरियों के साथ सामान्य हैं। from module import * से बचें: यह नेमस्पेस को प्रदूषित करता है और यह स्पष्ट नहीं रहता कि नाम कहाँ से आए।

import module पूर्ण इम्पोर्ट मशीनरी को ट्रिगर करता है, परिणाम को sys.modules में कैश करता है, और मॉड्यूल ऑब्जेक्ट को बाइंड करता है। from module import name सिंटैक्टिक शुगर है: यह अभी भी पूरे मॉड्यूल को इम्पोर्ट करता है, फिर name को निकालता है। सर्कुलर इम्पोर्ट्स एक सामान्य समस्या है; समाधान आमतौर पर इम्पोर्ट्स को फंक्शंस के अंदर ले जाना या मॉड्यूल निर्भरताओं को पुनर्संरचित करना है। importlib.import_module() प्रोग्रामेटिक इम्पोर्ट्स की अनुमति देता है।

python
import math

math.sqrt(16)     # 4.0
math.pi           # 3.141592653589793
math.floor(3.9)   # 3
math.ceil(3.1)    # 4

किसी मॉड्यूल से विशिष्ट नाम इम्पोर्ट करें ताकि आप उन्हें सीधे उपयोग कर सकें:

python
from math import sqrt, pi

sqrt(16)    # 4.0 ("math." प्रीफिक्स की आवश्यकता नहीं)
pi          # 3.141592653589793

किसी मॉड्यूल या नाम को छोटा करने के लिए उपनाम दें:

python
import math as m

m.sqrt(16)    # 4.0

from math import sqrt as square_root
square_root(25)    # 5.0

उपनाम लोकप्रिय थर्ड-पार्टी लाइब्रेरियों के साथ सामान्य हैं (import numpy as np, import pandas as pd)। स्टैंडर्ड लाइब्रेरी मॉड्यूल्स के लिए, पूरे नाम का उपयोग करना पसंद करें; यह कोड को पढ़ने में आसान बनाता है।

random

random मॉड्यूल रैंडम संख्याएँ उत्पन्न करता है और रैंडम चुनाव करता है। इसका उपयोग गेम्स, सिमुलेशन, रैंडम सैम्पलिंग, और किसी भी अन्य चीज़ के लिए करें जिसे अप्रत्याशितता की आवश्यकता हो। seed सेट करने से परिणाम पुनरुत्पादन योग्य होते हैं: एक ही seed हर बार एक ही अनुक्रम उत्पन्न करता है।

random एक Mersenne Twister स्यूडो-रैंडम नंबर जनरेटर का उपयोग करता है। seed पूरे अनुक्रम को निर्धारित करता है; एक ही seed हमेशा एक ही आउटपुट उत्पन्न करता है। .choice() एक आइटम चुनता है, .choices() प्रतिस्थापन के साथ चुनता है, .sample() बिना प्रतिस्थापन के चुनता है। .shuffle() लिस्ट को इन-प्लेस संशोधित करता है और None लौटाता है।

random 624-शब्द स्टेट के साथ Mersenne Twister (MT19937) PRNG का उपयोग करता है। random.seed() स्टेट को इनिशियलाइज़ करता है; इसके बिना, स्टेट os.urandom() से सीड किया जाता है। क्रिप्टोग्राफिक उद्देश्यों के लिए, इसके बजाय secrets का उपयोग करें: random क्रिप्टोग्राफिक रूप से सुरक्षित नहीं है। random.SystemRandom() एक समान API के साथ सुरक्षित विकल्प के लिए os.urandom() को रैप करता है।

python
import random

random.random()              # 0 और 1 के बीच फ्लोट (विशेष)
random.randint(1, 10)        # 1 से 10 तक पूर्णांक (दोनों समावेशी)
random.uniform(1.0, 10.0)    # 1.0 और 10.0 के बीच फ्लोट

colours = ["red", "green", "blue"]
random.choice(colours)       # एक आइटम चुनता है
random.choices(colours, k=3) # k आइटम चुनता है (प्रतिस्थापन के साथ)
random.sample(colours, k=2)  # k आइटम चुनता है (बिना प्रतिस्थापन)

numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)      # इन-प्लेस शफल करता है, None लौटाता है

पुनरुत्पादन योग्य परिणामों के लिए (परीक्षण और डेटा साइंस में उपयोगी), उत्पन्न करने से पहले एक seed सेट करें:

python
random.seed(42)
random.randint(1, 100)   # seed 42 के लिए हमेशा एक ही मान

एक ही seed हर बार, किसी भी मशीन पर, एक ही अनुक्रम उत्पन्न करता है।

math

math मॉड्यूल बुनियादी अंकगणितीय ऑपरेटरों के अलावा अधिक उन्नत गणितीय संक्रियाएँ जोड़ता है। वर्गमूल, घात, लघुगणक, त्रिकोणमिति, और pi तथा अनंत जैसे विशेष मान सभी यहाँ हैं।

math स्टैंडर्ड गणितीय फंक्शंस के C-स्तर के कार्यान्वयन प्रदान करता है। ध्यान दें कि math.pow() हमेशा float लौटाता है, जबकि Python का ** ऑपरेटर पूर्णांक आधारों और घातांकों के लिए int लौटाता है। math.log(x, base) किसी भी आधार पर लघुगणक की गणना करता है; math.log(x) प्राकृतिक लघुगणक की गणना करता है।

math C <math.h> लाइब्रेरी फंक्शंस को रैप करता है। ये शुद्ध Python कार्यान्वयन की तुलना में तेज़ हैं और एज केसेस (NaN, अनंत) को सही ढंग से हैंडल करते हैं। math.isnan() और math.isinf() IEEE 754 विशेष मानों की जाँच करते हैं। जटिल संख्याओं के लिए, cmath संबंधित फंक्शंस प्रदान करता है। ऐरे-स्तर के गणित के लिए, numpy मानक उपकरण है।

python
import math

math.sqrt(25)        # 5.0
math.pow(2, 10)      # 1024.0 (2 ** 10 के समान लेकिन हमेशा float लौटाता है)
math.log(100, 10)    # 2.0 (log बेस 10)
math.log(math.e)     # 1.0 (प्राकृतिक log)

math.sin(math.pi / 2)   # 1.0
math.cos(0)             # 1.0

math.ceil(3.2)    # 4
math.floor(3.9)   # 3
math.trunc(3.9)   # 3 (धनात्मक के लिए int() के समान)

math.inf          # अनंत
math.isnan(float("nan"))   # True
math.isinf(math.inf)       # True

datetime

datetime मॉड्यूल तिथियों और समयों को हैंडल करता है। datetime.now() आपको वर्तमान तिथि और समय देता है। strftime() इसे एक स्ट्रिंग के रूप में फ़ॉर्मेट करता है। strptime() एक स्ट्रिंग को datetime में पार्स करता है। timedelta एक अवधि का प्रतिनिधित्व करता है जिसे आप जोड़ या घटा सकते हैं।

datetime, date, और timedelta मुख्य क्लासेस हैं। strftime() फ़ॉर्मेट कोड का उपयोग करके datetime को एक स्ट्रिंग के रूप में फ़ॉर्मेट करता है। strptime() दिए गए फ़ॉर्मेट पैटर्न के साथ एक स्ट्रिंग को पार्स करता है। timedelta अंकगणित का समर्थन करता है: आप तिथियों से अवधियाँ जोड़ या घटा सकते हैं और datetimes की तुलना <, >, - के साथ कर सकते हैं।

datetime ऑब्जेक्ट्स डिफ़ॉल्ट रूप से नैव होते हैं (कोई टाइमज़ोन नहीं)। टाइमज़ोन-अवेयर datetimes के लिए, datetime.now(tz=timezone.utc) या ऑफ़सेट के साथ datetime.fromisoformat() का उपयोग करें। strftime/strptime C-लाइब्रेरी फ़ॉर्मेट कोड का उपयोग करते हैं; %f माइक्रोसेकंड देता है। उच्च-सटीकता टाइमिंग के लिए, datetime.now() के बजाय time.perf_counter() को प्राथमिकता दें। zoneinfo मॉड्यूल (Python 3.9+) IANA टाइमज़ोन समर्थन प्रदान करता है।

python
from datetime import datetime, date, timedelta

now   = datetime.now()           # वर्तमान तिथि और समय
today = date.today()             # केवल वर्तमान तिथि

print(now.year, now.month, now.day)
print(now.hour, now.minute, now.second)

# फ़ॉर्मेटिंग
print(now.strftime("%Y-%m-%d"))           # "2024-01-15"
print(now.strftime("%d %B %Y, %H:%M"))   # "15 January 2024, 09:42"

# पार्सिंग
deadline = datetime.strptime("2024-12-31", "%Y-%m-%d")

# अंकगणित
tomorrow    = today + timedelta(days=1)
next_week   = today + timedelta(weeks=1)
diff        = deadline - now
print(f"{diff.days} days until deadline")

सामान्य strftime कोड:

कोडअर्थउदाहरण
%Y4-अंकीय वर्ष2024
%mमाह (शून्य-पैडेड)01
%dदिन (शून्य-पैडेड)15
%Hघंटा (24h)09
%Mमिनट42
%Bपूर्ण माह का नामJanuary

os और pathlib

pathlib फ़ाइल पाथ्स के साथ काम करने का आधुनिक तरीका है। Path ऑब्जेक्ट्स आपको / ऑपरेटर का उपयोग करके पाथ्स बनाने, निरीक्षण करने और नेविगेट करने देते हैं। os एन्वायरनमेंट वेरिएबल्स और निम्न-स्तरीय OS संक्रियाओं तक पहुँच देता है। नए कोड के लिए pathlib को प्राथमिकता दें।

pathlib.Path फ़ाइलसिस्टम पाथ्स को क्वेरी और नेविगेट करने के लिए विधियों वाले ऑब्जेक्ट्स के रूप में प्रस्तुत करता है। / ऑपरेटर OS-विशिष्ट सेपरेटर्स को स्वचालित रूप से हैंडल करते हुए, पाथ कंपोनेंट्स को स्वच्छता से जोड़ता है। os.environ एन्वायरनमेंट वेरिएबल्स के लिए एक dict-समान ऑब्जेक्ट है; os.environ.get("KEY", "default") लापता वेरिएबल्स के लिए सुरक्षित है।

pathlib.Path एक अमूर्त आधार है जिसमें प्रत्येक OS के लिए ठोस कार्यान्वयन के रूप में PurePosixPath और PureWindowsPath हैं। .glob(), .rglob(), और .iterdir() जैसी विधियाँ जनरेटर लौटाती हैं। .stat() os.stat() को कॉल करता है और एक stat_result लौटाता है। Python 3.6 के बाद से os.path फंक्शंस स्ट्रिंग्स और Path ऑब्जेक्ट्स दोनों को स्वीकार करते हैं। नए कोड के लिए pathlib को प्राथमिकता दें; उन APIs को कॉल करते समय Path को str में बदलने के लिए os.fspath() का उपयोग करें जो Path स्वीकार नहीं करते।

python
from pathlib import Path

p = Path("data/reports")

p.exists()           # True यदि पाथ मौजूद है
p.is_dir()           # True यदि यह एक डायरेक्टरी है
p.is_file()          # True यदि यह एक फ़ाइल है

p.mkdir(parents=True, exist_ok=True)   # डायरेक्टरीज़ बनाएँ

for f in p.glob("*.csv"):              # डायरेक्टरी में सभी CSV फ़ाइलें
    print(f.name)                      # केवल फ़ाइल का नाम

report = p / "report_jan.csv"          # / ऑपरेटर पाथ्स को जोड़ता है
report.stem       # "report_jan" (एक्सटेंशन के बिना नाम)
report.suffix     # ".csv"
report.parent     # Path("data/reports")

content = report.read_text()           # सीधे फ़ाइल की सामग्री पढ़ें
report.write_text("new content\n")    # सीधे लिखें

os मॉड्यूल के लिए:

python
import os

os.getcwd()                        # वर्तमान कार्यशील डायरेक्टरी
os.listdir(".")                    # डायरेक्टरी की सामग्री लिस्ट करें
os.path.exists("data.txt")        # True यदि पाथ मौजूद है
os.path.join("data", "file.txt")  # "data/file.txt" (क्रॉस-प्लेटफ़ॉर्म)
os.environ.get("HOME")            # एक एन्वायरनमेंट वेरिएबल पढ़ें

नए कोड के लिए pathlib को प्राथमिकता दें। जब आपको एन्वायरनमेंट वेरिएबल्स की आवश्यकता हो या स्ट्रिंग्स की अपेक्षा करने वाले पुराने APIs के साथ काम करना हो तो os का उपयोग करें।

timeit

timeit मापता है कि कोड को चलने में कितना समय लगता है। यह तब उपयोगी है जब आप दो दृष्टिकोणों की तुलना करना चाहते हैं और तेज़ वाले को चुनना चाहते हैं। स्थिर माप पाने के लिए कोड को कई बार चलाएँ।

timeit.timeit(stmt, setup, number) stmt को number बार चलाकर समय मापता है और सेकंड में कुल बीता हुआ समय लौटाता है। setup स्ट्रिंग टाइम्ड लूप से पहले एक बार चलती है। प्रति-कॉल समय पाने के लिए परिणाम को number से विभाजित करें। अधिक पुनरावृत्तियाँ सिस्टम शेड्यूलिंग से होने वाले शोर को कम करती हैं।

timeit शोर को कम करने के लिए टाइमिंग के दौरान गार्बेज कलेक्टर को निष्क्रिय करता है। यह उच्च-रिज़ॉल्यूशन माप के लिए time.perf_counter() का उपयोग करता है। globals पैरामीटर टाइम्ड स्टेटमेंट को एक नेमस्पेस पास करता है। माइक्रोबेंचमार्क्स के लिए, timeit मानक उपकरण है; एक बड़े प्रोग्राम में समय कहाँ बिताया जा रहा है इसकी प्रोफ़ाइलिंग के लिए, cProfile का उपयोग करें।

python
import timeit

# एक एकल स्टेटमेंट को टाइम करें
timeit.timeit("sum(range(1000))", number=10000)

# एक अधिक जटिल ब्लॉक को टाइम करें
setup = "data = list(range(1000))"
code  = "[x * 2 for x in data]"
time  = timeit.timeit(code, setup=setup, number=10000)
print(f"{time:.4f} seconds for 10,000 runs")

number यह है कि कितनी बार दोहराना है। अधिक पुनरावृत्तियाँ अधिक स्थिर माप देती हैं।

string

string मॉड्यूल अक्षरों, अंकों और विराम चिह्नों के लिए पूर्व-निर्मित स्ट्रिंग स्थिरांक प्रदान करता है। तब उपयोगी है जब आपको अक्षरों की जाँच करने या किसी विशिष्ट वर्णमाला से रैंडम स्ट्रिंग्स उत्पन्न करने की आवश्यकता हो।

string मॉड्यूल स्थिरांक (ascii_letters, digits, punctuation) सादे स्ट्रिंग्स हैं जिन्हें आप इंडेक्स कर सकते हैं, इटरेट कर सकते हैं, या in के साथ उपयोग कर सकते हैं। उन्हें random.choices() के साथ संयोजित करना रैंडम टोकन्स या पासवर्ड्स उत्पन्न करने का मानक तरीका है।

string मॉड्यूल स्थिरांक बिना किसी विशेष व्यवहार के शुद्ध Python स्ट्रिंग लिटरल हैं। वे सेट नहीं हैं, इसलिए in O(n) है; बार-बार सदस्यता परीक्षण के लिए, set(string.digits) का उपयोग करें। string.Formatter और string.Template क्रमशः str.format() और $-शैली प्रतिस्थापन के लिए अंतर्निहित मशीनरी हैं।

python
import string

string.ascii_lowercase   # "abcdefghijklmnopqrstuvwxyz"
string.ascii_uppercase   # "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
string.ascii_letters     # दोनों संयुक्त
string.digits            # "0123456789"
string.punctuation       # सभी विराम चिह्न अक्षर

तब उपयोगी है जब आपको अक्षरों की जाँच करने या रैंडम स्ट्रिंग्स उत्पन्न करने की आवश्यकता हो:

python
import string, random

chars    = string.ascii_letters + string.digits
password = "".join(random.choices(chars, k=12))

अपने स्वयं के मॉड्यूल्स बनाना

कोई भी Python फ़ाइल एक मॉड्यूल है। किसी अन्य फ़ाइल से उसका उपयोग करने के लिए, इसे फ़ाइल नाम से (.py के बिना) इम्पोर्ट करें। आप पूरे मॉड्यूल को इम्पोर्ट कर सकते हैं और डॉट नोटेशन के साथ इसकी सामग्री का उपयोग कर सकते हैं, या विशिष्ट नामों को सीधे इम्पोर्ट कर सकते हैं।

जब Python एक मॉड्यूल इम्पोर्ट करता है, तो वह फ़ाइल को ऊपर से नीचे एक बार निष्पादित करता है और परिणाम को sys.modules में कैश करता है। उसी मॉड्यूल के बाद के इम्पोर्ट फ़ाइल को फिर से चलाए बिना कैश किए गए ऑब्जेक्ट को लौटाते हैं। बड़े प्रोजेक्ट्स के लिए, मॉड्यूल्स पैकेजेस में व्यवस्थित होते हैं: __init__.py फ़ाइल वाली डायरेक्टरीज़।

इम्पोर्ट रिज़ॉल्यूशन sys.path का उपयोग करता है: क्रम में खोजी जाने वाली डायरेक्टरीज़ की एक लिस्ट। sys.path[0] स्क्रिप्ट की डायरेक्टरी है। PYTHONPATH एन्वायरनमेंट वेरिएबल अतिरिक्त डायरेक्टरीज़ को प्रीपेंड करता है। पैकेजेस को पहचाने जाने के लिए __init__.py की आवश्यकता होती है (खाली हो सकता है)। रिलेटिव इम्पोर्ट्स (from . import module) पैकेजेस के भीतर वैध हैं। importlib.reload() एक मॉड्यूल को पुनः निष्पादित करता है, लेकिन पुराने ऑब्जेक्ट्स के मौजूदा संदर्भ अद्यतन नहीं होते हैं।

python
# utils.py
def clamp(value, lo, hi):
    return max(lo, min(value, hi))

PI = 3.14159
python
# main.py
import utils

utils.clamp(150, 0, 100)   # 100
utils.PI                    # 3.14159

from utils import clamp
clamp(50, 0, 100)           # 50

Python इम्पोर्ट करने वाली फ़ाइल के समान डायरेक्टरी (और कुछ अन्य स्थानों) में देखकर मॉड्यूल को ढूँढता है। बड़े प्रोजेक्ट्स के लिए, मॉड्यूल्स पैकेजेस में व्यवस्थित होते हैं: __init__.py फ़ाइल वाली डायरेक्टरीज़।

__name__ == "__main__"

जब Python किसी फ़ाइल को सीधे चलाता है, तो __name__ "__main__" पर सेट होता है। जब उसी फ़ाइल को एक मॉड्यूल के रूप में इम्पोर्ट किया जाता है, तो __name__ मॉड्यूल का नाम होता है। यह पैटर्न आपको ऐसा कोड लिखने देता है जो फ़ाइल को सीधे निष्पादित करने पर चलता है लेकिन फ़ाइल को किसी अन्य मॉड्यूल द्वारा इम्पोर्ट किए जाने पर छोड़ दिया जाता है।

if __name__ == "__main__": निष्पादन योग्य मॉड्यूल कोड के लिए मानक गार्ड है। यह एक मॉड्यूल को इम्पोर्ट करने योग्य (इसके फंक्शंस को एक्सपोज़ करते हुए) और सीधे चलाने योग्य (परीक्षण या डेमो कोड के साथ) दोनों होने देता है। इसके बिना, मॉड्यूल को इम्पोर्ट करने से कोई भी टॉप-लेवल कोड निष्पादित होगा, जो लगभग कभी वांछित नहीं होता।

__name__ इम्पोर्ट मशीनरी द्वारा सेट किया जाता है: एंट्री-पॉइंट स्क्रिप्ट के लिए "__main__", अन्यथा मॉड्यूल का डॉटेड नाम। गार्ड साइड इफेक्ट्स (स्टार्टअप कोड, आर्ग्युमेंट पार्सिंग, टेस्ट रन्स) को इम्पोर्ट पर निष्पादित होने से रोकता है। कमांड-लाइन उपकरणों के लिए, एंट्री-पॉइंट लॉजिक को main() फंक्शन में रखना और इसे गार्ड के तहत कॉल करना मुहावरेदार पैटर्न है।

python
# utils.py
def clamp(value, lo, hi):
    return max(lo, min(value, hi))

if __name__ == "__main__":
    # यह केवल तभी चलता है जब आप करते हैं: python utils.py
    # तब नहीं जब आप करते हैं: import utils
    print(clamp(150, 0, 100))   # 100

यह किसी भी मॉड्यूल के लिए एक मानक पैटर्न है जो स्टैंडअलोन स्क्रिप्ट के रूप में भी उपयोगी है।

स्टैंडर्ड लाइब्रेरी की मुख्य विशेषताएँ

जानने योग्य कुछ और मॉड्यूल्स। प्रत्येक एक सामान्य समस्या का समाधान करता है जिसे स्वयं लागू करने में काफ़ी काम लगेगा।

स्टैंडर्ड लाइब्रेरी विस्तृत है; नीचे दी गई मुख्य विशेषताएँ वे हैं जिनका आप प्रोडक्शन कोड में सबसे अधिक सामना करेंगे। पूर्ण संदर्भ के लिए, docs.python.org/3/library आधिकारिक स्रोत है।

स्टैंडर्ड लाइब्रेरी अच्छी तरह से परीक्षित, प्रलेखित मॉड्यूल्स का एक क्यूरेटेड सेट है। थर्ड-पार्टी पैकेज के लिए जाने से पहले, जाँच करें कि क्या स्टैंडर्ड लाइब्रेरी में कोई समाधान है: functools, itertools, contextlib, dataclasses, typing, और abc प्रत्येक ऐसे उपकरण प्रदान करते हैं जिन्हें थर्ड-पार्टी पैकेजेस अक्सर पुनः-आविष्कार करते हैं।

collections: विशेष कंटेनर प्रकार:

python
from collections import Counter, defaultdict, deque

Counter(["a", "b", "a", "c", "a"])   # Counter({'a': 3, 'b': 1, 'c': 1})
defaultdict(list)                      # dict जो लापता keys को ऑटो-क्रिएट करता है
deque([1, 2, 3], maxlen=5)            # दोनों सिरों से तेज़ append/pop

itertools: इटरेबल्स के साथ काम करने के लिए उपकरण:

python
import itertools

list(itertools.chain([1, 2], [3, 4]))          # [1, 2, 3, 4]
list(itertools.islice(range(100), 5))          # [0, 1, 2, 3, 4]
list(itertools.combinations([1, 2, 3], 2))     # [(1, 2), (1, 3), (2, 3)]
list(itertools.product([0, 1], repeat=2))      # [(0,0), (0,1), (1,0), (1,1)]

sys: Python इंटरप्रेटर तक पहुँच:

python
import sys

sys.argv        # कमांड-लाइन आर्ग्युमेंट्स की लिस्ट
sys.exit(1)     # स्टेटस कोड के साथ बाहर निकलें
sys.version     # Python संस्करण स्ट्रिंग

थर्ड-पार्टी पैकेजेस: स्टैंडर्ड लाइब्रेरी से परे, pip कम्युनिटी पैकेजेस इंस्टॉल करता है:

bash
pip install requests    # HTTP लाइब्रेरी
pip install pandas      # डेटा मैनिपुलेशन
pip install numpy       # न्यूमेरिकल कंप्यूटिंग

थर्ड-पार्टी पैकेजेस इस गाइड के दायरे से बाहर हैं, लेकिन पैटर्न हमेशा एक ही होता है: pip install, फिर import

व्यवहार में

टाइमस्टैम्प के साथ अद्वितीय गेम IDs उत्पन्न करने के लिए random, string, और datetime का संयोजन:

python
import random
import string
from datetime import datetime

def generate_game_id(length: int = 8) -> str:
    chars = string.ascii_uppercase + string.digits
    return "".join(random.choices(chars, k=length))

def timestamp() -> str:
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

game_id = generate_game_id()
print(f"[{timestamp()}] Starting game {game_id}")

scores = [random.randint(50, 100) for _ in range(5)]
print(f"Round scores: {scores}")
print(f"Best: {max(scores)}")

एक डायरेक्टरी में फ़ाइलें खोजने और उनके आकार रिपोर्ट करने के लिए pathlib और datetime का उपयोग करना:

python
from pathlib import Path
from datetime import datetime

def find_files(directory: str, pattern: str = "*.csv") -> list[Path]:
    return sorted(Path(directory).glob(pattern))

def timestamp() -> str:
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

files = find_files(".", "*.md")[:3]
print(f"[{timestamp()}] Found {len(files)} file(s)")
for f in files:
    size = f.stat().st_size if f.exists() else 0
    print(f"  {f.name} ({size} bytes)")

टाइप किए गए डिफ़ॉल्ट्स के साथ एन्वायरनमेंट वेरिएबल्स से ऐप कॉन्फ़िग पढ़ना, और न्यूलाइन-डिलिमिटेड JSON के रूप में संरचित एक्सेस लॉग एंट्रीज़ लिखना:

python
import os
import json
from datetime import datetime
from pathlib import Path

def load_env_config() -> dict:
    return {
        "debug":     os.environ.get("DEBUG", "false").lower() == "true",
        "port":      int(os.environ.get("PORT", "8080")),
        "log_level": os.environ.get("LOG_LEVEL", "INFO"),
    }

def write_access_log(method: str, path: str, status: int) -> None:
    log_dir = Path("logs")
    log_dir.mkdir(exist_ok=True)
    entry = {
        "ts":     datetime.now().isoformat(),
        "method": method,
        "path":   path,
        "status": status,
    }
    with open(log_dir / "access.jsonl", "a") as f:
        f.write(json.dumps(entry) + "\n")

config = load_env_config()
print(f"Starting on port {config['port']}, debug={config['debug']}")
write_access_log("GET", "/users", 200)

न्यूलाइन-डिलिमिटेड JSON (.jsonl) एक सामान्य लॉग फ़ॉर्मेट है: प्रत्येक पंक्ति एक वैध JSON ऑब्जेक्ट है, जिससे पूरी फ़ाइल को लोड किए बिना इसे स्ट्रीम, एपेंड और पंक्ति-दर-पंक्ति पार्स करना आसान हो जाता है।