Python: المكتبة القياسية: أساسيات (ج.1)
واحدة من أعظم ميزات بايثون هي "البطاريات مشمولة" — مجموعة كاملة من المكتبات القياسية تأتي مع كل تثبيت بايثون. هذا الدرس يغطي أربعاً من أكثر الوحدات استخداماً:
random,time,sys, وos. حتى تعلم أشهر الدوال من كل منها سيساعدك في حل العديد من المشكلات الواقعية.
1. random — الأرقام العشوائية
import random
# رقم عشري عشوائي [0, 1)
print(random.random()) # 0.3745...
# عدد صحيح عشوائي [a, b] (شامل)
print(random.randint(1, 10)) # عدد صحيح عشوائي بين 1 و 10
# اختيار عشوائي
fruits = ["apple", "banana", "orange", "grape"]
print(random.choice(fruits)) # اختر واحداً عشوائياً
# عينة عشوائية (بدون استبدال)
print(random.sample(fruits, 2)) # اختر 2 عشوائياً
# خلط الترتيب
cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
random.shuffle(cards)
print(cards) # الترتيب مخلوط
▶ مثال: برنامج اليانصيب (الصعوبة ⭐)
import random
# مجموعة اليانصيب
participants = ["Alice", "Bob", "Charlie", "Diana", "Eve",
"Frank", "Grace", "Henry"]
# الجائزة الأولى — فائز واحد
first = random.choice(participants)
print(f"🎉 1st Prize: {first}")
# الجائزة الثانية — فائزان (باستثناء الأول)
remaining = [p for p in participants if p != first]
second = random.sample(remaining, 2)
print(f"🎊 2nd Prize: {' & '.join(second)}")
# الجائزة الثالثة — 3 فائزين
remaining = [p for p in remaining if p not in second]
third = random.sample(remaining, 3)
print(f"🎁 3rd Prize: {' & '.join(third)}")
الناتج:
# Executed successfully
2. time — التعامل مع الوقت
import time
# الطابع الزمني الحالي (ثوانٍ منذ 1970-01-01)
print(time.time()) # 1758588800.123
# إيقاف التنفيذ (ثوانٍ)
print("Start")
time.sleep(1) # أوقف لثانية واحدة
print("1 second later")
# تنسيق الوقت الحالي
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 2026-06-23 16:00:00
▶ مثال: الموقت (الصعوبة ⭐)
import time
def countdown(seconds):
"""موقت العد التنازلي"""
while seconds > 0:
print(f"\r⏱ {seconds} seconds left", end="")
time.sleep(1)
seconds -= 1
print("\r⏰ Time's up!")
# قياس وقت تنفيذ الكود
start = time.time()
total = sum(range(1000000))
end = time.time()
print(f"Execution time: {end - start:.4f} seconds")
الناتج:
\r⏰ Time
3. sys — التفاعل مع النظام
import sys
# إصدار بايثون
print(sys.version) # 3.13.0 ...
# وسائط سطر الأوامر (عند تشغيل python script.py a b c)
print(sys.argv) # ['script.py', 'a', 'b', 'c']
# إنهاء البرنامج
# sys.exit(0) # خروج عادي
# الإدخال القياسي
# line = sys.stdin.readline() # اقرأ سطراً واحداً من الإدخال
▶ مثال: آلة حاسبة لسطر الأوامر (الصعوبة ⭐⭐)
import sys
def main():
# الاستخدام: python calculator.py 3 + 5
if len(sys.argv) != 4:
print("Usage: python calculator.py num1 operator num2")
print("Example: python calculator.py 3 + 5")
return
a = float(sys.argv[1])
op = sys.argv[2]
b = float(sys.argv[3])
if op == "+":
result = a + b
elif op == "-":
result = a - b
elif op == "*":
result = a * b
elif op == "/":
if b == 0:
print("Error: cannot divide by zero")
return
result = a / b
else:
print(f"Unsupported operator: {op}")
return
print(f"{a} {op} {b} = {result}")
if __name__ == "__main__":
main()
الناتج:
Usage: python calculator.py num1 operator num2
Example: python calculator.py 3 + 5
Error: cannot divide by zero
4. os — نظام التشغيل
import os
# دليل العمل الحالي
print(os.getcwd()) # D:\project
# تغيير الدليل
# os.chdir("/tmp")
# اعرض محتويات الدليل
for item in os.listdir("."):
print(item)
# إنشاء دليل
# os.mkdir("new_folder")
# تحقق من المسارات
print(os.path.exists("test.txt")) # True
print(os.path.isfile("test.txt")) # True
print(os.path.isdir("data")) # True
# دمج المسارات
path = os.path.join("data", "files", "test.txt")
print(path) # data/files/test.txt
▶ مثال: إعادة تسمية الملفات دفعة واحدة (الصعوبة ⭐⭐)
import os
def batch_rename(directory, prefix):
"""أعد تسمية جميع ملفات .txt في دليل دفعة واحدة"""
files = [f for f in os.listdir(directory) if f.endswith(".txt")]
for i, filename in enumerate(files, 1):
old_path = os.path.join(directory, filename)
new_name = f"{prefix}_{i:03d}.txt"
new_path = os.path.join(directory, new_name)
os.rename(old_path, new_path)
print(f" {filename} → {new_name}")
print("Batch rename example (display only, not executed):")
print("Iterate all .txt files, rename to prefix_001.txt format")
الناتج:
Batch rename example (display only, not executed):
Iterate all .txt files, rename to prefix_001.txt format
5. حالات الاستخدام الشائعة
- random: اليانصيب، CAPTCHA، توليد بيانات اختبار عشوائية، أحداث لعبة عشوائية.
- time: التنفيذ المؤجل، قياس الأداء، الموقتات، المهام المجدولة.
- sys: قراءة وسائط سطر الأوامر، التحكم في إنهاء البرنامج، الحصول على معلومات بيئة بايثون.
- os: إدارة الملفات، عمليات الدليل، معالجة المسارات، إعادة التسمية دفعة واحدة.
❓ أسئلة شائعة
random مناسب للأرقام العشوائية التشفيرية؟random يستخدم PRNG (مولد أرقام شبه عشوائية)، وهو قابل للتنبؤ. للأرقام العشوائية الآمنة تشفيرياً (مثل إنشاء كلمات المرور والرموز)، استخدم وحدة secrets.time.sleep() يمنع البرنامج بأكمله. كيف أفعل تأخيراً غير مانع؟sleep() يمنع الخيط الحالي. للتأخيرات غير المانعة، استخدم تعدد الخيوط أو أطر العمل غير المتزامنة مثل asyncio. للسيناريوهات البسيطة، sleep() كافٍ.os أم pathlib؟pathlib (أكثر كائنية التوجه، أكثر بديهية)، لكن os أكثر انخفاضاً وأشمل. استخدم pathlib للمشاريع الجديدة؛ استخدم os لاستدعاءات النظام منخفضة المستوى.📖 ملخص
random:randint()،choice()،sample()،shuffle()— اختيار وتوليد عشوائيtime:time()طابع زمني،sleep()إيقاف،strftime()تنسيقsys:argvوسائط سطر الأوامر،exit()إنهاء البرنامجos: فحص مسارات الملفات، عمليات الدليل، إعادة تسمية الملفات- هذه الوحدات الأربع هي "حزمة البداية" للمكتبة القياسية لبايثون، تُستخدم بكثرة في التطوير اليومي
📝 تمارين
-
أساسي (الصعوبة ⭐): اكتب برنامجاً يُنشئ 10 أعداداً صحيحة عشوائية بين 1 و 100، ويُخرجها ومتوسطها.
-
متوسط (الصعوبة ⭐⭐): اكتب دالة توليد كلمة مرور
generate_password(length=8)تنشئ كلمات مرور عشوائية تحتوي على أحرف كبيرة وصغيرة وأرقام. تلميح: استخدمstring.ascii_letters + string.digitsكمجموعة الأحرف؛ استخدمrandom.choice()لاختيار الأحرف. -
تحدي (الصعوبة ⭐⭐⭐): اكتب "أداة إحصائيات المجلد." بالنظر إلى مسار دليل (مُمرّر عبر
sys.argv)، احسب عدد الملفات والحجم الإجمالي لكل نوع ملف (امتداد). تلميح: استخدمos.listdir()للتكرار،os.path.splitext()للامتداد،os.path.getsize()لحجم الملف.