10 تمارين تدريبية في لغة بايثون للمبتدئين مع الحلول

تعتبر التمارين العملية طريقة رائعة لتعلم بايثون. فالتمارين المصممة جيدًا تعرضك لمفاهيم جديدة، مثل كتابة أنواع مختلفة من الحلقات، والعمل مع هياكل بيانات مختلفة مثل القوائم والمصفوفات والمجموعات، والقراءة في أنواع مختلفة من الملفات. يجب أن تكون التمارين الجيدة بمستوى يمكن للمبتدئين الوصول إليه ولكن أيضًا صعبة بما يكفي لتحديك، ودفع معرفتك ومهاراتك إلى المستوى التالي.

التمرين 1: مدخلات المستخدم والعبارات الشرطية

اكتب برنامجًا يطلب من المستخدم رقمًا ثم يطبع الجملة التالية بهذا العدد من المرات: “لقد عدت للتحقق من مهاراتي!” إذا كان الرقم أكبر من 10، فاطبع هذه الجملة بدلاً من ذلك: “شروط وحلقات بايثون سهلة للغاية”. افترض أنه يمكنك تمرير الأعداد الصحيحة الموجبة فقط.

الحل

number = int(input("Please enter a number: "))
if number > 10:
     print("Python conditions and loops are a piece of cake.")
else:
     for i in range(number):
         print("I am back to check on my skills!")

نبدأ باستخدام الدالة المضمنة input()، والتي تقبل إدخال المستخدم من لوحة المفاتيح. الوسيطة الأولى هي المطالبة المعروضة على الشاشة؛ يتم تحويل الإدخال إلى عدد صحيح باستخدام int() وحفظه كمتغير number. إذا كان المتغير number أكبر من 10، تتم طباعة الرسالة الأولى مرة واحدة على الشاشة. إذا لم يكن الأمر كذلك، تتم طباعة الرسالة الثانية في حلقة عدد مرات.

التمرين 2: الأحرف الصغيرة والكبيرة

فيما يلي سلسلة نصية. تحتوي على سلسلة طويلة من الأحرف. مهمتك هي تكرار الأحرف في السلسلة، وحساب الأحرف الكبيرة والصغيرة، وطباعة النتيجة:

LOWERCASE: <count>
UPPERCASE: <count>
Use the string.islower() and string.isupper() methods to check if a string contains lowercase and uppercase characters.
text = "ABgvddVICJSdkeprsmgn UTPDvndhtuwPOTNRSjfisuRNSUesajdsa"

الحل

lowercase_count = 0
uppercase_count = 0
 
for letter in text:
    if letter.islower():
        lowercase_count += 1
    elif letter.isupper():
        uppercase_count += 1
 
print("LOWERCASE:", lowercase_count)
print("UPPERCASE:", uppercase_count)

نبدأ هذه العملية بتهيئة العدادين للأحرف الكبيرة والصغيرة. ثم نمر على كل حرف في text ونتحقق مما إذا كان صغيرًا. إذا كان كذلك، نزيد عداد الأحرف الصغيرة بمقدار واحد. إذا لم يكن كذلك، نتحقق مما إذا كان كبيرًا وإذا كان كذلك، نزيد عداد الأحرف الكبيرة بمقدار واحد. أخيرًا، نطبع النتائج بالتنسيق المطلوب.

تمرين 3: بناء المثلثات

قم بإنشاء دالة تسمى is_triangle_possible() تقبل ثلاثة أرقام موجبة. يجب أن تعيد القيمة True إذا كان من الممكن إنشاء مثلث من قطع مستقيمة بأطوال معينة وقيمة False بخلاف ذلك. مع 3 أرقام، من الممكن أحيانًا، ولكن ليس دائمًا، إنشاء مثلث: لا يمكنك إنشاء مثلث من a = 13، وb = 2، وc = 3، ولكن يمكنك ذلك من a = 13، وb = 9، وc = 10.

الحل

def is_triangle_possible(a, b, c):
    return (a+b>c and c+b>a and a+c>b)

مفتاح حل هذه المشكلة هو تحديد متى تشكل الخطوط الثلاثة مثلثًا بغض النظر عن نوع المثلث. قد يكون من المفيد البدء في رسم المثلثات قبل البدء في كتابة أي شيء.

