मॉड्यूल्स और स्टैंडर्ड लाइब्रेरी
Python के साथ उपयोग के लिए तैयार उपकरणों का एक विशाल संग्रह आता है: रैंडमनेस, गणित, तिथियाँ, फ़ाइल पाथ्स, और बहुत कुछ। ये उपकरण मॉड्यूल्स में रहते हैं, और आप उन्हें import के साथ अपने कोड में लाते हैं। आप पिछले अध्याय में पहले ही import json का उपयोग कर चुके हैं। यह अध्याय imports को पूरी तरह से कवर करता है और स्टैंडर्ड लाइब्रेरी के सबसे उपयोगी हिस्सों का परिचय देता है।
मॉड्यूल्स इम्पोर्ट करना
सबसे सरल इम्पोर्ट एक पूरे मॉड्यूल को लाता है और आपको डॉट नोटेशन के साथ उसकी सामग्री का उपयोग करने देता है। आप एक मॉड्यूल से विशिष्ट नाम भी इम्पोर्ट कर सकते हैं ताकि उन्हें प्रीफिक्स के बिना सीधे उपयोग किया जा सके। उपनाम (aliases) लंबे नामों को छोटा करते हैं।
import math
math.sqrt(16) # 4.0
math.pi # 3.141592653589793
math.floor(3.9) # 3
math.ceil(3.1) # 4किसी मॉड्यूल से विशिष्ट नाम इम्पोर्ट करें ताकि आप उन्हें सीधे उपयोग कर सकें:
from math import sqrt, pi
sqrt(16) # 4.0 ("math." प्रीफिक्स की आवश्यकता नहीं)
pi # 3.141592653589793किसी मॉड्यूल या नाम को छोटा करने के लिए उपनाम दें:
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 हर बार एक ही अनुक्रम उत्पन्न करता है।
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 सेट करें:
random.seed(42)
random.randint(1, 100) # seed 42 के लिए हमेशा एक ही मानएक ही seed हर बार, किसी भी मशीन पर, एक ही अनुक्रम उत्पन्न करता है।
math
math मॉड्यूल बुनियादी अंकगणितीय ऑपरेटरों के अलावा अधिक उन्नत गणितीय संक्रियाएँ जोड़ता है। वर्गमूल, घात, लघुगणक, त्रिकोणमिति, और pi तथा अनंत जैसे विशेष मान सभी यहाँ हैं।
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) # Truedatetime
datetime मॉड्यूल तिथियों और समयों को हैंडल करता है। datetime.now() आपको वर्तमान तिथि और समय देता है। strftime() इसे एक स्ट्रिंग के रूप में फ़ॉर्मेट करता है। strptime() एक स्ट्रिंग को datetime में पार्स करता है। timedelta एक अवधि का प्रतिनिधित्व करता है जिसे आप जोड़ या घटा सकते हैं।
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 कोड:
| कोड | अर्थ | उदाहरण |
|---|---|---|
%Y | 4-अंकीय वर्ष | 2024 |
%m | माह (शून्य-पैडेड) | 01 |
%d | दिन (शून्य-पैडेड) | 15 |
%H | घंटा (24h) | 09 |
%M | मिनट | 42 |
%B | पूर्ण माह का नाम | January |
os और pathlib
pathlib फ़ाइल पाथ्स के साथ काम करने का आधुनिक तरीका है। Path ऑब्जेक्ट्स आपको / ऑपरेटर का उपयोग करके पाथ्स बनाने, निरीक्षण करने और नेविगेट करने देते हैं। os एन्वायरनमेंट वेरिएबल्स और निम्न-स्तरीय OS संक्रियाओं तक पहुँच देता है। नए कोड के लिए pathlib को प्राथमिकता दें।
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 मॉड्यूल के लिए:
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 मापता है कि कोड को चलने में कितना समय लगता है। यह तब उपयोगी है जब आप दो दृष्टिकोणों की तुलना करना चाहते हैं और तेज़ वाले को चुनना चाहते हैं। स्थिर माप पाने के लिए कोड को कई बार चलाएँ।
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 मॉड्यूल अक्षरों, अंकों और विराम चिह्नों के लिए पूर्व-निर्मित स्ट्रिंग स्थिरांक प्रदान करता है। तब उपयोगी है जब आपको अक्षरों की जाँच करने या किसी विशिष्ट वर्णमाला से रैंडम स्ट्रिंग्स उत्पन्न करने की आवश्यकता हो।
import string
string.ascii_lowercase # "abcdefghijklmnopqrstuvwxyz"
string.ascii_uppercase # "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
string.ascii_letters # दोनों संयुक्त
string.digits # "0123456789"
string.punctuation # सभी विराम चिह्न अक्षरतब उपयोगी है जब आपको अक्षरों की जाँच करने या रैंडम स्ट्रिंग्स उत्पन्न करने की आवश्यकता हो:
import string, random
chars = string.ascii_letters + string.digits
password = "".join(random.choices(chars, k=12))अपने स्वयं के मॉड्यूल्स बनाना
कोई भी Python फ़ाइल एक मॉड्यूल है। किसी अन्य फ़ाइल से उसका उपयोग करने के लिए, इसे फ़ाइल नाम से (.py के बिना) इम्पोर्ट करें। आप पूरे मॉड्यूल को इम्पोर्ट कर सकते हैं और डॉट नोटेशन के साथ इसकी सामग्री का उपयोग कर सकते हैं, या विशिष्ट नामों को सीधे इम्पोर्ट कर सकते हैं।
# utils.py
def clamp(value, lo, hi):
return max(lo, min(value, hi))
PI = 3.14159# main.py
import utils
utils.clamp(150, 0, 100) # 100
utils.PI # 3.14159
from utils import clamp
clamp(50, 0, 100) # 50Python इम्पोर्ट करने वाली फ़ाइल के समान डायरेक्टरी (और कुछ अन्य स्थानों) में देखकर मॉड्यूल को ढूँढता है। बड़े प्रोजेक्ट्स के लिए, मॉड्यूल्स पैकेजेस में व्यवस्थित होते हैं: __init__.py फ़ाइल वाली डायरेक्टरीज़।
__name__ == "__main__"
जब Python किसी फ़ाइल को सीधे चलाता है, तो __name__ "__main__" पर सेट होता है। जब उसी फ़ाइल को एक मॉड्यूल के रूप में इम्पोर्ट किया जाता है, तो __name__ मॉड्यूल का नाम होता है। यह पैटर्न आपको ऐसा कोड लिखने देता है जो फ़ाइल को सीधे निष्पादित करने पर चलता है लेकिन फ़ाइल को किसी अन्य मॉड्यूल द्वारा इम्पोर्ट किए जाने पर छोड़ दिया जाता है।
# 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यह किसी भी मॉड्यूल के लिए एक मानक पैटर्न है जो स्टैंडअलोन स्क्रिप्ट के रूप में भी उपयोगी है।
स्टैंडर्ड लाइब्रेरी की मुख्य विशेषताएँ
जानने योग्य कुछ और मॉड्यूल्स। प्रत्येक एक सामान्य समस्या का समाधान करता है जिसे स्वयं लागू करने में काफ़ी काम लगेगा।
collections: विशेष कंटेनर प्रकार:
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/popitertools: इटरेबल्स के साथ काम करने के लिए उपकरण:
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 इंटरप्रेटर तक पहुँच:
import sys
sys.argv # कमांड-लाइन आर्ग्युमेंट्स की लिस्ट
sys.exit(1) # स्टेटस कोड के साथ बाहर निकलें
sys.version # Python संस्करण स्ट्रिंगथर्ड-पार्टी पैकेजेस: स्टैंडर्ड लाइब्रेरी से परे, pip कम्युनिटी पैकेजेस इंस्टॉल करता है:
pip install requests # HTTP लाइब्रेरी
pip install pandas # डेटा मैनिपुलेशन
pip install numpy # न्यूमेरिकल कंप्यूटिंगथर्ड-पार्टी पैकेजेस इस गाइड के दायरे से बाहर हैं, लेकिन पैटर्न हमेशा एक ही होता है: pip install, फिर import।
व्यवहार में
टाइमस्टैम्प के साथ अद्वितीय गेम IDs उत्पन्न करने के लिए random, string, और datetime का संयोजन:
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)}")
