9 مهارات برمجة Python التي تميز المبتدئ عن ذوي الخبرة

تم إعداد ترجمة للمقال قبل بدء دورة المطور Python .




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

تبدأ بمجموعة شاملة من المكتبات وتضيف إليها المزيد والمزيد كلما اكتسبت خبرة في البرمجة.

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

مبتدئ أو خبير؟


إذن ، ما الذي يميز المبتدئ عن المبرمج المتمرس عندما يتعلق الأمر بالبرمجة في Python؟

في هذه المقالة ، أود التركيز على القضايا التالية:

  • حل المشكلات وفن طرح الأسئلة
  • فهم سبب عمل الشفرة (أو لا)
  • تعامل مع الأوتار
  • العمل مع القوائم
  • باستخدام حلقات
  • استخدام الوظائف (والمصطلحات المناسبة)
  • البرمجة الشيئية
  • احترام PEP

حل المشكلات وفن طرح الأسئلة


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

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

إذا كنت تريد معرفة كيفية صياغة أسئلة البرمجة ، فإليك مقالة منفصلة عنها.

مشكلة س س


"أنا بحاجة للحصول على الأحرف الثلاثة الأخيرة في سلسلة."
"لا ، لا تحتاج! تحتاج إلى الحصول على ملحق الملف. "

المشكلة XY شيء مضحك للغاية. لديك مشكلة X ، وعندما تتصل بالدعم ، تسأل عن مشكلة Y ، حيث أن حلها ، كما تعتقد ، سيحل المشكلة X. [1]

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

كيف قد يبدو:

def extract_ext(filename):
    return filename[-3:]
print (extract_ext('photo_of_sasquatch.png'))
>>> png

تماما! حسنًا ، جرّب الآن. photo_of_lochness.jpeg
يمكن للمستخدم أن يسأل عن الامتداد من البداية. المشكلة Y هي الأحرف الثلاثة الأخيرة. المشكلة X هي امتداد.

def extract_ext(filename):
    return filename.split('.')[-1]
print (extract_ext('photo_of_sasquatch.png'))
print (extract_ext('photo_of_lochness.jpeg'))
>>> png
>>> jpeg

هذا كل شئ!

يمكنك أيضًا استخدام المكتبة القياسية os.path.splitext().
يمكنك التعرف عليها هنا .

فهم سبب عمل الشفرة (أو لا)


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

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

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


ATOM مع بنية مطوية إذا كانت موجودة على اليمين.

طريقة رائعة أخرى لرؤية كيفية عمل شفرتك بشكل مرئي هي www.pythontutor.com ، حيث يمكنك مشاهدة ما يحدث في برنامجك سطرًا بسطر.


تنفيذ التعليمات البرمجية في pythontators

تعامل مع الأوتار


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

word = 'supergreat'
print (f'{word[0]}') 
>>> s
print (f'{word[0:5]}')
>>> super

يتعلم العقل المستفسر عما يقدمه str()، ولكن يمكنك فقط الاستمرار في الكتابة دون النظر إلى الوثائق str(). لاستدعاء وثائق الوظيفة يمكنك الكتابة help(str)أو dir(str). عند القيام بذلك ، يمكنك العثور على طرق لم يكن هناك شك في وجودها. ربما تكون قد نظرت إلى الوثائق وتعلم أن السلاسل لها طريقة endswith()، على سبيل المثال ، ويمكنك تطبيقها في مكان ما.



فيما يلي مثال على التعليمات البرمجية التي تفعل نفس الشيء بطريقتين مختلفتين. يتم استخدام الخيار الأول split، والذي تحدثنا عنه مؤخرًا. وفي الثانية - endswith()التي يمكن أن تجدها في الوثائق.

لن يقرأ معظم المبرمجين جميع الوثائق ويتعلمون كل شيء. جزء مهم من عمل المبرمج هو معرفة مكان البحث عن معلومات حول كيفية حل مشكلة.

العمل مع القوائم


القوائم هي شيء عظيم ومتنوع.
على سبيل المثال ، نمزج هنا بين القيم الصحيحة والسلاسل:

my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3, 'a' , 'n' , 'b']
for item in my_list:
    print (f'current item: {item}, Type: {type(item)}')



