التاريخ والوقت والعشوائية في Python: datetime و random
كم يوماً بقي على الامتحان؟ ما تاريخ اليوم بعد 45 يوماً؟ من سيبدأ اللعب أولاً؟ هذه أسئلة تقابلها في برامج كثيرة، وجوابها في وحدتين من المكتبة القياسية: datetime للتاريخ والوقت، و random للعشوائية. في هذا الدرس ستتعلم أهم ما فيهما.
إنشاء تاريخ
Section titled “إنشاء تاريخ”الوحدة datetime فيها عدة أنواع، أهمها date للتاريخ فقط، و datetime للتاريخ مع الوقت:
from datetime import date, datetime, timedelta
birthday = date(2012, 5, 20)
print(birthday)print(birthday.year, birthday.month, birthday.day)print(birthday.weekday())2012-05-202012 5 206ننشئ التاريخ بالترتيب: السنة ثم الشهر ثم اليوم. والتابع weekday يعيد رقم اليوم في الأسبوع، حيث 0 هو الإثنين و 6 هو الأحد.
وللحصول على تاريخ اليوم أو اللحظة الحالية:
print(date.today())print(datetime.now())2026-11-112026-11-11 18:30:27.418233تنسيق التاريخ: strftime
Section titled “تنسيق التاريخ: strftime”الشكل 2026-11-11 مناسب للكمبيوتر، لكن المستخدم قد يريد 11/11/2026. التابع strftime يحوّل التاريخ إلى نص بالشكل الذي تحدده، باستخدام رموز تبدأ بعلامة %:
moment = datetime(2026, 11, 11, 18, 30)
print(moment.strftime("%d/%m/%Y"))print(moment.strftime("%H:%M"))print(moment.strftime("%Y-%m-%d %I:%M %p"))11/11/202618:302026-11-11 06:30 PM| الرمز | معناه | مثال |
|---|---|---|
%Y |
السنة كاملة | 2026 |
%m |
الشهر برقمين | 11 |
%d |
اليوم برقمين | 11 |
%H |
الساعة بنظام 24 | 18 |
%I |
الساعة بنظام 12 | 06 |
%M |
الدقائق | 30 |
%p |
صباحاً أو مساءً | PM |
والعملية العكسية بالدالة strptime: تقرأ نصاً وتحوّله إلى تاريخ حقيقي، وتعطيها الشكل الذي كُتب به النص:
d = datetime.strptime("25/12/2026", "%d/%m/%Y")print(d.year)print(d.strftime("%A"))2026Fridayالرمز %A يعطي اسم اليوم بالإنجليزية. وهكذا عرفنا أن 25 ديسمبر 2026 يوافق يوم جمعة.
الحساب بالتواريخ: timedelta
Section titled “الحساب بالتواريخ: timedelta”أجمل ما في الوحدة أنك تطرح تاريخاً من تاريخ، وتترك لها حساب أطوال الشهور والسنوات الكبيسة:
start = date(2026, 9, 20)exam = date(2026, 12, 25)
print((exam - start).days)print(start + timedelta(days=45))print(exam - timedelta(weeks=2))962026-11-042026-12-11ناتج طرح تاريخين قيمة من نوع timedelta، وهي تمثل مدة زمنية، ونقرأ منها عدد الأيام بالخاصية days. ونستطيع إنشاء مدة بأنفسنا مثل timedelta(days=45) ثم نجمعها على تاريخ أو نطرحها منه.
تخيّل date مثل نقطة على خريطة، و timedelta مثل مسافة: نقطة ناقص نقطة تعطي مسافة، ونقطة زائد مسافة تعطي نقطة جديدة.
العشوائية: random
Section titled “العشوائية: random”استخدمت random.randint في مشروع لعبة التخمين. والوحدة فيها دوال أخرى مفيدة:
import random
random.seed(7)
print(random.randint(1, 6))print(random.choice(["حجر", "ورقة", "مقص"]))print(random.random())3حجر0.3948234964231735randint(1, 6)رقم صحيح عشوائي يشمل الطرفين، مثل حجر النرد.choiceتختار عنصراً عشوائياً من قائمة.random()تعيد رقماً عشرياً بين 0 و 1.
وهذه دالتان للتعامل مع القوائم:
random.seed(7)cards = ["أ", "ب", "ج", "د", "هـ"]
random.shuffle(cards)print(cards)print(random.sample(range(1, 50), 6))['هـ', 'أ', 'د', 'ب', 'ج'][5, 35, 7, 24, 38, 4]shuffle تخلط القائمة نفسها مثل خلط أوراق اللعب، ولا تعيد شيئاً. و sample تختار عدداً من العناصر بدون تكرار، وهي مناسبة لسحب أرقام فائزة.
مثال يجمع الوحدتين
Section titled “مثال يجمع الوحدتين”برنامج صغير يختار طالباً عشوائياً ليقدّم عرضاً، ويحدد له موعداً بعد أسبوع من تاريخ معيّن:
random.seed(3)students = ["سارة", "عمر", "ليلى", "خالد"]
chosen = random.choice(students)due = date(2026, 11, 11) + timedelta(weeks=1)
print(f"{chosen} يقدّم العرض يوم {due.strftime('%d/%m/%Y')}")عمر يقدّم العرض يوم 18/11/2026جرّب بنفسك
Section titled “جرّب بنفسك”اكتب برنامجاً يحسب عمرك بالأيام: أنشئ تاريخ ميلادك بـ date، واطرحه من date.today()، واطبع عدد الأيام. ثم اطبع تاريخ اليوم الذي تكمل فيه 10000 يوم من عمرك. مثال لمن وُلد في 20 مايو 2012 وشغّل البرنامج في 11 نوفمبر 2026:
عمرك 5288 يوماًتكمل 10000 يوم في 06/10/2039أخطاء شائعة
Section titled “أخطاء شائعة”- الخلط بين الوحدة والنوع: الوحدة اسمها
datetimeوفيها نوع اسمهdatetimeأيضاً. إذا كتبتimport datetimeفالصحيحdatetime.date(...)، وإذا كتبتfrom datetime import dateفالصحيحdate(...)مباشرة. - تاريخ غير موجود:
date(2026, 2, 30)يسببValueError، لأن فبراير ليس فيه يوم 30. - الخلط بين
%mو%M: الحرف الصغير للشهر، والكبير للدقائق. - انتظار قيمة من
shuffle: كتابةcards = random.shuffle(cards)تجعلcardsتساويNone، لأن الدالة تخلط القائمة في مكانها.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما نوع القيمة الناتجة من طرح تاريخ من تاريخ؟
الفرق بين تاريخين مدة زمنية من نوع timedelta، ونقرأ عدد الأيام منها بالخاصية days.
سؤال
أي دالة تختار 3 عناصر مختلفة من قائمة؟
sample تعيد عدداً من العناصر بدون تكرار، أما choice فتعيد عنصراً واحداً.
الخلاصة
Section titled “الخلاصة”date(سنة, شهر, يوم)ينشئ تاريخاً، وdate.today()يعطي تاريخ اليوم.strftimeتحوّل التاريخ إلى نص بالشكل الذي تريده، وstrptimeتقرأ نصاً إلى تاريخ.- طرح تاريخين يعطي
timedelta، وتستطيع جمع مدة على تاريخ. randomفيهاrandintوchoiceوshuffleوsampleوrandom.random.seedتثبّت النتائج للاختبار، وsecretsهي المناسبة للأمان.