أساسيات المكتبة القياسية (الجزء 1)

واحدة من أعظم ميزات بايثون هي "البطاريات مشمولة" — مجموعة كاملة من المكتبات القياسية تأتي مع كل تثبيت بايثون. هذا الدرس يغطي أربعاً من أكثر الوحدات استخداماً: random, time, sys, و os. حتى تعلم أشهر الدوال من كل منها سيساعدك في حل العديد من المشكلات الواقعية.


1. random — الأرقام العشوائية

PYTHON
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)                        # الترتيب مخلوط

مثال: برنامج اليانصيب (الصعوبة ⭐)

PYTHON
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)}")
▶ جرّب الكود

2. time — التعامل مع الوقت

PYTHON
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

مثال: الموقت (الصعوبة ⭐)

PYTHON
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")
▶ جرّب الكود

3. sys — التفاعل مع النظام

PYTHON
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()       # اقرأ سطراً واحداً من الإدخال

مثال: آلة حاسبة لسطر الأوامر (الصعوبة ⭐⭐)

PYTHON
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()
▶ جرّب الكود

4. os — نظام التشغيل

PYTHON
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

مثال: إعادة تسمية الملفات دفعة واحدة (الصعوبة ⭐⭐)

PYTHON
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")
▶ جرّب الكود

حالات الاستخدام الشائعة


❓ أسئلة شائعة

س هل random مناسب للأرقام العشوائية التشفيرية؟
ج لا. random يستخدم PRNG (مولد أرقام شبه عشوائية)، وهو قابل للتنبؤ. للأرقام العشوائية الآمنة تشفيرياً (مثل إنشاء كلمات المرور والرموز)، استخدم وحدة secrets. س:time.sleep() يمنع البرنامج بأكمله. كيف أفعل تأخيراً غير مانع؟ ج:sleep() يمنع الخيط الحالي. للتأخيرات غير المانعة، استخدم تعدد الخيوط أو أطر العمل غير المتزامنة مثل asyncio. للسيناريوهات البسيطة، sleep() كافٍ. س:هل يجب استخدام os أم pathlib؟ ج:بايثون 3.4+ توصي بـ pathlib (أكثر كائنية التوجه، أكثر بديهية)، لكن os أكثر انخفاضاً وأشمل. استخدم pathlib للمشاريع الجديدة؛ استخدم os لاستدعاءات النظام منخفضة المستوى.

📖 ملخص

  • random: randint()، choice()، sample()، shuffle() — اختيار وتوليد عشوائي
  • time: time() طابع زمني، sleep() إيقاف، strftime() تنسيق
  • sys: argv وسائط سطر الأوامر، exit() إنهاء البرنامج
  • os: فحص مسارات الملفات، عمليات الدليل، إعادة تسمية الملفات
  • هذه الوحدات الأربع هي "حزمة البداية" للمكتبة القياسية لبايثون، تُستخدم بكثرة في التطوير اليومي

📝 تمارين

  1. أساسي (الصعوبة ⭐): اكتب برنامجاً يُنشئ 10 أعداداً صحيحة عشوائية بين 1 و 100، ويُخرجها ومتوسطها.

  2. متوسط (الصعوبة ⭐⭐): اكتب دالة توليد كلمة مرور generate_password(length=8) تنشئ كلمات مرور عشوائية تحتوي على أحرف كبيرة وصغيرة وأرقام. تلميح: استخدم string.ascii_letters + string.digits كمجموعة الأحرف؛ استخدم random.choice() لاختيار الأحرف.

  3. تحدي (الصعوبة ⭐⭐⭐): اكتب "أداة إحصائيات المجلد." بالنظر إلى مسار دليل (مُمرّر عبر sys.argv)، احسب عدد الملفات والحجم الإجمالي لكل نوع ملف (امتداد). تلميح: استخدم os.listdir() للتكرار، os.path.splitext() للامتداد، os.path.getsize() لحجم الملف.

100%