ورقة غش لغة بايثون
بايثون هي لغة برمجة حاسوبية متعددة المنصات. وهي لغة كائنية التوجه وذات كتابة ديناميكية، صممت في الأصل لكتابة النصوص البرمجية المؤتمتة (shell). ومع التحديث المستمر للإصدارات وإضافة ميزات لغوية جديدة، يتم استخدامها بشكل متزايد لتطوير مشاريع مستقلة وكبيرة الحجم.
عام
- بايثون حساسة لحالة الأحرف (Case-sensitive)
- يبدأ الفهرس في بايثون من 0
- تستخدم بايثون المسافات البيضاء (علامات التبواب أو المسافات) لإزاحة الكود بدلاً من الأقواس المتعرجة.
تعليمات (Help)
| الصفحة الرئيسية للمساعدة | help() |
| مساعدة الدوال | help(str.replace) |
| مساعدة الوحدات (Modules) | help(re) |
الوحدات (المكتبات)
| قائمة محتويات الوحدة | dir(module1) |
| تحميل وحدة | import module1 * |
| استدعاء دالة من وحدة | module1.func1() |
تقوم جملة الاستيراد (import) بإنشاء مساحة اسم جديدة وتنفيذ جميع الجمل في ملف .py المرتبط بتلك المساحة. إذا كنت ترغب في تحميل محتويات الوحدة في مساحة الاسم الحالية، استخدم “from module1 import *”
الأنواع القياسية (Scalar Types)
التحقق من نوع البيانات: type(variable)
الأعداد الصحيحة (Integers)
int/long - يتم تحويل الأعداد الصحيحة الكبيرة تلقائيًا إلى أعداد طويلة.
الأعداد العشرية (Floats)
float - 64 بت، لا يوجد نوع "double".
القيم المنطقية (Booleans)
bool - True أو False.
السلاسل النصية (Strings)
str - بايثون 2.x افتراضيًا تستخدم ASCII؛ بايثون 3 تستخدم Unicode.
- يمكن أن تكون السلاسل النصية محاطة بعلامات اقتباس فردية/مزدوجة/ثلاثية.
- السلسلة النصية هي تسلسل من الأحرف ويمكن معاملتها كأي تسلسل آخر.
- يمكن تمثيل الأحرف الخاصة باستخدام \ أو سلاسل خام تبدأ بـ r.
str1 = r'this\f?ff' - يمكن تنسيق السلاسل النصية بطرق متعددة.
template = '%.2f %s haha $%d' str1 = template % (4.88, 'hola', 2)
str()، bool()، int()، float() هي أيضًا دوال تحويل النوع الصريح.
القيمة الفارغة (Null)
NoneType(None) - قيمة بايثون ’null’ (توجد نسخة واحدة فقط من كائن None).
- None ليست كلمة رئيسية محجوزة، بل هي المثيل الفريد لـ “NoneType”.
- None هي قيمة افتراضية شائعة لمعلمات الدوال الاختيارية:
def func1(a, b, c = None) - الاستخدام الشائع لـ None:
if variable is None :
التاريخ والوقت
datetime - وحدة “datetime” المدمجة في بايثون توفر أنواع “datetime” و “date” و “time”.
- تجمع “datetime” المعلومات المخزنة في “date” و “time”.
إنشاء تاريخ ووقت من سلسلة dt1 = datetime.strptime(‘20091031’, ‘%Y%m%d’) الحصول على كائن “date” dt1.date() الحصول على كائن “time” dt1.time() تنسيق التاريخ والوقت كرسالة dt1.strftime(’%m/%d/%Y %H:%M’) تعديل قيمة حقل dt2 = dt1.replace(minute = 0, second=30) الحصول على الفرق diff = dt1 - dt2 # diff هو كائن ‘datetime.timedelta’
هياكل البيانات (Data Structures)
الصفوف (Tuples)
الصف هو تسلسل ثابت الطول وغير قابل للتعديل.
| إنشاء صف | tup1=4,5,6 or tup1 = (6,7,8) |
| إنشاء صف متداخل | tup1 = (4,5,6), (7,8) |
| تحويل تسلسل إلى صف | tuple([1, 0, 2]) |
| دمج الصفوف | tup1 + tup2 |
| تفكيك الصف | a, b, c = tup1 |
| تبديل المتغيرات | b, a = a, b |
القوائم (Lists)
القائمة هي تسلسل متغير الطول وقابل للتعديل.
| إنشاء قائمة | list1 = [1, ‘a’, 3] or list1 = list(tup1) |
| دمج القوائم | list1 + list2 or list1.extend(list2) |
| إضافة إلى القائمة | list1.append(‘b’) |
| إدراج في موقع محدد | list1.insert(posIdx, ‘b’) |
| حذف بواسطة الفهرس | valueAtIdx = list1.pop(posIdx) |
| حذف أول ظهور لقيمة | list1.remove(‘a’) |
| التحقق من الوجود | 3 in list1 => True |
| فرز القائمة | list1.sort() |
| فرز باستخدام دالة معينة | list1.sort(key = len) # الفرز حسب الطول |
ملاحظة:
- فهرس “البداية” مضمن، بينما فهرس “النهاية” مستبعد.
- يمكن حذف البداية/النهاية، وسيكون الافتراضي هو البداية/النهاية الفعلية.
الشرائح (Slicing)
تشمل أنواع التسلسل ‘str’ و ‘array’ و ’tuple’ و ’list’ وغيرها.
list1[start:stop]
list1[start:stop:step]
list1[::2]
str1[::-1]القواميس (Dictionaries / Hash)
| إنشاء قاموس | dict1 ={‘key1’ :‘value1’, 2 :[3, 2]} |
| إنشاء من zip | dict(zip(keyList, valueList)) |
| الحصول على عنصر | dict1[‘key1’] |
| تغيير/إضافة عنصر | dict1[‘key1’] = ’newValue’ |
| الحصول مع قيمة افتراضية | dict1.get(‘key1’, defaultValue) |
| التحقق من وجود مفتاح | ‘key1’ in dict1 |
| حذف عنصر | del dict1[‘key1’] |
| الحصول على المفاتيح | dict1.keys() |
| الحصول على القيم | dict1.values() |
| تحديث القيم | dict1.update(dict2) # يتم استبدال قيم dict1 بـ dict2 |
المجموعات (Sets)
المجموعة هي تجميع غير مرتب لعناصر فريدة.
| إنشاء مجموعة | set([3, 6, 3]) or {3, 6, 3} |
| هل هي مجموعة جزئية | set1.issubset(set2) |
| هل هي مجموعة فائقة | set1.issuperset(set2) |
| التحقق من التساوي | set1 == set2 |
| الاتحاد (or) | set1 |
| التقاطع (and) | set1 & set2 |
| الفرق | set1 - set2 |
| الفرق المتناظر (xor) | set1 ^ set2 |
الدوال (Functions)
-
الشكل الأساسي:
def func1(posArg1, keywordArg1 = 1, ..): -
“الدوال هي كائنات” - الاستخدام الشائع:
def func1(ops = [str.strip, user_define_func, ..], ..): for function in ops: value = function(value) -
قيم الإرجاع (Return values):
- إذا لم تحتوي الدالة على جملة return، فلن ترجع أي قيمة (None).
- إرجاع قيم متعددة عبر كائن صف (tuple).
return (value1, value2) value1, value2 = func1(..) -
الدوال المجهولة (Anonymous Functions / Lambda):
lambda x : x * 2 # تعادل: # def func1(x) : return x * 2
دوال شائعة
-
Enumerate: ترجع متتالية من أزواج (المفتاح، القيمة) حيث المفتاح هو فهرس العنصر الحالي.
for key, val in enumerate(collection): -
Sorted: تقوم بفرز جميع الكائنات القابلة للتكرار.
sorted([2, 1, 3]) => [1, 2, 3] -
Zip: تقوم بتجميع العناصر المقابلة من الكائنات في صفوف (tuples) ثم ترجع قائمة بهذه الصفوف.
zip(seq1, seq2) => [('seq1_1', 'seq2_1'), (..), ..] -
Reversed: ترجع مكررًا معكوسًا.
list(reversed(range(10)))
التحكم والتدفق (Control Flow)
-
المعاملات في جمل “if else”:
التحقق مما إذا كان المتغيران هما نفس الكائن var1 is var2 التحقق مما إذا كان المتغيران كائنين مختلفين var1 is not var2 التحقق مما إذا كان للمتغيرين نفس القيمة var1 == var2 -
الاستخدام الشائع لمعامل for:
for element in iterator : -
‘pass’: لا تفعل شيئًا، وتستخدم عادة كجملة نائبة.
-
التعبير الثلاثي (Ternary expression):
value = true-expr if condition else false-expr -
لا توجد جملة switch/case في بايثون، بل تستخدم if/elif.
البرمجة كائنية التوجه (OOP)
-
‘object’ هو الأساس لجميع أنواع بايثون.
-
أي شيء (أرقام، سلاسل، دوال، أصناف، وحدات، إلخ) هو كائن، ولكل كائن ’type’. متغيرات الكائن هي مؤشرات لموقعها في الذاكرة.
-
الشكل الأساسي للكائن:
class MyObject(object): # 'self' تعادل 'this' في Java/C++ def __init__(self, name): self.name = name def memberFunc1(self, arg1): .. @staticmethod def classFunc2(arg1): .. obj1 = MyObject('name1') obj1.memberFunc1('a') MyObject.classFunc2('b') -
الأدوات التفاعلية:
dir(variable1) # سرد جميع الطرق (methods) المتاحة للكائن
عمليات السلاسل النصية (String Operations)
ربط قائمة/صف باستخدام فاصل:
', '.join([ 'v1', 'v2', 'v3']) => 'v1, v2, v3'تنسيق السلسلة النصية:
string1 = 'My name is {0} {name}'
newString1 = string1.format('Sean', name = 'Chen')تقسيم السلسلة النصية:
sep = '-'
stringList1 = string1.split(sep)الحصول على جزء من السلسلة:
start = 1
string1[start:8]ملء السلسلة بالأصفار:
month = '5'
month.zfill(2) => '05'
month = '12'
month.zfill(2) => '12'معالجة الاستثناءات (Exception Handling)
- الشكل الأساسي:
try:
..
except ValueError as e:
print(e)
except (TypeError, AnotherError):
..
except:
..
finally:
..- ضبط الاستثناء يدويًا:
raise AssertionError # فشل التأكيد
raise SystemExit # طلب خروج البرنامج
raise RuntimeError('Error message :..')فهم القوائم والمجموعات والقواميس (Comprehensions)
تسهيلات برمجية (Syntactic Sugar) لجعل الكود أسهل في القراءة والكتابة.
-
فهم القائمة (List Comprehension):
تكوين قائمة جديدة بإيجاز عبر تصفية عناصر التجميع وتحويل العناصر التي تجتاز التصفية.
الشكل الأساسي:
[expr for val in collection if condition]طريقة مختصرة لـ:
result = [] for val in collection: if condition: result.append(expr) -
فهم القاموس (Dictionary Comprehension):
{key-expr : value-expr for value in collection if condition} -
فهم المجموعة (Set Comprehension): نفس فهم القائمة ولكن باستخدام
{}بدلاً من[]. -
فهم القوائم المتداخلة (Nested List Comprehension):
الشكل الأساسي:
[expr for val in collection for innerVal in val if condition]