ورقة غش لغة بايثون
بايثون هي لغة برمجة حاسوبية متعددة المنصات. وهي لغة كائنية التوجه وذات كتابة ديناميكية، صممت في الأصل لكتابة النصوص البرمجية المؤتمتة (shell). ومع التحديث المستمر للإصدارات وإضافة ميزات لغوية جديدة، يتم استخدامها بشكل متزايد لتطوير مشاريع مستقلة وكبيرة الحجم.
عام
- بايثون حساسة لحالة الأحرف
- يبدأ فهرس بايثون من 0
- تستخدم بايثون المسافات البيضاء (علامات التبويب أو المسافات) لإزاحة الكود بدلاً من استخدام الأقواس المتعرجة.
تعليمات المساعدة
| الصفحة الرئيسية للمساعدة | help() |
| مساعدة الوظيفة | help(str.replace) |
| مساعدة الوحدة | help(re) |
الوحدات (المكتبات)
| سرد محتويات الوحدة | dir(module1) |
| تحميل الوحدة | import module1 * |
| استدعاء وظيفة من وحدة | module1.func1() |
تقوم عبارة import بإنشاء مساحة اسم جديدة وتنفيذ جميع العبارات في ملف .py المرتبط بمساحة الاسم تلك. إذا كنت ترغب في تحميل محتوى الوحدة في مساحة الاسم الحالية، فاستخدم “from module1 import *”
الأنواع القياسية
التحقق من نوع البيانات: type(variable)
الأعداد الصحيحة
int/long - يتم تحويل الأعداد الصحيحة الكبيرة تلقائياً إلى أعداد صحيحة طويلة
الأعداد العشرية
float - 64 بت، لا يوجد نوع “double”
القيم المنطقية
bool - صحيح أو خطأ
السلاسل النصية
str - افتراضي Python 2.x هو ASCII؛ وافتراضي Python 3 هو Unicode
- يمكن أن تكون السلاسل النصية علامات اقتباس مفردة/مزدوجة/ثلاثية
- السلسلة النصية هي تسلسل من الأحرف، لذا يمكن التعامل معها مثل أي تسلسل آخر
- يمكن إكمال الأحرف الخاصة بالبدء بـ \ أو r
str1 = r'this\f?ff' - يمكن تحقيق تنسيق السلسلة النصية بعدة طرق
template = '%.2f %s haha $%d' str1 = template % (4.88, 'hola', 2)
تعد str() و bool() و int() و float() أيضاً وظائف صريحة لتحويل النوع
القيمة الفارغة
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’) الحصول على كائن “التاريخ” dt1.date() الحصول على كائن “الوقت” dt1.time() تنسيق التاريخ والوقت إلى سلسلة نصية dt1.strftime(’%m/%d/%Y %H:%M’) تعديل قيم الحقول dt2 = dt1.replace(minute = 0, second=30) الحصول على الفرق diff = dt1 - dt2 # diff هو كائن ‘datetime.timedelta’
هياكل البيانات
الصفوف (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]القواميس (Hashes)
| إنشاء قاموس | dict1 ={‘key1’ :‘value1’, 2 :[3, 2]} |
| بناء القاموس عن طريق وظيفة التعيين | 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 مجموعة جزئية من set2 | set1.issubset(set2) |
| التحقق مما إذا كانت set2 مجموعة جزئية من set1 | set1.issuperset(set2) |
| التحقق من تماثل المجموعات | set1 == set2 |
| الاتحاد (أو) | set1 |
| التقاطع (و) | 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 في نهاية الوظيفة ، فإنها لا تعيد أي قيمة.
- إرجاع قيم متعددة عبر كائن صف (tuple)
return (value1, value2) value1, value2 = func1(..) -
الوظائف المجهولة (Lambda)
lambda x : x * 2 # def func1(x) : return x * 2
الوظائف شائعة الاستخدام
-
تعيد Enumerate تسلسلاً (key, val)، حيث key هو فهرس العنصر الحالي.
for key, val in enumerate(collection): -
تقوم Sorted بفرز جميع الكائنات القابلة للتكرار.
sorted([2, 1, 3]) => [1, 2, 3] -
تقوم Zip بتجميع العناصر المقابلة من الكائنات في صفوف وتعيد قائمة بهذه الصفوف.
zip(seq1, seq2) => [('seq1_1', 'seq2_1'), (..), ..] -
تعيد Reversed مكرراً معكوساً.
list(reversed(range(10)))
التحكم والتدفق
-
معاملات شروط “if else”:
التحقق مما إذا كان المتغيران هما نفس الكائن var1 is var2 التحقق مما إذا كان المتغيران كائنين مختلفين var1 is not var2 التحقق مما إذا كان للمتغيرين نفس القيمة var1 == var2 -
الاستخدام الشائع لمعامل for:
for element in iterator : -
‘pass’ - لا يفعل شيئاً، ويستخدم بشكل عام كعبارة نائبة.
-
التعبير الثلاثي
value = true-expr if condition else false-expr -
لا توجد عبارة switch/case، استخدم if/elif بدلاً من ذلك.
البرمجة كائنية التوجه
-
‘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) # سرد جميع الوظائف المتاحة على الكائن
عمليات السلاسل النصية
ربط القوائم/الصفوف باستخدام فاصل
', '.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'معالجة الاستثناءات
- النموذج الأساسي
try:
..
except ValueError as e:
print e
except (TypeError, AnotherError):
..
except:
..
finally:
..- إثارة الاستثناءات يدوياً
raise AssertionError # فشل التأكيد
raise SystemExit # طلب الخروج من البرنامج
raise RuntimeError('Error message :..')استيعاب القائمة والمجموعة والقاموس (Comprehensions)
صيغة برمجية لتسهيل قراءة وكتابة الكود.
-
استيعاب القائمة (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]