لاحظ أن مجموع أي ضلعين يجب أن يكون أكبر من الضلع الثالث لتكوين مثلث. وهذا يعني أننا نحتاج إلى a + b > c، و c + b > a، و a + c > b. يجب استيفاء الشروط الثلاثة لتكوين مثلث؛ وبالتالي نحتاج إلى الشرط و في الحل. بمجرد أن تتعرف على هذه الفكرة، يصبح الحل سهلاً!

التمرين 4: استدعاء دالة من دالة أخرى

قم بإنشاء دالتين: print_five_times() وspeak(). يجب أن تقبل الدالة print_five_times() معلمة واحدة (تسمى sentence) وتطبعها خمس مرات. يجب أن تحتوي الدالة speak(sentence, repeat) على معلمتين: sentence (سلسلة من الأحرف)، وrepeat (قيمة منطقية بقيمة افتراضية مضبوطة على False). إذا تم تعيين معلمة repeat على False، فيجب على الدالة طباعة جملة مرة واحدة فقط. إذا تم تعيين معلمة repeat على True، فيجب على الدالة استدعاء الدالة print_five_times().

الحل

def print_five_times(sentence):
    for i in range(5):
        print(sentence)
 
def speak(sentence, repeat=False):
    if repeat:
        print_five_times(sentence)
    else:
        print(sentence)

هذا مثال جيد لاستدعاء دالة في دالة أخرى. وهو أمر ستفعله كثيرًا في حياتك المهنية في البرمجة. وهو أيضًا عرض توضيحي رائع لكيفية استخدام علم منطقي للتحكم في تدفق برنامجك.

إذا كانت معلمة التكرار صحيحة، يتم استدعاء دالة print_five_times()، والتي تطبع معلمة الجملة 5 مرات في حلقة. وإلا، تتم طباعة معلمة الجملة مرة واحدة فقط. لاحظ أنه في بايثون، كتابة if repeat تعادل if repeat == True.

التمرين 5: التكرار والعبارات الشرطية

اكتب دالة تسمى find_greater_than() تأخذ معاملين: قائمة من الأرقام وعتبة عدد صحيح. يجب أن تنشئ الدالة قائمة جديدة تحتوي على جميع الأرقام في قائمة الإدخال التي تكون أكبر من العتبة المحددة. يجب أن يكون ترتيب الأرقام في قائمة النتائج هو نفسه الموجود في قائمة الإدخال. على سبيل المثال:

>>> find_greater_than([-3, 2, 8, 15, 31, 5, 4, 8], 5)
[8, 15, 31, 8]

الحل

def find_greater_than(int_list, threshold):
    new_list = []
    for integer in int_list:
        if integer > threshold:
            new_list.append(integer)
    return new_list

هنا، نبدأ بتحديد قائمة فارغة لتخزين نتائجنا. ثم ننتقل عبر جميع العناصر في قائمة الإدخال ونختبر ما إذا كان العنصر أكبر من الحد الأقصى. إذا كان الأمر كذلك، نضيف العنصر إلى القائمة الجديدة.

لاحظ أننا لا نحتاج صراحةً إلى else وpass لعدم القيام بأي شيء عندما لا يكون العدد الصحيح أكبر من الحد الأقصى. يمكنك تضمين هذا إذا أردت.

التمرين 6: الحلقات المتداخلة والعبارات الشرطية

اكتب دالة تسمى find_censored_words() والتي تقبل قائمة من السلاسل وقائمة من الأحرف الخاصة كوسائط لها، وتطبع جميع الكلمات الخاضعة للرقابة منها واحدة تلو الأخرى في أسطر منفصلة.

تعتبر الكلمة خاضعة للرقابة إذا كانت تحتوي على حرف واحد على الأقل من قائمة special_chars. استخدم متغير word_list لاختبار دالتك. لقد قمنا بإعداد القائمتين لك:

special_chars = ['!', '@', '#', '$', '%', '^', '&', '*']
word_list = ['se#$et', 'Ver*%&$lo', 'di$#^$nt', 'c*%e', 'is', '#%$#@!@#$%^$#']

الحل

special_chars = ['!', '@', '#', '$', '%', '^', '&', '*']
word_list = ['se#$et', 'Ver*%&$lo', 'di$#^$nt', 'c*%e', 'is', '#%$#@!@#$%^$#']
def find_censored_words(word_list, special_chars):
    for word in word_list:
        for character in word:
            if character in special_chars:
                print(word)
                break