انظر كيف مزجناهم. إذا حاولنا فرز القائمة ، نحصل على خطأ.

print (my_list.sort())



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

قد يبدو الرمز كالتالي:

my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3 , 'a' , 33.3 , 'n' , 'b']
number_list = []
string_list = []
for item in my_list:
    print (f'current item: {item}, Type: {type(item)}')
    if not isinstance(item,str):
        number_list.append(item)
    else:
        string_list.append(item)
my_list = string_list

هذا هو النهج الصحيح ، ولكنه مرهق قليلاً. يعمل الرمز ، ولكن يمكنك جعله يتم حل المشكلة بنفس الطريقة ، ولكن في سطر واحد!

إذا كنت تريد أن تكون أكثر سعادة ، فتعرف على كيفية عمل تعبيرات القائمة في Python. إليك نفس المشكلة ، ولكن تم حلها بفهم كيفية عمل القوائم:

my_list = [letter for letter in my_list if isinstance(letter,str)]


هذا كل شئ!

وهذه ليست النهاية. يمكنك استخدامها filterللحصول على نفس النتيجة.

def get_numbers(input_char):
    if not isinstance(input_char,str):
        return True
    return False

my_list = [1,2,3,'a','b','c']
check_list = filter(get_numbers, my_list)
for items in check_list:
    print(items)




كما فهمت على الأرجح بالفعل ، هناك العديد من الطرق لحل نفس المشكلة. يجب أن تدرك أنه سيعمل بشكل أفضل لك ولفريقك على وجه التحديد.

علاوة

  • قلب قائمة (أو سطر):

names = ['First' , 'Middle' , 'Last']
print(names[::-1])
>>> ['Last', 'Middle', 'First']

  • دمج عناصر القائمة:

names = ['First' , 'Middle' , 'Last']
full_name = ' '.join(names)
print(f'Full Name:\n{full_name}')
>>> First Middle Last

باستخدام حلقات


هل قابلت رمز مماثل؟

greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']
for index in range(0,len(greek_gods)):
    print (f'at index {index} , we have : {greek_gods[index]}')

ربما ستتعلم هذا البناء من لغات أخرى ، ولكن هذا بعيد عن نهج Python. في Python ، ستستخدم:

for name in greek_gods:
    print (f'Greek God: {name}')

ستلاحظ بسرعة أنه لا يوجد فهرس. ماذا لو كنت ترغب في العمل على فهرس؟ في بايثون يمكنك الاستفادة enumerate. هذه طريقة رائعة للوصول إلى كل ما تحتاجه!

for index, name in enumerate(greek_gods):
    print (f'at index {index} , we have : {name}')



استخدام الوظائف (والمصطلحات المناسبة)


عندما أعمل على الرسوم المتحركة ، أقول دائمًا أنه إذا فعلت الشيء نفسه 5 مرات ، فأنت بحاجة إلى التفكير فيما إذا كنت بحاجة إلى برنامج؟ في بعض الأحيان ، بعد قضاء أسبوعين في تطوير أداة ، يمكنك توفير ستة أسابيع من العمل. عند كتابة رمز وفهم أنك تقوم بنفس الإجراء عدة مرات ، يجب أن تفكر فيما إذا كان سيتم ترميز هذا الرمز في إجراء أو وظيفة. ستقوم الدالة بإرجاع بعض القيمة ، وسوف يقوم الإجراء ببساطة بتنفيذ التعليمات البرمجية. في المثال الأول ، ترى الإجراء ، وفي الوظيفة الثانية.

يبدو مربكا. هنا توضيح يعكس مبدأ العملية:



انتبه إلى الفرق بين printو return. قد يبدو أنها تعمل بنفس الطريقة ، ولكن إذا نظرت إلى الإخراج ، سترى أن الوظيفة ستعيد ببساطة الاسم الذي تم تمريره.

المصطلحات التالية التي يجب فصلها بوضوح هي الحجج والمعلمات. المعلمات هي ما تم تعريفه في الإجراء أو الوظيفة (مظللة باللون الأحمر في الشكل) ، وما تمرره إلى الإجراء أو الوظيفة هي وسيطات (مظللة باللون الأخضر).

وهنا بعض الأمثلة.

مثال 1

def print_list(input_list):
    for each in input_list:
        print(f'{each}')
    print() #just to separate output
greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']
grocery_list = ['Apples' , 'Milk' , 'Bread']
print_list(greek_gods)
print_list(grocery_list)
print_list(['a' , 'b' , 'c'])



بدلاً من كتابة الدورة ثلاث مرات ، سأكتبها مرة واحدة في الإجراء وسأسميها عندما أحتاج إليها. وفي المثال الثاني ، يمكنك رؤية كيف تُرجع الدالة قائمة مقلوبة.

مثال 2

def reverse_list(list_input):
    return list_input[::-1]
my_list = ['a', 'b' , 'c']
print (reverse_list(my_list))
>>> ['c', 'b', 'a']

البرمجة الشيئية


Python هي لغة موجهة للكائنات ، وهناك الكثير من القوة في الكائنات. فكر في كائن كرسم - إذا كنت تستخدم رسمًا ، فأنت تنشئ مثيلًا له. لذلك يمكنك إنشاء العديد من الأمثلة كما تريد ولا تفسد أي شيء في الرسم الأصلي عند استخدامها.

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

إذا كنت قد قرأت عن OOP من قبل ، فربما تعبت من الدراسة ، ولكن هنا مرة أخرى. لنبدأ بتحديد فئة Student. سيكون لها اسم ( name) وقائمة التخصصات ( subject_list):

class Student():
    def __init__(self,name):
        self._name = name
        self._subject_list = []

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

student1 = Student('Martin Aaberge')

إذا كنت بحاجة إلى المزيد من الطلاب ، فستستخدم نفس الفصل وتنشئ كائنًا جديدًا.

student2 = Student('Ninja Henderson')

و student1، و student2سوف يكون مثيلات الفئة Student. لديهم نفس المخطط ، ولكن ليس لديهم شيء مشترك. في الوقت الحالي ، لا يمكننا فعل الكثير مع الطلاب ، لكننا أضفنا قائمة بالتخصصات. لتعبئة هذه القائمة ، سننشئ طريقة منفصلة. يمكنك استدعاء طرق للتفاعل مع مثيلات الفصل.

دعنا نحدث الصف:

class Student():
    def __init__(self,name):
        self._name = name
        self._subject_list = []
    def add_subject(self, subject_name):
        self._subject_list.append(subject_name)
    def get_student_data(self):
        print (f'Student: {self._name} is assigned to:')
        for subject in self._subject_list:
            print (f'{subject}')
        print()

الآن يمكن استخدام هذا الفصل الدراسي لإنشاء الطلاب وتحريرهم والحصول على معلومات عنهم.

#create students:
student1 = Student('Martin Aaberge')
student2 = Student('Heidi Hummelvold')
#add subjects to student1
student1.add_subject('psychology_101')
student1.add_subject('it_security_101')
#add subject to student2
student2.add_subject('leadership_101')
#print current data on students
student1.get_student_data()
student2.get_student_data()

عادة ، يتم تخزين الفئات في ملفات منفصلة ويتم استيرادها إلى التعليمات البرمجية. في مثالنا ، أنشأنا فئة Studentفي ملف student.pyواستوردناه في ملفنا main.py. (في هذه الحالة ، كلا الملفين في نفس المجلد).

from student import Student
student1 = Student('Martin')
student1.add_subject('biomechanics_2020')
student1.get_student_data()



احترام بيب


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

PEP عبارة عن مجموعة توصيات لكودك. هذا هو الرابط إلى PEP-8 . قراءة رائعة. اقرأه مرة واحدة على الأقل لفهم ما يدور حوله. هذا مثال كلاسيكي snake_case. تتم كتابة المتغيرات في Python في snake_case ، أي يتم فصل الكلمات في اسم المتغير باستخدام شُرَط تحتية. حتى في الجامعات ، يتعلمون أحيانًا بشكل غير صحيح ، لذلك لا تثبط عزيمتك ، وابدأ في الكتابة وفقًا للقواعد.

هذا صحيح:

chocolate_cake = 'yummy'

وها هو - لا:

chocolateCake = 'Yummy'

استنتاج


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

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

المصادر:

[1] العدد XY ، en.wikipedia.org/wiki/XY_problem



درس مجاني: مقدمة في الاختبارات التلقائية



All Articles