هذا مثال آخر لطيف للتكرار عبر قائمة واختبار شرط. نبدأ بالتكرار عبر كل كلمة في word_list. ثم نكرر عبر كل حرف في الكلمة الحالية ونتحقق مما إذا كان الحرف الحالي موجودًا في قائمة special_chars.

هذه المرة، ومع ذلك، لدينا عبارة break. تخرج هذه العبارة من الحلقة الداخلية بمجرد اكتشاف حرف خاص واحد، حيث لا يهم إذا كان لدينا حرف خاص واحد أو أكثر في الكلمة.

التمرين 7: القوائم والمجموعات

أنشئ دالة find_short_long_word(words_list). يجب أن تعيد الدالة مجموعة من أقصر كلمة في القائمة وأطول كلمة في القائمة (بهذا الترتيب). إذا كان هناك عدة كلمات مؤهلة لتكون أقصر كلمة، فقم بإرجاع أول أقصر كلمة في القائمة. وإذا كان هناك عدة كلمات مؤهلة لتكون أطول كلمة، فقم بإرجاع آخر أطول كلمة في القائمة.

على سبيل المثال، بالنسبة للقائمة التالية:

words = ['go', 'run', 'play', 'see', 'my', 'stay']

يجب أن تعود الدالة

('go', 'stay')

افترض أن قائمة الإدخال ليست فارغة.

الحل

words = ['go', 'run', 'play', 'see', 'my', 'stay']
 
def find_short_long_word(words_list):
    shortest_word = words_list[0]
    longest_word = words_list[0]
    for word in words_list:
        if len(word) < len(shortest_word):
            shortest_word = word
        elif len(word) >= len(longest_word):
            longest_word = word
    return (shortest_word, longest_word)

مفتاح هذه المشكلة هو البدء بتخمين أقصر وأطول الكلمات. نقوم بذلك عن طريق إنشاء متغيرين shortest_word وlongest_word وتعيين كل منهما ليكون الكلمة الأولى في قائمة الإدخال.

نكرر الكلمات في قائمة الإدخال ونتحقق مما إذا كانت الكلمة الحالية أقصر من “تخميننا” الأولي. إذا كان الأمر كذلك، نقوم بتحديث متغير shortest_word. إذا لم يكن الأمر كذلك، نتحقق لمعرفة ما إذا كانت أطول من أو تساوي “تخميننا” الأولي لأطول كلمة، وإذا كان الأمر كذلك، نقوم بتحديث متغير longern_word. يضمن وجود الشرط >= أن تكون أطول كلمة هي آخر كلمة أطول. أخيرًا، نعيد أقصر وأطول كلمة في مجموعة.

تمرين 8: القواميس

كما ترى، قمنا بإعداد متغير test_results لك. مهمتك هي تكرار قيم القاموس وطباعة جميع أسماء الأشخاص الذين حصلوا على أقل من 45 نقطة.

test_results = {'Jenny': 50, 'Mathew': 45, 'Joe': 30, 'Peter': 40, 'Agness': 50, 'Samantha': 45, 'John': 20}

الحل

for key, value in test_results.items():
   if value < 45:
      print(key)

هنا، لدينا مثال لكيفية تكرار عملية البحث في القاموس. القواميس هي هياكل بيانات مفيدة تسمح لك بإنشاء مفتاح (أسماء الطلاب) وإرفاق قيمة به (نتائج اختباراتهم). تحتوي القواميس على التابع dictionary.items()، والتي تعيد كائنًا مع كل زوج مفتاح:قيمة في مجموعة.

يوضح الحل كيفية المرور عبر هذا الكائن وتعيين مفتاح وقيمة لمتغيرين. ثم نختبر ما إذا كان متغير القيمة أكبر من 45. إذا كان الأمر كذلك، نطبع متغير المفتاح.

تمرين 9: المزيد من القواميس

اكتب دالة تسمى consonant_vowels_count(frequencies_dictionary, vowels) تأخذ قاموسًا وقائمة من حروف العلة كوسائط. مفاتيح القاموس هي الحروف والقيم هي تردداتها. يجب أن تطبع الدالة العدد الإجمالي للحروف الساكنة والعدد الإجمالي لحروف العلة بالتنسيق التالي:

VOWELS: <vowels>
CONSONANTS: <consonants>

على سبيل المثال، بالنسبة للإدخال:

frequencies_dictionary = {'a': 2, 's': 1, 'i': 3, 'u': 3, 'm': 4, 'l': 2, 'z': 1, 'n': 3, 'k': 1, 'e': 4, 'y': 2, 'd': 2, 'o': 1}

يجب أن يكون الناتج:

VOWELS: 13
CONSONANTS: 16

الحل

vowels = ['a', 'e', 'i', 'u', 'o']
frequencies_dictionary = {'a': 2, 's': 1, 'i': 3, 'u': 3, 'm': 4, 'l': 2, 'z': 1, 'n': 3, 'k': 1, 'e': 4, 'y': 2, 'd': 2, 'o': 1}
 
def consonant_vowels_count(frequencies_dictionary, vowels):
    vowels_count = 0
    consonants_count = 0
    for key, values in frequencies_dictionary.items():
        if key in vowels:
            vowels_count += frequencies_dictionary[key]
        else:
            consonants_count += frequencies_dictionary[key]
    print("VOWELS:", vowels_count)
    print("CONSONANTS:", consonants_count)

يعد التعامل مع القواميس مهارة مهمة. لذا، إليك تمرينًا آخر يتطلب منك تكرار عناصر القاموس.

نبدأ بتحديد قائمة من الحروف المتحركة. بعد ذلك، نحتاج إلى تحديد عدادين، واحد للحروف المتحركة وواحد للحروف الساكنة، وكلاهما مضبوط على الصفر. بعد ذلك، نكرر عناصر القاموس المدخلة ونختبر ما إذا كان المفتاح موجودًا في قائمة الحروف المتحركة. إذا كان الأمر كذلك، نزيد عداد الحروف المتحركة بمقدار واحد، وإذا لم يكن كذلك، نزيد عداد الحروف الساكنة بمقدار واحد. أخيرًا، نطبع النتائج بالتنسيق المطلوب.

تمرين 10: تشفير السلسلة

تنفيذ شفرة قيصر. وهي تقنية تشفير بسيطة تستبدل كل حرف في الكلمة بحرف آخر من عدد ثابت من المواضع أسفل الأبجدية.

على سبيل المثال، ضع في اعتبارك السلسلة “word“. إذا قمنا بنقل كل حرف إلى أسفل بمقدار موضع واحد في الأبجدية، فسنحصل على “xpse“. يؤدي النقل بمقدار موضعين إلى الحصول على السلسلة “yqtf“. ابدأ بتحديد سلسلة تحتوي على كل حرف في الأبجدية:

alphabet = "abcdefghijklmnopqrstuvwxyz".

قم بتسمية دالتك cipher(word, shift)، والتي تقبل سلسلة للتشفير، وعدد صحيح من المواضع في الأبجدية التي تريد تحويل كل حرف إليها.

الحل

alphabet = "abcdefghijklmnopqrstuvwxyz"
def cipher(word, shift):
    shifted_alphabet = alphabet[shift:] + alphabet[:shift]
    new_word = ""
    for letter in word:
        letter_index = alphabet.index(letter)
        new_letter = shifted_alphabet[letter_index]
        new_word += new_letter
    return new_word

تم أخذ هذا التمرين من دورة ألعاب الكلمات. لدينا سلسلة تحتوي على جميع الأحرف الصغيرة، والتي ننشئ منها أبجدية محولة باستخدام تقنية تقطيع السلسلة الذكية. بعد ذلك، ننشئ سلسلة فارغة لتخزين الكلمة المشفرة. بعد ذلك، ننتقل عبر كل حرف في الكلمة ونبحث عن فهرسه أو موضعه في الأبجدية. باستخدام هذا الفهرس، نحصل على الحرف المحول المقابل من سلسلة الأبجدية المحولة. يُضاف هذا الحرف إلى نهاية سلسلة الكلمة الجديدة.

هذه مجرد طريقة واحدة لحل هذه المشكلة، وهي لا تعمل إلا مع الكلمات الصغيرة. حاول إدخال كلمة بحرف كبير؛ وستحصل على ValueError. عندما تأخذ دورة ألعاب الكلمات، فإنك تعمل ببطء على التوصل إلى حل أفضل خطوة بخطوة. يستفيد هذا الحل الأفضل من دالتين مدمجتين chr() وord() لجعله أبسط وأكثر قوة. تحتوي الدورة على ثلاث ألعاب متشابهة، حيث تتألف كل لعبة من عدة تمارين عملية لبناء معرفتك.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading