Search for notes by fellow students, in your own course and all over the country.

Browse our notes for titles which look like what you need, you can preview any of the notes via a sample of the contents. After you're happy these are the notes you're after simply pop them into your shopping cart.

My Basket

You have nothing in your shopping cart yet.

Title: pleesee
Description: loook

Document Preview

Extracts from the notes are below, to see the PDF you'll receive please use the links above


Table of Contents
PyGuide 
...
مقدمة‬
Chapter 1 (Programming Concepts)
...
12
Chapter 3 (Basics)
...
15
List Comprehension
...
19
Strings
...
22
Dictionaries 
...
29
Loops
...
32
for
...
35
Our dance will continue
...
38
DRY: Don't Repeat Yourself
...
44
To **kwargs or not to **kwargs 
...
46
Lambda/Anonymous Functions
...
50
Generator
...
51
Chapter 5 (OOP)
...
مقدمة‬
Fields
...
56
Properties
...
57
__init__
...
59
properties
...
63
Operator Overloading
...
Enums 
...
74
Multiple Inheritance
...
84
Chapter 8 (IO)
...
89
os, os
...
92
File Pointer
...
101
Finding Nemo
...
102
Packages 
...
106
Chapter 10 (Databases)
...
110
PySQLite
...
123
Storm
...
126
SQLAlchemy
...
130
XMLing with Python
...
132
2­ SAX 
...
141
HappyMapper
...
147
HTMLing with Python
...
149
Parsing CSV Files
...
153
Regex:
...
التفاعل مع برامج اخرى‬
Gimme usage!
...
157
os
...
160
subprocess
...
162
Chapter 12 (Networking)
...
171
Simple Client
...
175
 App with a BUG
...
203
XMLRPC what?
...
208
Quote of the Day
...
218
Grok
...
230
The Big Three
...
234
TurboGears
...
251
Pure C
...
260
ctypes
...
266
functools 
...
269
Chapter 16 (PyInotify)
...
مقدمة‬
Watches
...
275
Going on
...
276
Event
...
278
PyGTK
...
316
Rad with Glade (Gqamoos)
...
334
‫043
...
لقد فعلتها‬
‫043
...
مصادر اخرى‬
!‫143
...
اهداء‬

PyGuide 

‫مقدمة‬

‫لماذا هذا الكتاب ؟‬
‫السبب الرئيسى هو أنه كتاب مجانى ومتكامل ولاعتقد انك بعد قرائته ستواجه صعوبات مع ‪Python‬‬
‫ماذا تتوقع بعد قراءتك لهذا الكتاب؟‬
‫بعد قرائتك للكتاب ستكون قد علمت الكثير حول بايثون وكيفية توظيف اللغة بصورة جيدة وجدية،‬
‫ستصبح متأقلم مع تطبيقات قواعد البيانات والشبكات -ربما تفكر فى كتاب خادم ويب خاص بيك؟- والتطبيقات‬
‫الرسومية والكثير والكثير من طرق معالجة البيانات وغيرها الكثير
...
Permissions, Groups, Users‬فى حال عدم المعرفة يفضل التجاه إلى ‪LinuxAC‬‬
‫ستجد العديد من المواضيع لتساعدك‬

‫الصدارات القادمة والتحديثات‬
‫● ستجد اخر الصدارات والتحديثات على ‪Programming-Fr34ks
...
python[at]gmail
...


‫)‪Chapter 1 (Programming Concepts‬‬
‫مامعنى كلمة ‪ Programming‬؟‬
‫هى بتعنى القدرة على التخاطب مع الكمبيوتر وتنفيذ الهدف )حل المشكلة( على ارض الواقع
...
ولكننا قلنا إن الكمبيوتر ليفهم اى شئ سوا ال 0 وال‬
‫1 ومستحيل على النسان تعلمها!
...
فالحل هو إنهم يتكلمو إنجليزى‬
‫مثل
...
فإنت بتتبع المشكلة اللى‬
‫حصلت وتشوف إزاى تصححها وهو دا معنى ال ‪ Debugging‬اى تصحيح الخطاء :(‬

‫‪Compiled vs Interpreted‬‬
‫كتير منا إشتغلو على نظم ‪ Windows‬وكان ديما بيشوف ملفات إمتدادها
...

‫فى لغات برمجة مثل ال ‪ C‬و ‪ Pascal‬بيتوافر الناتج النهائى بتاع برنامجك على صورة ملف ‪ exe‬وهو عبارة عن‬
‫تعليماتك اللى إديتها للمترجم عشان يفهمها للكمبيوتر ولكن فى صورتها النهائية )الكلم اللى قاله المترجم لل‬
‫كمبيوتر( فمستحيل على النسان إنه يقرا الملف دا وهنا معنى ال ‪ compiled‬فهى ملف ال ‪ exe‬يشمل‬
‫التعليمات اللتى كتبتها ولكن بلغة الكمبيوتر وهو وحده القادر على فهمها‬
‫وإذا نظرنا من جانب آخر إلى لغات مثل ‪ Python, Perl‬هنجد إن الملف بيكون إمتداده
...
‪ pl‬ولكنك تقدر‬
‫تفتحه فى اى ‪ Text Editor‬وتقراه -لفهمه لزم تكون عارف اللغة- والملف دا هو ال ‪ Source Code‬بتاعك‬
‫نفسه بدون اى تحويلت ول شئ ولكن لتنفيذه بنستدعى ال المفسر )‪ (Interpreter‬فى كل مرة بحيث إنه يقرا‬
‫ال ‪ Source Code‬ويبلغه للكمبيوتر ويتم التنفيذ‬
‫من مميزات ال ‪ Compiled Languages‬مثل ال ‪ C‬هى السرعة‬
‫ومن القصور هو إنك لزم تعمل ‪ Compile‬لل ‪ Source Code‬بتاعك على النظام اللذى تريد ان تنفذ البرنامج‬
‫عليه فبرنامج مكتوب على ‪ Windows‬محتاج يتعمله ‪ recompile‬على ال ‪ Linux‬وهكذا
...
‪ NET‬وال ‪ Java‬من خلل ‪IronPython, Jython‬‬
‫7- بتدعم اكثر من ‪ paradigm‬ك ‪Functional Programming, OOP‬‬
‫8- ‪ Python‬لغة ممتعة!‬
‫جدير بالذكر ان ‪ Python‬حاليا هى ‪ de facto‬فى عالم الوبن سورس حيث تفوقت على ‪ Perl‬من حيث‬
‫الشعبيةوهى لغة العام حسب تقرير ‪Tiobe‬‬
‫ملفات ‪ Python‬بيكون امتداها
...
‪ pyc‬او
...
py‬‬
‫ملف بايثون مترجم >= ‪
...
pyo‬‬
‫‪Downloading/Installing Python‬‬
‫ادخل على ‪/http://python
...
فى حال ل قم بتحميل ال ‪Source‬‬
‫واعمل ‪Build‬‬
‫‪
...
‪msi‬‬

‫تشغيل بايثون‬
‫تقدر تشغل ال المفسر )‪ (Interpreter‬كجلسه تفاعلية بمعنى انك تمرر ليه ‪ statement‬معينه وهو ينفذها‬

Python ‫ واكتب‬Console ‫ او ال‬Terminal ‫: افتح ال‬Linux ‫لمستخدمى‬
: Windows ‫لمستخدمى‬
~Start -> Run -> Cmd
~cd /Python_PATH/
python
...

‫مثل حساب بنكى فيه فلوس "قيمة" قابلة للتغيير فلزم نعبر عنها بمتغير وليكن "‪ ”money‬ونشوف قيمته خلل‬
‫برنامجنا سواء بالزيادة او النقص‬
‫افتح ال ‪
...

‫‪>>>balance=90000 #an integer‬‬

‫نطبع القيمة كالتالى‬
‫‪>>> print balance‬‬
‫00009‬

‫نضيف ليه قيمة ولتكن 001 )زيادة(‬
‫001 + ‪>>> balance = balance‬‬
‫‪>>> print balance‬‬
‫00109‬
‫ننقص منه اى قيمة وليكن 098 )نقص(‬
‫098 - ‪>>> balance = balance‬‬
‫‪>>> balance‬‬
‫01298‬

‫على فرض اننا عندنا ‪ variable‬بإسم ‪ name‬بيعبر عن قيمة معينة لل ‪ name‬دا‬
‫ملحوظة ال ‪ variable‬ماهو ال ‪ alias‬لقيمة متغيرة فى برنامجك‬
‫‪>>> name="ahmed" #a string‬‬
‫‪>>> print name‬‬
‫‪ahmed‬‬
‫وهكذا تقدر تعمل متغير يعبر عن العمر مثل ‪age‬‬
‫05=‪>>> age‬‬
‫‪>>> print age‬‬
‫05‬

‫‪List‬‬
‫طب جميل موضوع المتغيرات هيدفعنا نتكلم عن ال ‪ Lists‬او القوائم هى عبارة عن ‪Enhanced Array‬‬
‫لمبرمجى ال ‪C‬‬
‫اقرب مثال هو طلب الفصل او زملء العمل هل تعتقد ان اذا عندنا 03 طالب اننا نعمل شئ مشابه للتالى‬
‫”‪student_1=”Ahmed‬‬
‫”‪student_2=”Wael‬‬
‫”‪student_3=”Ayman‬‬
‫”‪student_4=”Tina‬‬

...
وهنا تيجى اهمية ال ‪ List‬وهى بإختصار ال ‪ Grouping‬لل ‪ Data Types‬المشتركة بمعنى ان كل دول‬
‫‪ students‬صح ؟‬
‫]”‪students=[“Ahmed”, “Wael”, “Ayman”, “Tina‬‬
‫)‪>>> type(students‬‬
‫>'‪‫لحظ ان اول عنصر فى ال ‪ list‬ال ‪ index‬بتاعه هو 0 والتانى هو 1 والتالت هو 2‬
‫القاعدة العامة‬
‫1-‪idx=n‬‬

‫مثل عندنا ‪ list‬كالتالى‬
‫]"‪>>>friends=["St0rM", "Squall", "Tina", "Ayman‬‬
‫لحظ موضوع ال ‪ indexing‬لنه بسيط وهو بنستخدمه للوصول لعنصر فى ترتيب معين فى اى ‪sequence‬‬
‫‪>>> friends[0] # 1st‬‬
‫'‪'St0rM‬‬
‫‪>>> friends[2] # 3rd‬‬
‫'‪'Tina‬‬

‫ال ‪ List‬بتقدملنا العديد من الوظائف او التسهيلت فى التعامل على فرض ان عندنا ‪ List‬كالتالى‬
‫]"‪>>> students=["Ahmed", "Ayman", "Tina", "Wael‬‬
‫‪>>> students‬‬
‫]'‪['Ahmed', 'Ayman', 'Tina', 'Wael‬‬


...
append("Gina")
>>> students
['Ahmed', 'Ayman', 'Tina', 'Wael', 'Gina']
‫- تقدر تضيف عنصر كالتالى‬>>> students += ['Marian']
>>> students
['Ahmed', 'Ayman', 'Tina', 'Wael', 'Gina', 'Marian']
‫فى الواقع تقدر تضيف عدة عناصر‬
>>> students += ["Omar", "Waleed"]
>>> students
['Ahmed', 'Ayman', 'Tina', 'Wael', 'Gina', 'Marian', 'Omar', 'Waleed']

extend ‫او بإستخدام‬

...
extend(["Omar", "Waleed"])
>>> students
['Ahmed', 'Ayman', 'Tina', 'Wael', 'Gina', 'Marian', 'Omar', 'Waleed']


...
remove("Ayman")
>>> students
['Ahmed', 'Tina', 'Gina', 'Marian', 'Omar', 'Waleed']
‫ )الترتيب( الخاص بالعنصر ليتم حذفه كالتالى مثل‬index ‫للحذف بنقوم بتحديد ال‬
>>> del students[3]
>>> students
['Ahmed', 'Ayman', 'Tina', 'Gina', 'Marian', 'Omar', 'Waleed']


...
insert(3, "Ayman")

>>> students
['Ahmed', 'Tina', 'Gina', 'Ayman', 'Marian', 'Omar', 'Waleed']


...
pop()
>>> popped
'Waleed'
>>> popped=students
...
reverse()
‫بيتم عكس الترتيب من الخر للول كالتالى‬
>>> students
['Ahmed', 'Ayman', 'Wael', 'Omar']
>>> students
...
sort()
‫بتقوم بترتيب العناصر‬
>>> students
...
index(value)
‫الحصول على الترتيب الخاص باول ظهور للعنصر‬
>>> students
...
count(value)
list ‫للحصول على عدد مرات ظهور عنصر معين فى ال‬
>>> students
...
count("Ayman‬‬
‫2‬

‫‪List Comprehension‬‬
‫اذا اخدت كورس رياضيات من قبل فربما تكون واجهت ال ‪List Comprehension‬‬
‫هنا تنقسم ال ‪ LC‬الى جزئين جزء ماقبل ال بايب -انبوبة- | وجزء مابعدها‬
‫ماقبلها يسمى ‪ function‬يتم تطبيقها على كل ‪x‬‬
‫ومابعدها يسمى قائمة المدخلت وبعض الشروط‬
‫ ])02(‪>>> [number*3 for number in range‬‬

‫]75 ,45 ,15 ,84 ,54 ,24 ,93 ,63 ,33 ,03 ,72 ,42 ,12 ,81 ,51 ,21 ,9 ,6 ,3 ,0[‬

‫فيما سبق قمنا بتطبيق ال ‪ LC‬فى بايثون حيث قمنا بتحديد ال ‪) function‬وهى ضرب كل عدد فى 3(‬
‫لكل عدد ينتمى الى الفترة من صفر ل 02‬
‫ ] ]02
...
20], even number‬‬
‫]06,45,84,24,63,03,42,81,21,6[‬

‫طبعا تقدر تستخدم الطرق العادية للفلترة ولكن دى ‪on the fly solution‬‬

‫‪Tuples‬‬
‫1‬
‫ال ‪ Tuple‬هى ‪- Container‬حاوية- اخرى زى ال ‪ List‬ولكن الفرق هى إنها غير قابلة للتغيير
...
capitalize‬‬
‫تقوم بإعادة كائن جديد تحول فيه اول حرف إلى حرف ‪uppercase‬‬
‫)(‪>>> "hello"
...
count(sub‬‬
‫حساب عدد مرات تكرار مقطع معين‬
‫)'‪>>> "Hello"
...
lower‬‬
‫اعادة كائن بيه كل الحروف ‪lowercase‬‬
‫)(‪>>> "HELlO"
...
upper‬‬
‫اعادة كائن بيه كل الحروف ‪uppercase‬‬
‫)(‪>>> "helLo"
...
swapcase‬‬
‫بتقوم بإعادة كائن بعكس حالة الحرف‬
‫)(‪>>> "hElLo"
...
title‬‬
‫بتعيد كائن على صورة ‪- title‬عنوان-‬
‫)(‪>>> "hello, world"
...
startswith(sub‬‬
‫بتختبر هل السترينج يبدأ بمقطع معين او ل‬
‫)"‪>>> "hello"
...
endswith(sub‬‬
‫بتختبر هل السترينج ينتهى بمقطع معين او ل‬
‫)'‪>>> "hello"
...
find(sub‬‬
‫بتقوم بإعادة ال ‪ index‬الخاص بأول ظهور لمقطع معين‬
‫"‪>>> s="Hello, World‬‬
‫)'‪>>> s
...
strip([chars‬‬

‫بتقوم بحذف ال ‪ chars‬من السترينج وفى حال عدم تحديدها هيعتبر انها المسافات‬
‫)]‪
...
isalpha‬‬
‫بتختبر هل السترينج مكون من حروف البجدية او ل‬
‫)(‪
...
isdigit‬‬
‫بتختبر هل الحروف المكونة للسترينج عبارة عن ارقام او ل‬
‫)(‪
...
islower‬‬
‫بتختبر اذا كان السترينج فى حالة ‪ lowercase‬أو ل‬
‫)(‪
...
istitle‬‬
‫بتختبر هل السترينج دا ‪ title‬أو ل‬
‫)(‪
...
 etc ‫ زى العديد من اللغات زى‬Strings are immutable ‫ ال‬python ‫كما نعلم ان فى‬
 Variable ‫ -متغير- ويعمل‬Variable ‫ -الدمج-بيحذف ال‬Concatenation ‫ مثل ال‬String ‫بمعنى إن اى تعديل هيتم على‬
‫جديد كالتالى‬
>>> s="I'm a string"
>>> s
"I'm a string"
>>> id(s) # get the location
13511240
>>> s +=", and you ?"
>>> s
"I'm a string, and you ?"
>>> id(s) #get the location now!
13522272

‫ بتاعه
...
py
‫ كالتالى‬Module ‫استدعى ال‬
>>> import UserString as us
UserString module ‫ لل‬alias ‫ لتعبر عن‬as us ‫استخدمت‬
UserString,MutableString ‫ هما‬Classes 2 ‫ بتتكون من‬Module ‫ال‬
str type ‫ تقدر تستخدمه بصورة مشابه لل‬immutable ‫ و‬base class ‫ هو ال‬UserString ‫ال‬
mutable ‫ و‬UserString ‫ من ال‬sub class ‫ هو‬MutableString ‫ال‬
‫ يبقة‬Mutable ‫ لنه طالما‬hash function ‫ -اعادة تعريف- ل‬override ‫ معمول فيه‬MutableString ‫ملحظة : ال‬
-‫ ! -لتقلق فى حال عدم فهمك للجملة السابقة‬unhashable

    def __hash__(self):
        raise TypeError, "unhashable type (it is mutable)"

! immutable string ‫ ل‬return ‫ ودى بتدى‬immutable ‫ بإسم‬method ‫ فيه‬MutableString ‫ال‬

>>> m_string=us
...
immutable() # Return immutable string!
>>> im_string

'Hello, CRUEL WORLD!'
id ‫تحديد ال‬
>>> id(im_string)
13532856
id ‫ ليه وتحديد ال‬ref ‫عمل‬
>>> ref_im_string=im_string
>>> id(ref_im_string)
13532856
‫عملية الدمج‬
>>> im_string +=" blah blah blah"
‫ هنلقيه إنه إتغير‬id ‫تحديد ال‬
>>> id(im_string)
13553416
‫ تم الستغناء عنه واصبح اسم‬Object ‫ مازال زى ماهو مش تم عليه اى تغيير لنه بيشير لمكان‬ref ‫ال‬
'Hello, CRUEL WORLD! blah blah blah' ‫ بيشير ل‬im_string

>>> ref_im_string
'Hello, CRUEL WORLD!'
>>> id(ref_im_string)
13532856
>>> im_string
'Hello, CRUEL WORLD! blah blah blah'
‫يفضل اعادة قراءة الفصل بعد قراءة جزئية الكائنات‬
UserString ‫ابحث عن موديلز مشابهه ل‬

‫ ‪Dictionaries‬‬
‫القواميس: هى نوع من البيانات ونستخدمه فى تخزين البيانات بصورة مفتاح وقيمة )‪ (key, value‬كالقاموس‬
‫بالفعل‬
‫انشائه‬
‫}{=‪>>> d‬‬
‫اسم -نوع البيانات- هو ‪dict‬‬
‫)‪>>> type(d‬‬
‫>'‪
‫'‪>>> d['Name']='Ahmed‬‬
‫91=]'‪>>> d['Age‬‬
‫'‪>>> d['Sex']='m‬‬
‫هنا خزنا فى القاموس الخاص بنا 3 ‪ keys‬وهما '‪'Name' , “Age', 'Sex‬‬
‫)(‪
...
keys‬‬
‫]'‪['Age', 'Name', 'Sex‬‬

‫)(‪
...
get(key‬‬
‫بتعيد لك ال ‪ value‬الخاصة ب ‪ key‬معين‬
‫)'‪>>> d
...
get('Team‬‬
‫‪None‬‬

Indexing
‫ -الفهرسة-كالتالى مثل‬Indexing ‫ معين من خلل ال‬key ‫تقدر تحصل على القيمة الخاصة ب‬
>>> d['Name']
'Ahmed'
‫ -مفتاح- جديد مثل‬Key ‫او تقدر تضيف‬
>>> d['Lang']='Ruby'
‫او تقدر تعدل على قيمة موجودة‬
>>> d['Name']='Youssef'


...
update(d)
d ‫بتقوم بعمل تحديث للقاموس ببيانات قاموس‬
d
...
has_key(key)
‫ معين فى القاموس‬key ‫بتختبر وجود‬
>>> d
...
items()
‫ فى صورة زوج‬key, value ‫ بتشمل ال‬tuples ‫ مكونة من‬list ‫بتعمل‬
>>> print d
...
iteritems()
(‫ )سنتعرض ليها لحقا‬Iterations ‫بتستخدم غالبا فى ال‬
for key, val in d
...
iteritems()
>>> i
...
next()
('Singer', 'Delta')

‫‪Conditions‬‬
‫حياتنا مبنية على الحتمالت والبرمجة مش خارج نطاقها
...

‫تمام
...
ولكن نريد ان نعرف اذا ال‬
‫‪ condition‬كان ‪ False‬مثل؟‬
‫تابع المثال التالى وهو إستخدام ‪if, else‬‬
‫الصورة العامة‬
‫‪if condition then‬‬
‫‪if_suite‬‬
‫‪else then‬‬
‫‪else_suite‬‬
‫لحظ المثال التالى‬

‫"‪>>> name="ayman‬‬
‫958741=‪>>> password‬‬
‫:"654321"==‪>>> if name=="ahmed" and password‬‬
‫‪print "Welcome ahmed" #if_suite‬‬
‫:‪else‬‬
‫‪print "Welcome, Who R U?" #else_suite‬‬

Welcome, Who R U?

if, else if, else ‫حسنا فى حال وجود عدة احتمالت قد تكون سليمة او ل هنستخدم‬

if condition then
if_suite
else_if condition then
else if suite
else_if condition then
else_if suite
else then
else_suite
‫تابع المثال التالى‬
>>> if name=="ahmed" and password=="123456":
print "Welcome ahmed" #if_suite
elif name=="tina" and password=="36987456":
print "Welcome tina" #elif_suite
elif name=="ayman" and password==147859:
print "Welcome, Ayman" #elif_suite
else:
print "Who R U?"
Welcome, Ayman
‫الول تم أختبار البلوك دا‬
if name=="ahmed" and password=="123456":
‫ للى بعده وهو‬Escape ‫ فيتعمل‬True ‫ولكنه مش‬
elif name=="tina" and password=="36987456":
‫ للى بعده وهو‬Escape ‫ بردو فيتعمل‬True ‫ولكنه مش‬
elif name=="ayman" and password==147859:
‫ فيتنفذ البلوك تبعه وهو‬True ‫والبلوك دا قيمته‬
print "Welcome, Ayman" #elif_suite
:‫ملحوظة‬
‫نستخدم == لختبار عملية التساوي‬
‫نستخدم = لعملية السناد‬
if name=="ahmed" and password=="123456":
(‫ = و )يجب تحقق جميع اقسام الشرط مثل‬and
if name=="ahmed" or name==”ayman”:
(if ‫ = او )احد قسم الشرط يكفى لتنفيذ محتوى‬or
if not name=="ahmed" :
(‫ = ليس )لنفى الشرط‬not

‫!= تستخدم فى اختبار عدم المساواة‬
‫”‪if name != “mahmoud‬‬

‫‪Loops‬‬
‫‪while‬‬
‫مثل ال ‪ conditions‬معظم حياتنا مبنية على التكرار
...
‫ للبد‬True ‫ تقف وإل الشرط هيكون‬loop ‫ توصل ل 01 بحيث ان ال‬I ‫ اننا نخلى ال‬I ‫السبب فى إننا بنزود ال‬

for

Foreach element in container do
for_suite

‫ مثل‬tuple ‫ او‬list ‫ او‬string ‫ -الحاويات- مثل ال‬Containers ‫نطبقها على‬

>>> string="Hello, World!"
>>> for char in string:
print char
H
e
l
l
o
,
W
o
r
l
d
!
‫ اطبع )الحرف( دا‬string ‫معناها كالتالى : لكل )حرف( فى ال‬
students ‫ كالتالى بإسم‬list ‫على فرض ان عندنا‬

>>> students=["Ahmed", "Tina", "St0rM", "Salma"]
>>> for student in students:
print student
Ahmed
Tina
St0rM
Salma

‫المعنى هنا: لكل ‪- Element‬عنصر- او ‪ student‬موجود فى ال ‪ Container‬او ال ‪ students list‬اطبع ال عنصر دا‬
‫ملحوظة:‬
‫لطباعة العنصر الموجود فى ال ‪ Container‬بدون اضافة سطر جديد ضيف كومة لل ‪ print‬كالتالى‬

‫"!‪>>> string="Hello, World‬‬
‫:‪>>> for char in string‬‬
‫,‪print char‬‬
‫!‪Hello, World‬‬

‫ ‪raw_input‬‬
‫زى ماشفنا ‪ print‬وعرفنا انها مختصة بالطباعة هنشوف المسؤل عن الدخال وهنا ‪raw_input/input‬‬
‫الصيغة العامة‬
‫)‪raw_input(prompt‬‬
‫حيث ان ال ‪ prompt‬هى الرسالة اللى هتظهر للمستخدم‬
‫مثال‬

‫)" :‪>>> name=raw_input("Enter your name‬‬
‫‪Enter your name: ahmed‬‬
‫‪>>> print "Hola, ", name‬‬
‫‪Hola, ahmed‬‬

‫س: مالفرق بين ‪ raw_input, input‬؟‬
‫استخدامك ل ‪ input‬بيساوى بالظبط التالى‬
‫))‪eval(raw_input(prompt‬‬
‫مش فى احسن من التجربة العملية تابع المثال التالى‬

‫)" :‪>>> val=raw_input("Enter‬‬
‫145+31+2 :‪Enter‬‬
‫‪>>> print val‬‬
‫145+31+2‬
‫لكن مع استخدامنا ل ‪ input‬هيتعمل ‪- eval‬اختصار ل ‪ -evaluate‬للمدخلت ك ‪ Python Expression‬كالتالى‬

‫)" :‪>>> val=input("Enter‬‬
‫145+31+2 :‪Enter‬‬

‫‪>>> print val‬‬
‫655‬
‫تم تحقيق ال 2+31+145 من خلل ‪ python‬واعادة الناتج ليك‬

‫)‪eval(expression‬‬
‫)"2+1"(‪>>> eval‬‬
‫3‬
‫‪ eval‬بتاخد ‪ expression‬وتحاول اعادة الناتج ليك اذا كان ليه معنى‬

‫‪Don't break up with me‬‬

‫بنستخدم ‪ break‬للخروج من حلقة عند استيفاء شرط معين )مثل تمت قراءة كل البيانات من ملف‬
‫فلداعى لمحاولة القراءة او تم قراءة 001 رقم فردى فل داعى للستمرار(‬
‫لدينا كلمة مثل "‪ ”hellopython‬نريد ان نعرف موقع حرف ال ‪ t‬فيها فالفكرة ان نقوم بعمل حلقة على‬
‫الحرف ونختبر ماذا كان ‪ t‬او ل
...
py‬‬
‫ 1  ‪Now count is‬‬
‫ 2  ‪Now count is‬‬
‫ 3  ‪Now count is‬‬
‫ 4  ‪Now count is‬‬
‫ 5  ‪Now count is‬‬

‫ 6  ‪Now count is‬‬
‫ 7  ‪Now count is‬‬

‫]7[‪t was found at word‬‬

‫‪Our dance will continue‬‬

‫بتستخدم ‪ continue‬للهروب من الحلقة الحالية )ربما لعدم استيفاء عنصر الشروط المطلوبة للعمل‬
‫عليه( واستكمالها على العنصر الذى يليه مثل‬
‫ ]'9' ,'‪tstvars=['123mx', 'hello', 'acc‬‬
‫ :‪for var in tstvars‬‬
‫ :)(‪    if var[0]
...
‪print var, " => ", "is valid‬‬

‫هنا نختبر كل عنصر من عناصر ‪ tstvars‬ماإذا كان يصلح ان يكون اسم متغير فى بايثون‬
‫فنقوم بعمل حلقة على العناصر‬
‫:‪for var in tstvars‬‬

‫ونختبر ماإذا كان يبدأ برقم )احد الشروط عدم بدا تسمية المتغيرات فى بايثون برقم( فإذا كان رقم‬
‫نهرب من الحلقة الحالية ونستكمل على العنصر التالى فى القائمة ‪tstvar‬‬
‫ :)(‪    if var[0]
...
هل يعقل انى اكتب‬
‫“!‪print “Python rocks‬‬
‫فى كل مرة ؟ ولنفرض انى كتبتها 02 مرة هل يعقل انى اذا حبيت اعدل التعبير بدل ‪ Python rocks‬ل ‪Perl‬‬
‫‪ rocks‬انى اعدل فيه 02 مرة؟‬
‫من هنا جت اهمية ال ‪ Functions‬وهى تستخدم لتوفير وقت ومجهود وتطبيق مبدأ ‪DRY‬‬

‫‪DRY: Don't Repeat Yourself‬‬
‫كل اللى عليك هو انك تحط الرسالة فى ‪function‬‬
‫حيث بنبدأ التعريف بالكلمة المفتاحية ‪ def‬وبعدها اسم الدالة ‪ rocks‬وبعدها قائمة المعاملت‬
‫الشرح الن من خلل ال ‪ Python Shell‬بطريقة تفاعلية وبعد كدا فى جزئية انشاء الوحدات بنتعرض لعمل‬
‫السكربت وكيفية استدعاءه‬
‫:)(‪>>> def rocks‬‬
‫"!‪print "Python rocks‬‬

‫وتستدعيها كل ماتحب‬
‫)(‪>>> rocks‬‬
‫!‪Python rocks‬‬
‫)(‪>>> rocks‬‬
‫!‪Python rocks‬‬
‫)(‪>>> rocks‬‬
‫!‪Python rocks‬‬
‫لحظ انك اذا حبيت تعدل كلمة ‪ Python‬ل ‪ Perl‬مثل مش هتحتاج تعدل فى اى شئ غير فى ال ‪rocks‬‬
‫‪ function‬فقط تحولها للتالى‬
‫:)(‪>>> def rocks‬‬
‫"!‪print "Perl rocks‬‬

‫لحظت الفرق ؟توفير وقت ومجهود ومش كررت نفسك فى مليون سطر‬
‫طب تمام لكن فيه مشكلة لحد الوقتى وهى اننا اضطرينا نعدل جوا ال ‪ function‬ونستبدل كلمة مكان كلمة‬

‫وهكذا فنريد ان نخليها ابسط فى الستخدام بحيث انها تطبع اللى إحنا عايزنها تطبعه )ال دالة فيها متغير معين (‬
‫فالحل هو اننا نعيد تعريفها كالتالى مثل‬
‫:)‪>>> def rocks(thing‬‬
‫"!‪print thing, "rocks‬‬
‫كدا هيتم طباعة ال ‪ argument‬اللى هيتمرر + كلمة ‪ !rocks‬كالتالى‬
‫)"‪>>> rocks("Python‬‬
‫!‪Python rocks‬‬
‫)"‪>>> rocks("Perl‬‬
‫!‪Perl rocks‬‬
‫جميل نفس الفكرة نريد ان نعمل ‪ function‬تجمع 2+3 وتطبع الناتج لينا‬
‫:)(‪>>> def add‬‬
‫3+2 ‪print‬‬
‫استخدمها كالتالى‬
‫)(‪>>> add‬‬
‫5‬
‫لكن هل لحظت شئ ؟ انها مقيدة بمعنى انى مش قادر استخدم غير 2+3 فقط طب افرض انا عايز احدد ارقام‬
‫من عندى ايه الحل ؟‬
‫همممم نفس فكرة المثال اللى قبله انك تمرر الرقام اللى تعجبك ك ‪ arguments‬لل ‪ add function‬ودا هيتم‬
‫الول‬
‫1- انك تعيد تعريف ال ‪ function‬كالتالى مثل‬
‫:)‪>>> def add(first, second‬‬
‫‪print first + second‬‬
‫2- تستخدمها‬
‫)3 ,2(‪>>> add‬‬
‫5‬
‫)7 ,3(‪>>> add‬‬
‫01‬
‫ارسال ال ‪ arguments‬للدالة‬

‫:)‪def printArgs(first, second, third‬‬
‫‪    print "First: ", first‬‬
‫‪    print "Second: ", second‬‬
‫‪print "Third: ", third‬‬
‫لحظ لستخدام الدالة هنستدعيها كالتالى‬

‫)"‪printArgs("Hello", "Cruel", "World‬‬
‫والناتج‬
‫‪First: Hello‬‬
‫‪Second: Cruel‬‬
‫‪Third: World‬‬

‫ولكن على فرض انى عايز احدد قيم اساسية او حتى ادخل ال ‪- arguments‬المعاملت- بطريقة عشوائية!؟‬
‫بكل بساطة تقدر تستدعيها كدا‬

‫)"‪printArgs(third="World", second="Curel", first="Hello‬‬
‫بحيث انك تحدد قيمة كل عنصر بإستخدام السناد )لنهم متغيرات واضحة للدالة ;(‬
‫ولتحديد قيم افتراضية ؟ مثل عايز ادخل قيمتين او قيمة واحدة او حتى مش ادخل اى قيمة!!؟؟‬
‫تقدر تحدد دا من خلل تعريف الدالة نفسها مثل كالتالى‬

‫:)"‪def printArgs(first="Hello", second="Cruel", third="World‬‬
‫‪    print "First: ", first‬‬
‫‪    print "Second: ", second‬‬
‫‪    print "Third: ", third‬‬
‫02*"­" ‪    print‬‬

...
دا مفيد فى موضوع ال ‪- overloading‬التحميل الزائد-لل ‪) function‬بحيث ان يتم تنفيذ اكتر من‬
‫وظيفه لنفس ال ‪ function‬إعتمادا على ال ‪ arguments‬المرسلة( تابع ‪range‬‬
‫لحد الن ال ‪ Functions‬غير مفيدة لنها مش بتعيد قيمة يعنى مش تقدر تستفيد منها فى برنامجك انك تعمل‬
‫كالتالى مثل‬

‫)3 ,2(‪>>> val=add‬‬
‫5‬
‫‪>>> print val‬‬
‫‪None‬‬

‫*ايه دا ؟ انا كنت متوقع ان ‪ val‬هتكون قيمتها 5!‬
‫دا هيتم فى حالة واحدة ان الطرف اليمين من ال ‪ expression‬تكون قيمته 5 لكن 3 ,2(‪ (add‬قيمته ‪ None‬لنه‬
‫بيعمل ‪ print‬لمجموع الرقمين لكن مش بيعمل بيهم ‪return‬‬
‫*ايه ‪ None‬؟‬
‫‪None=null=nil=Nothing‬‬

‫جميل طب ازاى اخلى قيمة ال ‪ Function‬تساوى مجموع الرقمين ؟‬
‫بسيطة اعمل ‪ return‬بالمجموع!‬
‫كالتالى مثل‬
‫:)‪>>> def add(first, second‬‬
‫‪return first+second‬‬
‫)3 ,2(‪>>> val=add‬‬
‫‪>>> print val‬‬
‫5‬

‫هنا ‪ return‬عبرت عن قيمة ال ‪Function‬‬
‫كتير للسف مش يعرف الفرق بين ال ‪ Functions‬وال ‪Procedures‬‬
‫على كل حال اعتبرها كالتالى‬
‫ال ‪ Procedure‬هو اى ‪ Function‬ليس لها ‪return‬‬
‫-لمبرمجى السى/++ والجافا اى ‪ Function‬ال ‪ return‬لها ‪ void‬يبقة اسمها ‪Procedure‬‬‫بايثون بتقدم ليك العديد من ال ‪ Functions‬الجاهزة مثل‬
‫)‪raw_input(prompt‬‬
‫للحصول على الداتا من المستخدم‬
‫)‪input(prompt‬‬
‫زى ماقلنا هى بتستدعى التالى‬
‫))‪eval(raw_input(prompt‬‬
‫)‪eval(expression‬‬
‫بتحقق قيمة ال ‪expression‬‬
‫)‪abs(number‬‬
‫بتعيد ليك ال ‪- Absolute value‬القيمة المطلقة- وهى العدد بدون اشارة‬

‫)01(‪>>> abs‬‬
‫01‬
‫)01-(‪>>> abs‬‬
‫01‬
‫*تدريب:‬
‫اكتب ‪ Function‬بإسم ‪ getABS‬وبتاخد ‪ argument‬واحدة بإسم ‪ number‬ومشابهه ل ‪abs‬‬
‫)‪max(iterable‬‬
‫هى ‪ function‬بتاخد ‪ container‬فى الغالب -اى شئ ممكن يطبق عليه ‪ -foreach‬وتعيد اكبر قيمة فيه كالتالى‬
‫مثل‬

‫)]6 ,5 ,4 ,3[(‪>>> max‬‬
‫6‬
‫)"‪>>> max("Ahmed‬‬
‫'‪'m‬‬

‫)‪min(iterable‬‬
‫هى العكس من ‪ max‬وهى بتعيد اصغر قيمة‬
‫)"‪>>> min("Ahmed‬‬
‫'‪'A‬‬
‫)]6 ,5 ,4 ,3[(‪>>> min‬‬
‫3‬

‫ملحوظة: اصغر قيمة للحرف بتم بناء على قيمتها فى ‪ ASCII‬وتقدر تحصل عليها من خلل ‪ord‬‬
‫وللحصول على الحرف من خلل القيمة بنستخدم ‪chr‬‬
‫)‪ord(char‬‬

‫)"‪ord("A‬‬
‫)"‪ord("a‬‬
‫)56(‪chr‬‬
‫)79(‪chr‬‬

‫>>>‬
‫56‬
‫>>>‬
‫79‬
‫>>>‬
‫'‪'A‬‬
‫>>>‬
‫'‪'a‬‬

‫)‪sum(seq‬‬
‫بتستخدم للحصول على مجموع ‪ sequence‬ما كالتالى‬
‫)]5 ,4 ,3 ,2 ,1[(‪>>> sum‬‬
‫51‬
‫*تدريب اكتب ‪ function‬مشابهه ل ‪ sum‬وبإسم ‪ getSum‬وبتاخد ‪ sequence‬ك ‪argument‬‬

oct(num)
num ‫بتعيد القيمة من النظام الثمانى لل‬
>>> oct(15)
'017'

hex(num)
num ‫بتعيد القيمة من النظام الست عشرى لل‬
>>> hex(15)
'0xf'

len(object)
‫ هيتم‬string ‫ اللى هتتمرر ليها يعنى مثل إذا كان‬argument ‫ استخدامها بيختلف حسب نوع ال‬len ‫فى الواقع‬
‫ هيتم إعادة عدد العناصر المكونة ليها وهكذا‬list ‫اعادة عدد الحروف وإذا كانت‬
>>> len("Ahmed")
5
>>> len([1, 2, 3, 4, 5, 6])
6

D: ‫ بتاعتنا‬objects ‫ مع ال‬len ‫هنتعلم قريب ازاى نحدد الطريقة اللى هتتعامل بيها‬
round(f_num, digits)
‫ كالتالى مثل‬digits ‫ بعدد معين من الرقام بيساوى‬f_num ‫ بتعمل تقريب ل‬function ‫هى‬
>>> round(2678
...
0
>>> round(2678
...
3678

copyright()
>>> copyright()
Copyright (c) 2001-2008 Python Software Foundation
...

Copyright (c) 2000 BeOpen
...

All Rights Reserved
...

All Rights Reserved
...

All Rights Reserved
...
com, Zope Corporation and a cast of thousands
for supporting Python development
...
python
...


range(end)
1 ‫ بزيادة قيمتها‬end ‫ من 0 لحد‬list ‫بتعيد ليك‬

>>> range(10) #0 to 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range(start, end)
1 ‫ بزيادة قيمتها‬end ‫ لحد‬start ‫ من‬List ‫بتعيد ليك‬
>>> range(1, 5) #1 to 5
[1, 2, 3, 4]

range(start, end, step)
step ‫ بزيادة مقدراها‬end ‫ لحد‬start ‫ من‬list ‫بتعيد ليك‬
>>> range(1, 20, 3) #1 to 20 with step=3
[1, 4, 7, 10, 13, 16, 19]

ASCII ‫ تقوم بعرض جدول ال‬function ‫*تدريب اكتب‬

To *args or not to *args
‫عنوان عجيب‬
sum ‫مثال على دالة‬

def mysum(alist):
    total=0
    for i in alist:
        total += i
    return total

‫ كالتالى‬argument ‫ من الرقام الي الدالة ك‬list ‫لستخدامها هنمرر‬

print mysum([1, 2, 3, 4, 5])
‫ -تعنى اننا سنمرر عدد غير محدد من المعاملت- فيتم تخزين كل المعاملت اللتى سيتم‬args* ‫مثال بإستخدام‬
‫ وهو قائمة‬args ‫تمريرها فى المتغير‬

def newsum(*args):
    total=0
    for i in args:
        total +=i
return total
‫ للدالة كالتالى‬arguments ‫لستخدامها: هنمرر الرقام ك‬

print newsum(1, 2, 3, 4, 5)
printf ‫انشاء دالة مشابة ل‬

def printf(fmt, *args):
    print fmt%args 
printf("Name: %s, Age: %d", "Ahmed", 20)
#converted to  print "Name %s, Age: %d"%("Ahmed", 20)
‫( بالقيم المدخلة‬place holders (%s, %d ‫ لستبدال ال‬print ‫ إلى دالة‬args* ‫لحظ ان هيتم التحويل‬
‫ -دالة تقوم بتجهيز سلسلة نصية واعادتها لمتغير بدل من طباعتها- بإستخدام بايثون‬sprintf ‫*تدريب "اكتب‬

To **kwargs or not to **kwargs 
‫ معاملت مسماه - وقيمها للدالة مثال‬named arguments ‫ -تقدر تقول‬keys ‫بتمرر مفاتيح‬

def newprintf(fmt, *args, **kwargs):
    print "fmt: ", fmt
    print "*args: ", args
    print "**kwargs: ", kwargs
    #do something usefu
    if kwargs
...
"

newprintf("This is some FMT", 1, 2, 3, 4, 5, 6, verbose=True, cleanup=True, use_ssl=False
‫الناتج‬
fmt: This is some FMT
*args: (1, 2, 3, 4, 5, 6)
**kwargs: {'use_ssl': False, 'cleanup': True, 'verbose': True}
Verbose
...
"""
    print "fmt: ", fmt
    print "*args: ", args
    print "**kwargs: ", kwargs
    #do something usefu
    if kwargs
...
"
( d:‫ او وثيقة الدالة )ملف المساعدة بتاعها‬doc ‫لحظ ان اول سطر بعد التعريف بيعبر عن ال‬
‫ عليها‬help ‫__ من الدالة ليعرضلك جزئية المساعدة الخاصة بيها او تستدعى دالة‬doc__
...
__doc__

>>> print newprintf
...

Help on function newprintf in module __main__:
help

>>> help(newprintf)
newprintf(fmt, *args, **kwargs)
    Simple function to learn out howto use *, ** trick in functions
...
upper(), ["ahmed", "mostafa", "omar"])
['AHMED', 'MOSTAFA', 'OMAR']
(‫هنا هيتعمل ريترن -اعادة- بنسخة من العناصر بعد التعديل )التحويل للحروف الكبيرة‬
‫ مش واضح بالنسبة ليك مش مشكلة استبدلها كالتالى‬lambda ‫استخدام‬

def toupper(w):
    return w
...

print filter(lambda i: not i&1, numbers) #evens
#output:
#[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

‫لحظ هنا فى المثال عندنا مجموعة ارقام من 0 ل 91‬
‫هنستخدم قاعدة 1 & ‪ n‬لختبار هل الرقم فردى او زوجى )او اى طريقة تعجبك( زى ماشايفين فى المثال‬
‫بإستخدام ‪ lambda‬وبالفعل بيتم التصفية بناءا على القاعدة اللى حاطينها فى ال ‪function‬‬
‫المثال بدون استخدام ‪lambda‬‬

‫:)‪def isodd(i‬‬
‫:1&‪    if i‬‬
‫‪        return True‬‬
‫‪    return False‬‬
‫:)‪def iseven(i‬‬
‫)‪    return not isodd(i‬‬
‫‪print filter(isodd, numbers) #odds‬‬
‫‪print filter(iseven, numbers)#evens‬‬
‫:‪#output‬‬
‫]91 ,71 ,51 ,31 ,11 ,9 ,7 ,5 ,3 ,1[#‬
‫]81 ,61 ,41 ,21 ,01 ,8 ,6 ,4 ,2 ,0[#‬

‫اماكن استخدام ‪ lambda‬؟ يفضل تستخدمها مع ال ‪ properties‬كبديل لل ‪) getters‬تابع الفصل القادم او فى‬
‫دالة ب سطر واحد(‬

‫ملحوظة‬
‫لختبار هل الرقم زوجى او ل اختبر ناتج باقى القسمة على 2 هل يساوى 0 او ل ويتم ذلك بإستخدام %‬
‫? 0==2 % ‪num‬‬

‫‪Iterable‬‬
‫هى حاوية ‪- container‬مثل ال ‪-list, tuple, string‬‬

‫‪Generator‬‬
‫بكل بساطة هى دالة تعطينا ‪iterator‬‬

‫‪Iterator‬‬
‫هى كائن عبارة عن موجة يمثل بيانات ال ‪ iterable‬له طريقة ‪ next‬عندما يتم استدعائها يتم اعادة العنصر‬
‫التالى فى ال ‪- iterable‬هل تذكر ‪ for loop‬؟-‬
‫ )5(‪>>> lst=range‬‬
‫ ‪>>> lst‬‬
‫ ]4 ,3 ,2 ,1 ,0[‬
‫ :‪>>> for item in lst‬‬
‫ ‪
...

‫ 0‬
‫ 1‬
‫ 2‬
‫ 3‬
‫ 4‬
‫ "‪>>> s="Hello‬‬
‫ :‪>>> for char in s‬‬
‫ ‪
...

‫ ‪H‬‬
‫ ‪e‬‬
‫ ‪l‬‬
‫ ‪l‬‬
‫ ‪o‬‬
‫بالفعل احسنت‬

‫ )‪>>> iterator=iter(s‬‬
‫هنا انشئنا موجة تعبر عن محتوى الحاوية ‪- s‬الحروف-‬

>>> iterator 
 
‫هذا هو الكائن‬
>>> iterator
...
next() 
'e' 
‫العنصر التالى‬
>>> iterator
...
next() 
Traceback (most recent call last): 
  File "", line 1, in  
StopIteration 
‫تم رفع استثناء لنتهاء العناصر التالية فى الموجة‬

‫على فرض لدينا التالى‬

class Student(object):
    def __init__(self, id, name):
        self
...
name=name
    def __str__(self):
        return ""%(self
...
name)
‫صف يمثل الطالب‬
class Students(object):
    def __init__(self):
        self
...
_studentslist
...
add(s)
‫نملء مجموعة الطلب ببيانات غير حقيقية الن مالسلوك المتوقع اذا قمنا بعمل‬
for student in Students:
print student
‫ان يقوم بطباعة كل طالب فى مجموعة الطلب اليس كذلك ؟‬
Traceback (most recent call last): 
  File "tstiters
...
next()
print siter
...
next()
print siter
...
next()
‫الناتج‬
 
 
 
 
Traceback (most recent call last): 
  File "tstiters
...
next() 
  File "tstiters
...
_studentslist:
            if student
...
_studentslist ‫هنا نقوم بالبحث فى ال‬
‫له‬
gen=students
...
next()
print gen
...
learningpython
...
name=name‬‬
‫‪self
...
sex=sex‬‬
‫‪self
...
weight=weight‬‬
‫:)‪def eat(self‬‬

...
‪#code to drink‬‬
‫‪pass‬‬
‫:)‪def sleep(self‬‬

...
‪#code to play‬‬
‫‪pass‬‬

‫*لكتابة اي صف ‪ class‬بنبدأ التعريف بكلمة ‪class‬‬
‫*اسم الصف ‪ class‬يكون بادئ ‪Uppercase‬‬
‫*الصف ‪ class‬بتاعك لزم يورث من ‪) Object‬هنتكلم عن الوراثة( ولكن يكفيك ان اى انسان ماهو إل ‪object‬‬
‫واى ‪ class‬فى الدنيا ماهو إل ‪ object‬فيبقة اكيد هيورث صفات ال ‪
...
self‬تقدر تستبدل ‪ self‬بأى كلمة تناسبك ولكن مجتمع بايثون مرتبط ب‬
‫‪ self‬فإلتزم بالقواعد
...
etc‬‬

‫بإننا نعمل ‪ field‬بكل إسم ‪self
...
sex, self
...
name=name‬‬
‫‪self
...
sex=sex‬‬
‫‪self
...
weight=weight‬‬

‫جميل تعالى نختبر ال ‪ class‬الخاص بنا‬
‫)07,871 ,"‪ahmed=Human("Ahmed", "White", "M‬‬
‫1- اننا ننشئ ‪ object‬من ال ‪ Human class‬ونمرر الداتا اللى هنوصف بيها ال ‪ object‬دا‬
‫2- جملة ‪ print‬بسيطة لعرض ال ‪fields‬‬
‫‪ahmed
...
sex‬‬
‫‪ahmed
...
weight‬‬
‫‪ahmed
...
name‬‬
‫‪print ahmed
...
__name=name
self
...
__sex=sex
self
...
__weight=weight

‫ نفسه فى عملياته الداخلية لكن‬class ‫ مش فى حد يقدر يتعامل معاها غير ال‬private ‫ بقت‬fields ‫كدا ال‬
‫المستخدم الخارجى ل‬
‫ كالتالى‬set ‫ والتانية‬get ‫ واحدة‬field ‫ لكل‬methods 2 ‫ضيف‬
#Getters
def get_name(self):
return self
...
__color
def get_sex(self):
return self
...
__height
def get_weight(self):
return self
...
__name=new_name
def set_color(self, new_color):
self
...
__height=new_height
def set_weight(self, new_weight):

self
...
__sex=new_sex

‫ كالتالى مثل‬fields ‫1- تعالى نختبر موضوع حماية ال‬
>>> print ahmed
...
get_name()
print ahmed
...
set_name("Youssef")
print ahmed
...
set_name(141241) #Wut?
print ahmed
...
‫طب وإيه المشكلة ؟ عدل الكود كالتالى مثل‬

def set_name(self, new_name):
if isinstance(new_name, str):
self
...
__name=new_name‬‬
‫“يعنى هل هو ‪ string‬او ل"‬
‫بإستخدام ال ‪ type function‬بدل ‪isinstance‬‬
‫اذا كان ‪ string‬يبقة عادى نعدل السم اذا ل تطلع رسالة ‪ new_name ain't a string‬ومش يتم اى تعديل!‬
‫تقدر تضيف ال ‪ rules‬اللى تناسبك مثل الطول بتاعها وهل يشمل ارقام او ل وهكذا
...
name=new_name‬‬
‫بدل من‬
‫)‪ahmed
...
name‬‬
‫بدل من‬
‫)(‪ahmed
...
‪name=property(fget=get_name, fset=set_name, doc="Gets/Sets the name‬‬

‫‪ fget‬بتعبر عن الميثود المسئولة عن ال ‪ get‬وهنا هتكون ‪ get_name‬وهى بتستدعى فى حال‬
‫‪object
...
name=new_name‬‬
‫‪ doc‬بتعبر عن وصف ال ‪property‬‬

ahmed=Human("Ahmed", "White", "M", 178,70)
print ahmed
...
name
ahmed
...
name
ahmed
...

self
...
hands=2
object ‫يتم استدعائها فى حال النشاء ل‬
>>> h1=Human("sami")
>>> h1
...
hands
2
Inheritance ‫فى تعليق اضافى لما ندخل فى ال‬
2- __getitem__(self, key), __setitem__(self, key, val)
MyDict ‫على فرض ان عندنا صف بإسم‬
>>> class MyDict(object):
def __init__(self, d={}):
self
...
__d
...
__d[key]
def __setitem__(self, key, val):
self
...
__d ‫احنا مثل لنريد نتعامل مباشرة مع ال‬
indexing

>>> md=MyDict({'Name':'Ahmed', 'Sex':'m'})

__getitem__ ‫نستخدم‬
>>> md['Name'] #Call __getitem__('Name')
'Ahmed'
__setitem__ ‫نستخدم‬
>>> md['Name']='Youssef'
>>> md['Name']
'Youssef'

3-
...
_s=s
self
...
_s)
‫ مع اى كائن مع الصف دا وهنا هنخليها تعيد‬len ‫__ قمنا بتحديد السلوك فى حال استخدام‬len__ ‫هنا بتعريفنا لل‬
self
...
_list)

self
...
__iter__(self)
for loop ‫ وتحديدا التعامل مع‬iterations ‫ وال‬generator ‫بتحدد سلوك الصف من خلل لتعريفك ل‬
>>> class Tech(object):
def __init__(self, langs, nums):
self
...
_nums=nums
def __iter__(self):
for lang in self
...
next()
'Python'
>>> i
...
next()
'Rebol'
contatiner ‫*ملحوظة: لزم تتعمل على‬
5- __str__, __repr__
str, repr ‫لتحديد سلوك الكائن عند استدعاءه كمعامل للدول‬
str, repr ‫س: مالفرق بين‬
Human readable ‫ تعطى تمثيل -سلسلة حرفية- للكائن مقروء للبشر‬Str
‫ عليه -لعادة انشاء الكائن من تلك السلسلة‬eval ‫ تعطى تمثيل للكائن-سلسلة حرفية- يمكن عمل‬repr
-!‫الحرفية العائدة‬
>>> class Human(object):

...

self
...

def __str__(self):

...
name

...

return "Human('%s')"%self
...


>>> h=Human("ahmed")
>>> h
Human('ahmed')
>>> str(h)
''
>>> s=repr(h)
>>> s
"Human('ahmed')" #string
>>> res=eval(s)
>>> res
Human('ahmed') # human object!
>>> type(res)
...
Operators‬يعنى يكون ل ‪ Operator‬اكثر من إستخدام
...
name=name‬‬
‫‪self
...
work_hours += hours‬‬

return self
...
work_hours -= hours
return self
...
work_hours *= hours
return self
...
work_hours += hours
return self
...
work_hours -= hours
return self
...
work_hours *=hours
return self
...
name=name
self
...
work_hours += hours
return self
...
work_hours -= hours
return self
...
work_hours *= hours
return self
...
work_hours += hours
return self
...
work_hours -= hours
return self
...
work_hours *=hours
return self
...
increment_workinghours(3)
w
...
mul_workinghours(2)

!‫انا شايف إن السلوب دا ممل جدا مع إنه احيانا بيكون اءمن بعض الشئ ولكنه ممل‬
w1 ‫ تانى وليكن‬Object ‫اعمل‬

>>>
>>>
7
>>>
3
>>>
15

w1=Worker('ANN', 5)
w1+2
w1-4
w1*5

‫ الخاصة بيهم لتعريفهم‬Magic Methods ‫جدول بكل المعاملت + ال‬
+ __add__, __radd__
- __sub__, __rsub__
* __mul__, __rmul__
/ __div__, __rdiv__, __truediv__ (for Python 2
...
2)
// __floordiv__, __rfloordiv__ (for Python version 2
...
2 ‪/= __idiv__, __itruediv__ (for Python version‬‬
‫)2
...
Enums‬‬
‫لحظ استخدامنا فى الفصل السابق لوامر فى التعامل بين السرفر والعملء مثل /‪ setSharedFiles‬او /‪ query‬الخ‬
‫الخ‬
‫ولكن لفصل افضل للتطبيق تستطيع انشاء ‪Enums‬‬
‫احيانا بنحتاج اننا نجمع مجموعة من البيانات تحت اسم معين مثل ايام السبوع )احد اتنين ثلثاء
...
الخ(‬
‫مثل فى باسكال‬

‫‪type‬‬
‫;)7=‪  TDay = (Saturday=1, Sunday=2, Monday=3, Tuesday=4, Wednesday=5, Thursday=6, Friday‬‬

‫الكود المشابه ليه فى بايثون ممكن يكون‬

(Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday=range(1, 7

‫ففى كذا طريقة فى بايثون‬
‫وممكن تعرفهم كالتالى‬
class MyDays(object): #as rawenum
sunday, monday, tuesday=range(3)
class MyKVDays(object):
sunday, monday, tuesday=0, 9, 2

‫ كالتالى‬class ‫ممكن نعمل‬

class RawEnum(object):
    def __init__(self, start, *enum): #do we need to set a start, end, step? very fancy
...
_kw=dict(zip(enum, range(start, start+len(enum))))
        counter=start
        for arg in enum: #assuming it doesn't exist
...
__setattr__(arg, start)
            counter += 1
    __str__=lambda self: str(self
...


‫ فقط‬enum ‫وهنا بيتحدد فيه قيمة البداية لل‬

    Colors=RawEnum(5, 'white', 'black', 'blue')
    print Colors
...
__kw=kwargs
        for k, v in kwargs
...
__setattr__(k, v)
    __str__=lambda self: str(self
...
monday

Chapter 6 (Inheritance)
‫العلم كله مبنى على الوراثة والكمال من حيث انتهى الخرون حيث لداعى لتكرار مليين السطر لستخدامها‬
‫مرة اخرى‬
‫ كالتالى‬Human ‫تخيل ان عندنا صف‬
class Human(object):
def __init__(self, name, sex):
self
...
_sex=sex
def _set_name(self, name):
self
...
_sex=sex
name=property(fget=lambda self:self
...
_sex, fset=_set_sex)

‫ كالتالى‬Employer ‫وعندنا صف‬

class Employer(object):
def __init__(self, name, sex, salary):
self
...
_sex=sex
self
...
_name=name
def _set_sex(self, sex):
self
...
_salary=salary
name=property(fget=lambda self:self
...
_sex, fset=_set_sex)
salary=property(fget=lambda self: self
...
__init__(name, sex)
self
...
_salary=salary
salary=property(fget=lambda self: self
...

        self
...
Options #Male or Female only
...
__sex=sex
        self
...

    def getName(self):
        return self
...
__name = value
    def getSex(self):
        return self
...
__sex = value

    def getColor(self):
        return self
...
__color = value
    #properties
...
")
    sex = property(getSex, setSex, None, "Gets/Sets sex
...
")
    __str__=lambda self: ""%self
...

    def eat(self):
        #Eating
        pass
    def drink(self):
        #Drinking
        pass
    def sleep(self):
        #Sleeping
        pass

‫هنا عرفنا صنف جديد بيعبر عن النسان وليه متغيرات داخلية زى السم واللون والنوع وبعض الميثودز لمعالجتهم‬
eat, drink, sleep ‫وميثودز اخرى مثل‬
‫ المعرفة كالتالى‬Gender
...

def __unicode__(self):
return self
...
__init__(self, name, color, sex)
        #Superize it :)
        #super(Employer, self)
...
__salary=salary
        self
...
__firm
    def setFirm(self, value):
        self
...
")
    def getSalary(self):
        return self
...
__salary = value
    salary = property(getSalary, setSalary, None, "Gets/Sets salary
...
getName(), self
...
__init__(self, name, color, sex, salary, firm)
        super(Manager, self)
...
__dict__
        #{'_Human__color': 'white', '_Employer__salary': 200000, '_Human__name': 'Wael', 
'_Employer__firm': 'Sun', '_Human__sex': 'Male'}
    def raiseSalaryOf(self, emp, theraise):
        assert (isinstance(emp,Employer) and emp
...
firm)
emp
...
‫لحظ انك لو طلبت‬
‫الداخلية والمقطع الول منها بيعبر عن منين موروثة‬
‫تعالى ننفذ عالمنا الصغير دا كتطبيق سريع‬

if __name__=="__main__":
    
    ahmed=Employer("ahmed", "white", Gender
...
Male, 40000, "Sun")
    tina =Employer("christina", "white", Gender
...
Male, 200000, "Sun")
    wael
...
‪    print isinstance(ahmed, Human) #Ahmed is a Human‬‬

...
__bases__ #inherits object‬‬

...
__bases__ #Inherits Employer‬‬

‫لحظ ان ‪ (issubclass(C, B‬بتسأل هل الصف ‪ C‬مشتق من ‪ B‬او ل‬
‫لحظ ‪ (isinstance(object, Type‬بتسأل هل ال ‪ object‬دا تم انشاءه من الصف ‪ Type‬او ل‬
‫لحظ ان __‪ __bases‬بتعبر عن الب )او الباء لو ورثت من اكتر من صف(‬
‫احنا استخدمنا ‪ assert‬فى كذا جزئية لكن ايه هى ‪? assert‬‬
‫‪ assert‬بتفيد فى عمل تصحيح سريع بحيث انك تضمن عدم التنفيذ فى حال وجود خطأ‬

‫امتة استخدم ‪ ? ASSERT‬استخدامها مقترن بحالة التطوير والمحل مثل مش هتعمل كود فيه ‪assert‬‬
‫‪ statement‬للمستخدم النهائى ، لكن ممكن تحطها فى مكتبة هيستخدمها مطور )هيراعى المتطلبات مظبوط(‬
‫غير كدا استخدم ال ‪Exceptions, Errors‬‬

Multiple Inheritance
:‫مقدمة‬
‫الوراثة المتعددة هى ميزة موجودة فى بعض اللغات الكائنية تسمح لصف بان يورث اكثر من صف كما‬
‫فى المثال التالى سنجد ان هناك المستذئب يرث النسان والذئب ويجمع بين ميزاتهم‬

class Wolf(object):
    def __init__(self):
        self
...
__bite
    def fullmoon(self):
        print "Wooooooooooooooooooooooooo"
    def bite(self, h):
        print "I'm cursed"
class Werewolf(Human, Wolf):
    def __init__(self, name, color, sex):
        Human
...
__init__(self)
    yasser=Werewolf("yasser", "black", Gender
...
__dict__
    print "Can bite? ", yasser
...
bite(ahmed)
    print Werewolf
...
__bite=True
    can_bite=lambda self:self
...
__init__(self, name, color, sex)
        Wolf
...
Male)
    print yasser
...
can_bite()
    yasser
...
__bases__

‫الناتج‬

{'_Human__color': 'black', '_Wolf__bite': True, '_Human__name': 'yasser', '_Human__sex': 'Male'}
Can bite?  True
I'm cursed
( ...
Wolf'>)
( ...
Wolf'>)

__bases__ ‫لحظ الباء للمستذئب زى ماشفت فى ناتج‬

( ...
Wolf'>)

-‫ -لن يتم تغطيتها فى هذا الكتاب‬MRO ‫تعرف على ال‬
/http://www
...
org/download/releases/2
...
message‬‬

#output: integer division or modulo by zero

‫مثال آخر ادخال قيم غير سليمة او منطقية‬
>>> def sayHi(name):
if not isinstance(name, str):
raise ValueError("name ain't string
...
")
ValueError: name ain't string
...
message=msg
def __str__(self):
return repr(self
...

return i

except Exception:
raise IntOnly("Integers only are allowed
...
message
try block ‫ فى ال‬j ‫ ونسند قيمتها ل‬readInt ‫هنا بنستدعى‬
e
...
 As finally doesn't have try' context
try:
   f = file('somefile, 'r')
   lines = f
...
close()
‫كدا وصلنا للصيغة العامة وهى‬

try:

suite
except EX1, ex1: suite
except EX2, ex2: suite
except EX3, ex3: suite
finally: suite

‫يوجد بعض الصفوف المجهزة للتعامل مع الستثناءات/الخطاء‬
‫‪ :BaseException‬هو الب‬
‫‪ :Exception‬هو الب المشتق منه الستثناءات المعتادة‬
‫‪ :ImportError‬محاولة استدعاء موديل‬
‫‪ :KeyboardInterrupt‬عندما يقاطع المستخدم التنفيذ )غالبا ب ^‪(C‬‬
‫‪ :NameError‬محاولة استدعاء ‪ identifier‬غير موجود‬
‫‪ :SyntaxError‬كود بايثون خاطئ‬
‫‪ :IndexError‬الوصول لترتيب غير موجود فى ‪ sequence‬معينة‬
‫‪ :KeyError‬مفتاح غير موجود فى قاموس معين‬
‫‪ :IOError‬مشاكل فى الدخل او الخرج ‪ IO‬ملف غير موجود مثل‬
‫‪ :OverflowError‬تعدى الحجم المسموح بيه لنوع معين‬
‫‪ :OSError‬نظام التشغيل‬
‫‪ :AssertionError‬خطأ نتج بسبب فشل فى ‪assert expression‬‬

‫0==1 >>>‬
‫‪False‬‬
‫0==1 ‪>>> assert‬‬
‫:)‪Traceback (most recent call last‬‬
‫>‪File "", line 1, in ‫0==1 ‪assert‬‬
‫‪AssertionError‬‬

‫أكتب اكواد افضل وعالجها بصورة افضل!‬

‫)‪Chapter 8 (IO‬‬

‫‪Basic IO‬‬
‫هنتكلم فى الفصل دا عن التعامل مع ال ‪ files‬وتحديدا ال ‪ IO‬اختصارا ل ‪Input/Output‬‬
‫ال ‪ file type‬بيعبر عن صف مسئول عن التعامل مع الملفات )ممكن يكون سوكيت او غيره بما ان كل شئ عبارة‬
‫عن ‪(file‬‬
‫فى اكثر من طريقة لنشاء ‪ file object‬ودا عن طريق ‪ open‬او ‪file class‬‬
‫‪ open‬هتعمل ريترن ب ‪ file object‬وهى معرفة كالتالى‬
‫)‪open(name, mode, buffering‬‬
‫حيث ‪ name‬هو مسار الملف‬
‫‪ mode‬هو بيعبر عن حالة الوصول )الملف مفتوح للقراءة ، للكتابة ، للضافة ؟( الفتراضى هو ‪ r‬للقراءة‬
‫قراءة فقط → ‪r‬‬
‫)كتابة فقط )بيتم محو كل البيانات الموجودة → ‪w‬‬
‫للضافة من عند النهاية ،مع عدم محو البيانات → ‪a‬‬
‫قراءة وكتابة → +‪r‬‬
‫كتابة وقراءة → +‪w‬‬
‫اى من ال ‪ modes‬السابقة اذا لحقته ب ‪ b‬اختصارا ل ‪ binary‬سيتم التعامل مع ‪binary read, binary write, 
...
close‬‬
‫لغلق ال ‪file object‬‬
‫)‪
...
readline‬‬
‫قراءة سطر واحد‬

‫)(‪
...
tell‬‬
‫بتخبرنا بالمكان الحالى‬

‫)0=‪
...
xcd‬فيه التالى 9876543210‬
‫)‪
...
writelines(seq_of_strings‬‬

‫يقوم بكتابه كل عناصر ‪ seq_of_strings‬فى الملف‬
‫-كقيامك بإستدعاء ‪ write‬على كل عنصر فى هذه ال ‪sequence‬‬‫)(‪
...
flush‬‬

‫لتأكيد نقل ال ‪ buffer‬الداخلى كله على الملف‬
‫‪
...
mode 
access mode ‫للحصول على ال‬


...
closed
‫للتحقق من تحقق اغلق الملف‬

FNAME="iotest
...
fileno()
print f
...
mode
print f
...
write(txt)
f
...
closed

txt ‫ للكتابة، وكتبنا فى داخله محتويات المتغير‬iotext
...
xcd
w
False
True
‫القراءة‬

f=open(FNAME, "r")
lines=f
...


‫الناتج‬
LINE
LINE
LINE
LINE
LINE
LINE
LINE
LINE
LINE
LINE

=
=
=
=
=
=
=
=
=
=

>
>
>
>
>
>
>
>
>
>

line
line
line
line
line
line
line
some
yada

1
2
3
4
5
6
7
text
yada yada!

‫معاملت سطر الوامر لبرنامجك‬
sys
...
py hello world 123 "78 yay"
Number of arguments: 5
myecho
...
py
#!bin/python 
from sys import argv # arguments vector
...
path
os, os
...
path as op

os
...
)
(sysname, nodename, release, version, machine) ‫ مكونة من‬tuple ‫بتعيد‬

>>> print os
...
6
...
getcwd()

‫بتعيد المسار الحالى‬

>>> print os
...
getcwdu()
unicode ‫مثل سابقتها ولكن بتعمل ريترن ب‬
os
...
 etc ‫ مثل ال‬environment ‫ مخزن فيه متغيرات البيئة‬dictionary ‫هى‬
‫للطلع عليهم‬

for key, val in os
...
items():
    print key, " => ", val

‫للحصول على مفتاح بعينه‬

os
...
getenv("HOME")

‫ سيتم اعادتها فى حالة عدم وجود المفتاح‬default ‫ال‬
‫ ؟‬root ‫انا‬
def isroot():
return os
...
environ dictionary ‫ الخاصة بال‬keys, values methods ‫طبعا تقدر تستخدم ال‬
os
...
unsetenv(key)

value ‫ بقيمة‬environment ‫ لل‬key ‫إضافة‬
‫ ما‬key ‫حذف‬

os
...
getcwd()
os
...
getcwd()
os
...
getcwd()
#output
/home/striky/workspace/pytut/src
/home/striky
/media/s3/Music

media/s3/Music/ ‫ وبيشير ل‬home/striky/ ‫ تحت‬symbolic link ‫ هنا‬Music ‫لحظ ان‬
os
...
getcwd() #/home/striky/workspace/pytut/src
>>> print os
...
py', 'iosess
...
py', 'iohelpers
...
py', 'iotest
...
py', 'complpath
...
link(src,dest)
dest ‫ الى‬src ‫ من‬hard link ‫بتنشئ‬

os
...
unlink(path)
path ‫حذف‬
os
...
unlink ‫مثل‬
os
...
rename(src, dest)
‫اعادة التسمية‬
os
...
removedirs('foo/bar/baz')
foo ‫ ثم‬bar ‫ اول ثم‬baz ‫ستقوم بحذف مجلد‬
chmod(path, mode)
path ‫ على‬mode ‫بتقوم بتعديل ال‬
chown(path, uid, gid)
‫ معين‬path ‫ على‬uid, gid ‫تحديد ال‬
print os
...
curdir #
...
" ‫المجلد الحالى وهى ال‬
print os
...
pardir#
...
" ‫المجلد الب وهى ال‬
print os
...


...
pathsep#:
:‫ وهنا‬PATH ‫الفاصل فى متغير ال‬
print repr(os
...
getcwd() #/home/striky/workspace/pytut/src
F=p+r'/'+"iohelpers
...
basename(F)
print op
...
islink(F)
print op
...
isdir(F)

print op
...
ismount("/media/s3")
print op
...
dirname(F)
print op
...
splitdrive(F)
print op
...
exists(F+"xx")#Nope!
print op
...
getmtime(F) #last modification time
print op
...

print op
...
py
True
False
True
False
True
True
/home/striky/workspace/pytut/src/iohelpers
...
py')
('', '/home/striky/workspace/pytut/src/iohelpers
...
0
1226557142
...
py')

exists(path)
isfile(path)

‫هل المسار موجود ؟‬
‫ ملف؟‬path ‫هل ال‬

isdir(path)
islink(path)

‫ مجلد؟‬path ‫هل ال‬
‫ ؟‬link ‫ عبارة عن‬path ‫هل ال‬

ismount(path)

‫هل هو عبارة عن نقطة ضم ؟‬
isabs(path)
‫هل هو المسار بالكامل ؟‬
basename(path)
‫القاعدة فى المسار‬

abspath(path)

‫المسار المطلق‬
dirname(path)
‫اسم المجلد‬
getatime(path)
last access ‫الحصول على توقيت ال‬

getmtime(path)

last modification ‫الحصول على توقيت ال‬
getctime(path)
windows ‫ اذا كان على‬last creation ‫ او ال‬last change ‫الحصول على توقيت ال‬
getsize(path)
path ‫الحصول على مساحة‬

join(a)

‫ بإستخدام الفاصل المناسب‬path ‫لدمج مكونات ال‬
split(path)
basename ‫ وال‬dirname ‫ مكونة من ال‬tuple ‫تقوم بإعادة‬

splitdrive(path)

‫, وباقى المسار‬drive ‫ مكونة من ال‬tuple ‫تقوم بإعادة‬
splitext(path)
‫ مكونة من المسار كامل بدون المتداد و المتداد‬tuple ‫تقوم بإعادة‬

expanduser(path) 

‫ )~( بمسار المنزل للمستخدم‬tilde ‫تقوم بإستبدال ال‬

expanduser("~/Desktop") 
'/home/ahmed/Desktop'

File Pointer
FileHandler
...
close()
>>>F=open(fileName, 'r')
>>>for line in F
...
txt', 'w') #Open 2
...

>>> print >> f, 'Hola!'

#Add 'Hola' to it

>>> print >> f, 'Hello!' # same
>>> print >> f, 'Using File Pointer !' #the same
>>> f
...

>>> f = open('C:\\2
...


>>> for line in f
...

Hola!
Hello!
Using File Pointer !

>>>f
...


‫ -وضع الضافة‬Append mode ‫ مرة تانية ولكن فى ال‬File ‫طب تمام
...
txt', 'a')
>>> print >> f, 'Programming Fr34ks r0x!'
>>> print >> f, 'File pointers are',
printing a new line
...
close()

filehandler
...
txt', 'r')
>>> for line in f
...
الخ الخ‬
‫:‪Importing a Module‬‬
‫قم بإستدعاء ال ‪ module‬المسماة ‪ math‬وهى وحدة تشمل العديد والعديد للقيام بالعمليات الحسابية بإستخدام‬
‫‪import‬‬
‫‪import math‬‬

‫هكذا قمنا بإستدعاء الوحدة لساحة البرنامج‬
‫لحظ قد لتكون ال ‪ module‬موجود فينتج ‪ImportError‬‬
‫ :‪>>> try‬‬
‫ ‪
...
 except ImportError, e‬‬
‫ ‪
...

‫‪No module named mymath‬‬

‫تقدر تستخدم ال ‪ magical import‬لستدعاء الموديلز ايضا‬
‫)'‪>>> msys=__import__('sys‬‬

‫تقدر تستخدم ‪ as‬لعمل تسميه مختلفة) لموديل او احد عناصر موديل الخ( هنا للموديل مثل المثال السابق ‪ msys‬‬
‫كبديل ل ‪sys‬‬
‫‪>>> import sys as mysys‬‬

‫وهكذا‬

‫‪Finding Nemo‬‬
‫اين توجد هذه الوحدات؟ هل يوجد شروط لستدعاءها ام ماذا ؟‬
‫المفسر ليعلم عن كل ملف بايثون على جهازك ولكن هناك بعض الماكن اللتى يبحث فيها قبل ان يرسل لك ال‬
‫‪ ImportError‬مثل المجلد الحالى او مجلد بايثون الفتراضى او مجلد ‪) site­packages‬يفضل استخدامه عند اضافة‬
‫اى وحدات خارجية لبايثون(‬
‫للحصول على القائمة كاملة التى يبحث فيها المفسر استدعى ‪sys
...
path‬‬
‫­2
...
0­‪['', '/usr/lib/python2
...
2­py2
...
egg', '/usr/lib/python2
...
5
...

‫]
...
py‬وعرف فيها مجموعة من الدوال كالتالى‬
‫ :)(‪def aloha‬‬
‫ "!‪print "Aloha‬‬
‫ ‬
‫ :)(‪def adios‬‬
‫"!‪print "Adios‬‬

‫ايه الهدف من ال ‪ modules‬قلنا ؟ فصل التطبيق لكثر من جزء لمكانية استخدام خدماته اكثر من مرة وايضا‬
‫تسهيل تقسيم العمل مثال شخص يكون مسئول عن جزئية التعامل مع قاعدة البيانات وشخص اخر مسئول عن‬
‫الواجهة وهكذا‬

‫اوكى كتبنا الموديل ماذا الن ؟‬
‫انشئ ملف جديد وليكن ‪ greeter
...
py‬‬

‫ ‪import firstmodule‬‬
‫ )(‪firstmodule
...
adios‬‬

‫عند التنفيذ‬
‫ ‪striky@striky­desktop:~/workspace/pytut/src$ python greeter
...
py‬الى‬
‫ :)(‪def aloha‬‬
‫ "!‪print "Aloha‬‬
‫ ‬
‫ :)(‪def adios‬‬
‫ "!‪print "Adios‬‬
‫ ‬

‫ ‬
‫)(‪aloha‬‬

‫وقمت بتنفيذ ال ‪ greeter
...
py‬‬
‫ !‪Aloha‬‬
‫ !‪Aloha‬‬
‫!‪Adios‬‬

‫مع اننا استدعينا ‪ aloha‬مرة واحدة ولكن تم تنفيذها مرتان وذلك بسبب استدعائها فى ال ‪firstmodule‬‬
‫والحل ؟ الاستطيع اختبار الكود ؟‬
‫اليس الفضل ان تختبر اول اذا كانت ال ‪ module‬هى اللتى يتم تنفيذها كملف رئيسى او مجرد مستدعاه فى ملف‬
‫اخر ؟ كيف اعلم هذا ؟‬
‫بكل بساطة توفر لك ال ‪ modules‬متغير خاص بإسم __‪ __name‬يحوى اسم ال ‪ module‬الحالية وهو "__‪”__main‬‬
‫قم بإضافة شرط فى نهاية ال ‪ firstmodule‬كالتالى‬
‫ :"__‪if __name__=="__main‬‬

...
py‬سيتم طباعة ‪ !Aloha‬و ‪ !Adios‬وعند تنفيذك لل ‪ firstmodule‬فتكون‬
‫هى السكربت الرئيسى اللذى سيتم تنفيذه او ال __‪ __main‬فيتم تنفيذ كود الختبار او اىاكان :(‬
‫للتحكم فيما يمكن استدعاءه من وحدة ما تستطيع استخدام متغير خاص بإسم __‪__all‬‬
‫__‪["all__=["aloha‬‬

‫__‪It's all about __all‬‬

‫ ‪Packages‬‬
‫للن جيد ماذا لو زاد عدد ال ‪ modules‬تستطيع بالتأكيد انشاء المئات من تلك الملفات ولكن يجب عليك تحزيم ال‬
‫‪ modules‬المترابطة مثل اذا كنا ننشئ مشروع عن التعامل مع قواعد بيانات مختلفة ‪ oracle, sqlite, mysql‬وغيرهم‬
‫اليس الفضل تجميعهم فى حزمة ما بإسم ‪ databases‬مثل ؟ ويتم استدعاءها‬
‫‪import databases
...
py 
|­­ mysql
...
py 
`-- sqlite
...
py, oracle
...
py ‫2- 3 وحدات بإسم‬
mysql
...
"

oracle
...
"

sqlite
...
"

__init__ ‫الملف‬
print "__init__ myfirstpackage" 
import mysql

VERSION="1
...
0"

VERSION ‫ مباشرة وحددنا متغير بإسم‬mysql ‫ ل‬import ‫لحظ اننا قمنا بعمل‬
dbtester
...
VERSION 
myfirstpackage
...
about() 
myfirstpackage
...
about()

‫ستجد الناتج مشابه للتالى‬
striky@striky­desktop:~/workspace/pytut/src$ python dbtester
...
42
...
 
Traceback (most recent call last): 
  File "dbtester
...
sqlite
...
sqlite

Platform
‫كثيرا مانحتاج للحصول على معلومات عن النظام الذي يعمل عليه البرنامج )لختبار التوافقية ، العتماديات او‬
(‫ربما العلم بالشئ‬
platform ‫تقدم لنا بايثون وحدة بإسم‬
‫مثال‬
striky@striky­desktop:~/workspace/pytut/src$ python platformreport
...
4')] 
[mac_ver => ('', ('', '', ''), '')] 
[machine => i686] 
[node => striky­desktop] 

[platform => Linux­2
...
27­9­generic­i686­with­debian­lenny­sid] 
[processor => ] 
[python_build => ('r252:60911', 'Oct  5 2008 19:24:49')] 
[python_compiler => GCC 4
...
2] 
[python_version => 2
...
2] 
[python_version_tuple => ['2', '5', '2']] 
[release => 2
...
27­9­generic] 
[system => Linux] 
[uname => ('Linux', 'striky­desktop', '2
...
27­9­generic', '#1 SMP Thu Nov 20 21:57:00 UTC 2008', 'i686', '')] 
[version => #1 SMP Thu Nov 20 21:57:00 UTC 2008] 
[win32_ver => ('', '', '', '')] 

‫ مثل‬function ‫تستطيع بكل تأكيد كتابة كل‬

platform
...
machine()
platform
...
startswith("_"): #If it does not start with an underscore
...

try: 
print "[%s => %s]"%(s, f()) #Prints attr, returned value 
except: 
pass #Global catch for functions requires params(e
...


‫ من الوحدة‬getattr ‫ بإستخدام‬function object ‫ ونحصل على ال‬dir ‫ بإستخدام‬platform ‫هنا نقوم بعرض محتويات‬
‫وبإسم الدالة ونقوم بتنفيذها )مجرد استدعائها بعد الحصول عليها( وبس كدا‬

‫)‪Chapter 10 (Databases‬‬
‫‪Python/MySQL‬‬

‫‪ MySQLdb‬هى ‪ Interface‬بتسمحلك بالتعامل مع ‪ MySQL‬من خلل بايثون‬
‫اوكى القصة بدأت ان اتعمل ‪ wrap‬لل ‪ MySQL C APIs‬بصورة ‪OO‬‬
‫فى امثلة لشكل ال ‪APIs‬‬
‫5‪http://mysql­python
...
net/MySQLdb
...
(‪connect‬‬
‫هى المسئولة عن انشاء التصال بقاعدة البيانات وبتعمل ريترن ب ‪ Connection Object‬لزم عشان ننشئ اتصال‬
‫نحتاج شوية معلومات زى ال‬
‫‪– host‬‬
‫ودا بيعبر عن الهوست اللى هيتم التصال عليه)الفتراضى ‪( localhost‬‬
‫‪– user‬‬
‫اسم المستخدم )الفتراضى المستخدم الحالى (‬
‫‪– passwd‬‬
‫الباسورد الخاص بإسم المستخدم )افتراضى ليوجد(‬
‫‪– db‬‬
‫قاعدة البيانات )الفتراضى ل(‬
‫‪– port‬‬
‫زى مانت عارف ال ‪ MySQL‬ليها ‪ server‬ودا البورت بيعبر عن ال ‪ TCP Port‬اللى بيستخدمه السرفر وافتراضيا‬
‫6033 )عدله لو قمت بتغييره!(‬
‫‪– ssl‬‬
‫–لنشاء ‪) SSL Connection‬ملحوظة :‪ throws exception‬لو غير مدعم!(‬
‫‪– compress‬‬
‫–لتفعيل ال ‪) compression‬الفتراضى ل(‬
‫‪– connect_timeout‬‬
‫–تحدد زمن ال ‪timeout‬‬
‫‪– charset‬‬
‫–اذا تم اضافتها هيتم تضمين ‪use_unicode=True‬‬
‫‪– sqlmode‬‬
‫–لتحديد ال ‪) sqlmode‬يفضل تراجع ‪(MySQL documentation‬‬
‫–‬

‫تقدر تحدد الكثير من العدادات كل اللى عليك تراجع ال ‪MySQL Documentation‬‬
‫ ‪apilevel‬‬
‫بتحدد اى ‪ DB API‬مدعمة ؟ الحالى 0
...
apilevel‬‬
‫'0
...
threadsafety‬‬
‫1‬

‫حسنا ايه معنى ال ‪ threadsafety‬اصل ؟‬
‫هى عبارة عن رقم بين ]0, 3[‬
‫0:‬
‫بيعنى ان ال ‪ threads‬مش تقدر تشارك فى ال ‪module‬‬
‫1:‬
‫ان ال ‪ threads‬تقدر تشارك فى ال ‪ module‬ولكن مش ال ‪connections‬‬
‫2-‬
‫ان ال ‪ threads‬تقدر تشارك فى ال ‪ module‬وال ‪ connections‬ولكن مش ال ‪) cursors‬هنتكلم عنها(‬
‫3-‬
‫اعلى شئ وهى امكانية المشاركة الكاملة فى ال ‪ module, connections‬و ال ‪cursors‬‬
‫‪paramstyle‬‬
‫سترينج بيعبر عن طريقة التعامل مع ال ‪ queries‬من خلل المدخلت يعنى مثل احيانا فى ناس بتستخدم‬
‫؟ )علمة استفهام( او طريقة %‪ s‬او حتى استخدام الرقام :1 و :2 وهكذا )حسب الترتيب( فالفتراضى هو ‪format‬‬
‫‪>>> ms
...
_dbname=dbname
        self
...
connect(host="localhost",
                                       user="root",
                                       passwd="",
                                       db="pyim")
self
...
_sqlconnection
...
_sqlconnection ‫ بإسم‬Connection object ‫وحددنا البيانات وانشئنا‬
self
...
Offline):
#State
...
_md5(pwd)
        sqlstmt="INSERT INTO users VALUES(NULL, '%s', '%s', %d)"%(username, md5edpass, state)
        try:
            self
...
execute(sqlstmt)
            self
...
commit()
        except Exception, e:
print e
...
_sqlcursor
...
_sqlconnection
...
message

‫تسجيل دخول‬
    def login(self, username, pwd):
            
        md5edpass=self
...
_sqlcursor
...
_sqlcursor
...
setState(State
...
_sqlcursor
...
message

‫عرض الكل‬

    def getAllUsers(self):
        sqlstmt="SELECT username, state FROM users"
        self
...
execute(sqlstmt)
        for row in self
...
fetchall():
            yield row[0], row[1]

‫ بمعنى ان نفس المبادئ هتلقيها ثابتة فى اى‬DB API ‫ من خلل مفهوم ال‬MySQLdb ‫ملحوظة: انا هنا ناقشت‬
‫انترفيس هتستخدمها‬
DB API 3 ‫ومازلنا منتظرين‬

Refs:
MySQLdb 1
...
2 docs
Python DB API Specifications v2

PySQLite

‫؟‬PySQLite ‫ماهى‬
Python ‫ من خلل ال‬SQLite ‫ ل‬interface ‫هى‬
‫للتحميل اضغط هنا‬
Lib ‫للتستيب مثل اى‬
python setup
...
connect("mydb
...
connect(“:memory:”)

DB ‫ عشان نستخدمه فى التعامل مع ال‬Cursor ‫ محتاجين نعمل‬Connection ‫بعد ماأنشأنا ال‬
cursor=dbConnection
...


‫ مثل‬Fields 3 ‫ ويشمل‬Info ‫ وليكن بإسم‬Table ‫نريد ان ننشئ‬
id: integer, primary Key 

name: varchar(50) 
phone: varchar(10) 
SQL Statement ‫جميل يبقة هنحتاج‬
sqlStmt='CREATE TABLE info (id INTEGER PRIMARY KEY, name VARCHAR(50), phone
VARCHAR(10))'

cursor object ‫ الخاصة بال‬execute method ‫ نستخدم ال‬SQL Statement ‫ولتنفيذ ال‬
 
>>> cursor
...
dbapi2
...
execute('INSERT INTO info VALUES(null, "ahmed youssef", "12345678")') 
...
Cursor object at 0x0128B230> 
>>> cursor
...
dbapi2
...
‫ كالتالى‬fields ‫نقدر ندخل ال‬
>>> username="guru" 
>>> phone ="36987452"


...
execute('INSERT INTO info VALUES(null, ?, ?)', (username, phone)) #replaced
...
dbapi2
...
‫ لحفظ التعديلت دى‬Commit method ‫بعد ماعدلنا او اضفنا لزم نستدعى ال‬

>>> dbConnection
...
close() 
dbConnection
...
connect("mydb
...


cursor ‫ننشئ‬
>>> cursor=dbConnection
...


‫ ليتم تنفيذها‬sql statement
 
>>> sqlStmt='SELECT * from info'
 
sqlStmt ‫تنفيذ ال‬
>>> cursor
...
fetchall() 
[(1, u'ahmed youssef', u'12345678'), (2, u'3amer mohamed', u'41234114'), (3, u'guru',
u'36987452')]

result ‫ على كل الصفوف اللى موجودة بال‬iterate ‫او تقدر تعمل شئ مشابه لكدا بإنك ت‬
>>> for row in cursor: 
        #id, name, phone 

        print "­­­­­­­­­­" 
        print "ID: ", row[0] 
        print "Name: ", row[1] 
        print "Phone: ", row[2] 
        
­­­­­­­­­­ 
ID:  1 
Name:  ahmed youssef 
Phone:  12345678 
­­­­­­­­­­ 
ID:  2 
Name:  3amer mohamed 
Phone:  41234114 
­­­­­­­­­­ 
ID:  3 
Name:  guru 
Phone: 36987452

iterator ‫ لنها‬next
...
next() 
(1, u'ahmed youssef', u'12345678') 
>>> cursor
...
fetchmany(2) 
>>> ret 
[(1, u'ahmed youssef', u'12345678'), (2, u'3amer mohamed', u'41234114')] 

fetchone()
‫بتعيد صف واحد‬
>>> one=cursor
...
طب وإذا حبيت اخزن‬
‫ بتاعك الول‬class ‫بكل بساطة اعمل ال‬

class Person(object): 
    def __init__(self, name, phone): 
        self
...
phone=phone
‫ مثل
...
 
memConnection=SQLite
...
PARSE_DECLTYPES) 
#cursor 
cursor=memConnection
...
execute("CREATE TABLE test (id INTEGER PRIMARY KEY, p person)")

‫ بتاعته تانى من ال‬data ‫ وازاى نجمع ال‬string ‫ الخاص بنا يتحول ل‬object ‫جميل جدا
...
مش‬toString method ‫ بإستخدم‬text ‫ملحوظة: إحنا بنتكلم على مجرد‬
def adaptPerson(person): 
return "%s;%s" %(person
...
phone)

‫ ودمجناهم ب ;
...
بكل بساطة إحنا حولنا ال‬
‫ منها‬object ‫ وننشئ‬Constructor ‫ دى لل‬fields ‫نجمعهم بإننا نفصل ال ; ونمرر ال قيم الخاصة بال‬
def convToPerson(text): 
    name, phone=map(str, text
...
كل اللى ناقص اننا نبلغ‬
SQLite
...
register_converter("person", convToPerson)

‫ننشئ بعض الكائنات‬

p1=Person("ahmed", "12345678") 
p2=Person("rul3z", "89745632")

‫ونضيفهم للجدول‬
cursor
...
execute('INSERT INTO test VALUES(null, ?)', (p2, ))
 
‫نجرب نستعلم عن الموجودين‬
#select
...
execute('SELECT * from test') 
for row in cursor: 
    print row 
#output: 
(1, (ahmed;12345678)) 
(2, (rul3z;89745632))

cursor, connection ‫نقفل ال‬
#clean­up 
cursor
...
close()

‫الكود النهائى‬
#!bin/python 
from pysqlite2 import dbapi2 as SQLite 
#dbName='myobjDBTest
...
 
#dbConnection=SQLite
...
PARSE_DECLTYPES) 
memConnection=SQLite
...
PARSE_DECLTYPES) 
#cursor 
cursor=memConnection
...
name=name 
        self
...
name, self
...
 
def adaptPerson(person): 
    return "%s;%s" %(person
...
phone) 
 
def convToPerson(text): 
    name, phone=map(str, text
...
register_adapter(Person, adaptPerson) 
SQLite
...
 
cursor
...
execute('INSERT INTO test VALUES(null, ?)', (p1, )) 
cursor
...
 
cursor
...
close() 
memConnection
...
devshed
...
ite­in­Python/ 
http://www
...
org/tracker/pysqlite/wiki/basicintro 
http://www
...
org/pub/software/py
...
locals import *

‫ننشئ صف ليمثل لنا جدول للكتب‬

>>> class Book(object): 

...
     id=Int(primary=True) 


...

npages=Int()
‫ننشئ قاعدة بيانات‬
>>> db=create_database("sqlite:")

(‫ننشئ كائن مخزن )ليتعامل مع عناصر قاعدة البيانات‬
>>> store=Store(db)

‫ننشئ الجدول المعبر عن الكتب‬
>>> store
...
name=u"Introduction to Ruby" 
>>> rbook
...
id, rbook
...
npages 
None Introduction to Ruby 210

‫فلنضيفه الن‬
>>> store
...
Book object at 0xb78aecac> 
>>> print rbook
...
name, rbook
...
name=u"PyGuide" 
>>> pybook
...
Book object at 0xb78ae80c> 
>>> store
...
Book object at 0xb78ae80c>

‫الحصول على سجل ما‬

>>> pythonbook=store
...
name==u"PyGuide")
...
name 
u'PyGuide'

‫الطريقة ‪ one‬تحصل على صف واحد‬
‫او ربما البحث بال ‪ primary key‬الخاص به‬
‫ ‪>>> store
...
name‬‬
‫'‪u'Introduction to Ruby‬‬

‫الطريقة ‪ flush‬كالعادة لعمل ‪flush‬‬
‫ )(‪>>> store
...
get(Book, 1)
...
find(Book, Book
...
one‬‬
‫ ‪>>> pythonbook
...
canonical
...
processConnection=connectionForURI('sqlite:/:memory‬‬

>>>

‫3- نكتب صف يعبر عن الجدول‬
>>> class Book(SQLObject): 

...

npages=IntCol()

‫4- ننشئ الجدول‬
>>> Book
...
title 
'Introduction to Ruby' 
>>> rbbook
...
'" npages=230> 
>>> pybook="PyGuide" 
>>> pybook=Book(title="PyGuide, npages=330") 
>>> pybook=Book(title="PyGuide", npages=330) 
>>> pybook 


get ‫ استخدم الطريقة‬id ‫للحصول على كتاب ما بإستخدام ال‬
>>> Book
...
'" npages=230> 
>>> book=Book
...
select() 
>>> list(books) 
[>>> list(rbbooks) 
[, npages=230>]

/http://www
...
org ‫للمزيد تابع‬

SQLAlchemy
TODO

‫)‪Chapter 11 (Parsing Data‬‬

‫‪XMLing with Python‬‬
‫ملفات ال ‪ xml‬من اهم الملفات اللى بنتعامل معاها بصورة شبه يومية وبايثون من انسب الحلول للتعامل معاها
...
python
...
html‬‬
‫على كل حال فى هذه الجزئية سنتحدث عن كيفية معالجة واستخلص البيانات من ملفات ال ‪XML‬‬

‫على فرض عندنا ملف كالتالى‬
...
dtd"> 
...
dom
...
)

parse, parseString ‫فى عندنا دالتين مهمين وهم‬
file ‫ للتعامل مع‬parse
string ‫ للتعامل مع‬parseString
document object ‫والتنين هيدولك ريترن ب‬
node object ‫ال‬
‫ وليه ميثودز/صفات مهمة‬xml ‫هو يعتبر الب لكل العناصر ملف ال‬

nodeType 

text node, element, comment,document,
...
‫ليها‬
‫ بيعبر عن عنصر معين فى الملف وليه ميثودز مهمة زى‬Element Object ‫ال‬
tagName  #used as a property
element ‫بتعيد السم المجرد لل‬
getElementsByTagName*
document object ‫مشابهه للموجودة بال‬
hasAttribute(attrName)
‫ ؟‬attribute ‫هل بيحتوى على‬

getAttribute(attrName)

attrName ‫ معينة بإسم‬attribute ‫بيعيدلك قيمة‬
setAttribute(attrName, val)
‫ بالعنصر‬val ‫ ليها قيمة‬attrName ‫ معينة‬attribute ‫بيربط‬

removeAttribute(attrName)

(! exception ‫ )مش بيرفع اى‬attrName ‫ معينة‬attribute ‫لحذف‬
‫ كمعامل‬nsURI ‫ ما وبتاخد‬namespace ‫ ودى لربطها مع‬NS ‫ملحوظة فى بعض الميثودز بنفس السم ولكن اخرها‬

...
python
...
html

‫طيب تمام‬
minidom ‫1- استدعى ال‬
import xml
...
minidom as md #(parse, parseString
...
parse("books
...
documentElement
...
getElementsByTagName("book") 
    for book in books: 

        

if book
...
getAttribute("id") 
for child in book
...
nodeType==child
...
tagName=="name": 
child
...
firstChild
...
documentElement
...
getElementsByTagName("book") 
‫ على كل عنصر فيها‬loop ‫نعمل‬
    for book in books: 
(‫ )لمجرد عرض المثال‬id attribute ‫اذا كان فيه‬
if book
...
getAttribute("id") 
name tag ‫طيب ولطباعة اسم الكتاب؟ لحظ انه متخزن فى ال‬
‫ و ال‬ELEMENT NODE ‫ ونشوف النوع اذا كان‬book element ‫ على كل البناء فى ل‬loop ‫بسيطة جدا نعمل‬
‫ نطبعه‬name ‫ بتاعه هو‬tagName
        
        

if child
...
normalize() 
print "Book: ",child
...
data
element, comment, text, 
...
 ‫الحصول على الثمن الكلى‬
def getTotalSum(): 
    global doc 
    thesum=0 
    prices=doc
...
normalize() 
        thesum += int(price
...
data) #TO int
...
sax import make_parser, parseString‬‬
‫‪from xml
...
handler import ContentHandler‬‬
‫ال ‪ ContentHandler‬هو مفتاحنا السحرى فيه ميثودز ‪ event handlers‬بيتعمل ليها استدعاء عند حدوث حدث معين‬
‫)(‪startDocument‬‬
‫بيتم استدعائها مرة واحدة عند بداية الملف‬
‫)(‪endDocument‬‬
‫بيتم استدعائها مرة واحدة عند نهاية الملف‬
‫)‪startElement(name, attrs‬‬
‫بيتم استدعائها عند بداية قراءة كل عنصر ‪el‬‬
‫>‪ ...
 attrN=valN]>CONTENT‫)‪endElement(el‬‬
‫بيتم استدعائها عند نهاية قراءة عنصر ‪el‬‬
‫>‪ ...
sax import make_parser, parseString‬‬
‫‪from xml
...
handler import ContentHandler‬‬
‫ال ‪ make_parser‬هتعيد لينا ‪XML reader‬‬
‫‪ parseString‬لقراءة ال ‪ xml‬من ‪string‬‬
‫‪ parse‬هى ميثود تبع ال ‪ XML reader object‬بتاخد مسار ملف )نفس ‪ parse,parseString‬اللى تحدثنا عنهم فى‬

(minidom
(‫ صف مختص بمعالجة المحتوى )لحقا‬ContentHandler
‫ مخزن‬string ‫ ك‬xml ‫2- ملف ال‬
xmldoc=""" ...
-ContentHandler - ‫ مش تكتبها فى معالج المحتوى‬override ‫ملحوظة اى ميثود مش هتعملها‬

    def __init__(self): 
        self
...
 
        self
...
_curid=None 
        self
...
_authors=[]

‫ايه المتغيرات دى كلها ؟‬
‫ للتخزين المجموع الكلى للسعار‬self
...
_curel
‫ تم قرائته‬id ‫ لتخزين اخر‬self
...
_booksInfo
‫ تخزين اسماء الكتاب‬self
...
_total 
    def getBooksInfo(self): 
        return self
...
_authors

‫ للوصول للمتغيرات الداخلية‬getters ‫عرفنا‬
lambda ‫ مع‬properties ‫ملحوظة يفضل تستخدم‬
    booksinfo=property(fget=lambda self: self
...
_authors) 
    total=property(fget=lambda self: self
...

pass

‫لو حبيت تضيف اى رسالة او اى حاجة على هواك يتم تنفيذها عند بداية قراءة الملف‬

    def endDocument(self): 
        #print "Ending Document
...
_curel=el 
if el=="book": 
#get the id
...
_curid=attrs
...
_curel‬‬
‫‪self
...
‪#get the id‬‬
‫]"‪self
...
getValue("id") #attrs["id‬‬
‫طبعا تقدر تحصل عليها كأنك بتتعامل مع ‪ dict‬مش بإستخدام
...
strip‬‬
‫ :"‪if self
...
‪    #print "In Price‬‬
‫ :‪    try‬‬
‫ )‪        self
...
_curel=="name‬‬
‫ ])‪    self
...
_curid‬‬
‫ :"‪elif self
...
_authors +=[content‬‬
‫ :‪else‬‬
‫‪pass‬‬

‫هنا هيتم استدعائها عن قراءة المحتوى للعنصر الحالى‬
‫وبناءا على العنصر الحالى هنتعامل سواء اذا كان ثمن او اسم الكتاب او الكاتب‬
‫4- ننشئ كائن من معالج المحتوى الجديد ‪BooksHandler‬‬
‫)(‪bh = BooksHandler‬‬

‫ننشئ ‪ XML reader‬ونمرر ليه ال ‪ handler‬الجديد والفايل اللى هيتعالج او نستخدم ‪ parseString‬ونمرر ليها كائن‬
‫معالج المحتوى)‪(bh‬‬
‫ ) (‪    p = make_parser‬‬

‫ )‪    p
...
parse(open("books2
...
python
...
sax
...
saxproject
...
parsers
...
_curel=None 
        self
...
_inbook=False 
        self
...
_thesum=0 
        self
...
ParserCreate() 
        self
...
StartElementHandler=self
...
_p
...
__endElement 
        self
...
CharacterDataHandler=self
...
_p
...
_thesum 
    def getBooksInfo(self): 
        return self
...
_books: 
            print book

  
self
...
_inbook=True 
        self
...
_curattrs=attrs 
    def __charsDataHandler(self, data): 
        if data
...
_inbook and self
...
_books += [data] 
            elif self
...
_thesum += int(data) 
            else: 
                pass 
    def __endElement(self, el): 
        if el=="book": 
            self
...
_curel, self
...
getTotalSum() 
    p
...
0"?>




Introduction to Python
Ahmed Youssef
80


Introduction to Java
Wael Muhammed
130


Introduction to Ruby
Ahmed Youssef
70


Introduction to Linux Programming
Ahmed Mostafa
90





‫ وكلم كتير اخر
...
library
...
id,  book
...
author
    totalsum=sum([int(str(book
...
library
...
0" encoding="UTF­8"?>
...
com/AWSECommerceService/2005­10­
05">
    
        
            
            
        

        16WRJBVEM155Q026KCV1
        
            
            
            
            
            
        

        0
...
amazon
...
html%3FASIN=0321480791%26tag=ws
%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0321480791%253FSubscript
ionId=dontbeaswoosh
            
                Michael Hartl
                Aurelius Prochazka
                Addison­Wesley Professional

                Book
                RailsSpace: Building a Social Networking Website with Ruby on Rails (Addison­<br />Wesley Professional Ruby Series)
            

        
    


‫وتريد الحصول على بعض العناصر اليس كذلك ؟‬

    print rt
...
HTTPHeaders
...
Name
    print rt
...
Arguments[0]
...
OperationRequest
...
Items
...
Items
...
Items
...
ASIN
print rt
...
Item
...
064924955368042
3
22
0321480791
http://www
...
com/gp/redirect
...
0" encoding="UTF-8"?>


Sat Aug 09 05:38:12 +0000 2008
882281424
I so just thought the guy lighting the Olympic torch was falling
when he began to run on the wall
...
text>

web
false
1234
12345


4243
John Nunemaker
jnunemaker
Mishawaka, IN, US
Loves his wife, ruby, notre dame football and iu
basketball

http://s3
...
com/twitter_production/profile_imag
es/53781608/Photo_75_normal
...
com
false
486



user ‫وتريد الحصول على كل ماتحت ال‬
statuses
...
user
...
amazonaws
...
jpg
url => http://addictedtonew
...
xml‬و ‪ twitter
...
org/2008/11/17/happymapper­making­xml­fun­again‬‬
‫للحصول على ‪HappyMapper‬‬
‫‪/http://bitbucket
...
urlopen(url)
...
decode("cp1256")
...
_ina=False 
self
...
_links 
 
def handle_start_tag(self, tag, attrs): 
pass
 
def handle_data(self, data): 
pass 
 
def handle_endtag(self, tag): 
pass 
 
def getlinks(url): 
htmlsrc=fetchdatafrom(url) 
p=PageParser() 
p
...
links()

SAX ‫طريقة الستخدام مشابهه لتلك مع‬
HTML ‫ للتعامل مع وسوم ال‬handle_endtag ‫ و‬handle_data ‫ و‬handle_starttag ‫حيث تعيد تعريف الطرق‬

‫الدالة ‪ fetchdatafrom‬تقوم بإعادة كود الصفحة اليك على صورة ‪string‬‬
‫الدالة ‪ as_unciode‬تقوم بتحويل ال 6521‪ cp‬الى ‪) unicode‬ربما اذا اردت ان تعالج ال ‪ data j‬تستطيع الستفادة منها‬
‫(‬
‫ال ‪ PageParser‬هو صف يشتق ال ‪ HTMLParser‬ويتم التعامل داخله مثلما تعاملنا مع الصفوف المشتقة‬
‫‪ContentHandler‬‬
‫ولطعامه السورس نستخدم الطريقة ‪feed‬‬
‫الدالة ‪ getlinks‬تقوم بالحصول على الروابط من الطريقة ‪ links‬اللتى تعيد لنا الروابط اللتى تم قرائتها‬

‫‪Beautiful Soup‬‬
‫هى ‪ HTML/XML parser‬بايثونية وتعالج ايضا الملفات المكتوبة بطريقة سيئة ولتجعلك تقلق من النكودينج‬
‫لمعالجة ملفات ال ‪ HTML‬استخدم الصف ‪ BeautifulSoup‬واذا اردت معالجة ملفات ‪ XML‬استخدم‬
‫‪BeautifulStoneSoup‬‬
‫حل المطلوب السابق بإستخدام ‪BeautifulSoup‬‬

‫‪#!bin/python‬‬
‫‪import BeautifulSoup as bs‬‬
‫‪import urllib2 as ulib‬‬
‫:)‪def fetchdatafrom(url‬‬
‫"‪    return ulib
...
read() or "\n‬‬
‫:)(‪def getzetcodemain‬‬
‫)'‪    return fetchdatafrom('http://zetcode
...
BeautifulSoup(getzetcodemain‬‬
‫:)'‪for el in soup
...
‪    # [0][0] is href‬‬
‫)‪    print "[url=%s]%s[/url]"%(el
...
contents‬‬

‫تنتظرك رحلة رائعة مع الوثائق الخاصة بيها‬
‫‪http://www
...
com/software/BeautifulSoup/documentation
...
csv‬وفيه البيانات التالية‬
‫91 ,‪ahmed, m‬‬
‫02 ,‪wael, m‬‬
‫91 ,‪radwa, f‬‬
‫12 ,‪gina, f‬‬
‫02 ,‪ayman, m‬‬
‫استدعى ال ‪ csv module‬كالتالى‬

‫‪import csv‬‬
‫قم بإنشاء ‪“ reader object‬مسئول عن القراءة للملف ومعالجته" بإستخدام‬
‫‪()cvs
...
23‪reader=csv
...
csv", "rb")) #default dialect
...
line_num‬‬
‫فلنقم بتحسين المثال بعض الشئ‬

‫‪import csv‬‬
‫)"‪f=open("somefile
...
23‪    reader=csv
...
 #b as a catch for win‬‬

    for row in reader:
        print row, " at: ", reader
...
message
finally:
f
...
DictReader(f, fieldnames=("name", "age", "sex")) #default dialect
...

    for row in reader:
        print row, " at: ", reader
...
writer ‫ )كاتب( من‬writer ‫بتنشئ‬
writer
...
csv", "w") 
try: 
    writer=csv
...
com"), 
           (2, "ayman", "aymanf2@gmail
...
com") 
           ) 
    headers=("id", "user", "email") 
    writer
...
writerow(row) 
except Exception, ex: 
    print ex
...
close‬‬

‫للمزيد حول ال ‪ CSV‬راجع وثائق بايثون‬

ConfigParser
”!‫ “لعلقة لها بالرجيسترى‬ini
...
‫ملف ال‬
‫مثال‬
[program]
name = SVM
version = 0
...
4
license = GPLv3
[author]
name = Ahmed Youssef
email = guru
...
com

‫ “فى‬keys/values ‫ كل منهم بيحوى‬author ‫ والثانى‬program ‫ او قسمين الول‬sections 2 ‫هنا فى الملف يوجد‬
‫بيسموها اوبشنز" براحتك‬
SVM ‫ وقيمته‬program section ‫ تحت ال‬key ‫ هو‬name ‫مثل ال‬
tst
...
read("tst
...


read method ‫ بيقوم بقراءة الملف بإستخدام ال‬cp ‫ اللى انشئناه‬configparser object ‫ال‬

...
set(section, key, value)

‫لضافة سكشن جديد‬
value ‫ وله قيمة‬section ‫ جديد تحت القسم‬key ‫لضافة‬


...
has_section(section)
‫ ؟‬section ‫هل يوجد قسم بإسم‬


...
options(section)
‫ معين‬section ‫ تحت‬options ‫للحصول على كل ال‬


...
items(section)
‫ مثل‬key, value ‫ بتشمل‬tuples ‫ مكونة من‬list ‫الحصول على‬
[('name', 'Ahmed Youssef'), ('email', 'guru
...
com')]

...
الخ الخ‬stdout ‫كتابة الملف سواء على ال‬
‫ ودى فى‬NoSectionError, ParsingError,  DuplicateSectionError, NoOptionError ‫ مثل‬Errors ‫فى مجموعة من ال‬
‫حال محاول الوصول لقسم او اختيار غير موجود او محاولة التكرار او خطأ فى معالجة الملف "كتابة بصورة غير‬

...
السكاشن -القسام- وال‬

    SECTCRE = re
...
compile( 
        r'(?P
 
  
 
   
 


greet ‫ جديد وليكن‬action ‫تعالى نجرب اضافة‬
RootController ‫ كطريقة لل‬controllers
...
templates
...
python
...
h ‫ وذلك بضم‬Python API/C ‫اول شئ بكل تأكيد هو إننا هنستخدم‬
(: Hello, World ‫ اخر
...
h ‫ملحوظة: قم بضم‬
helloMod
...
h>
 
static PyObject* hola(PyObject* self, PyObject* args)
{
    if (!PyArg_ParseTuple(args, "", NULL))
        return NULL;
    printf("Hola!");
    Py_RETURN_NONE;
}
static PyMethodDef HolaMethods[] =
{
     {"hola", hola, METH_VARARGS, "prints Hola\n"},
     {NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
inithola(void)
{
     (void) Py_InitModule("hola", HolaMethods);
}

‫نبدأ ب ‪ module‬بسيطة وهى ‪ hola‬هنشرح سطر سطر‬
‫اول نعمل ‪ include‬ل ‪ python api header‬كالتالى‬
‫>‪#include  ...
لكن لو ‪ Function‬يبقة ‪ self‬‬
‫هيكون ‪
...
hola‬‬
‫!‪Hola‬‬

‫لحظ شئ إن ال ‪ Function‬مش هتاخد اى ‪ argument‬و مش ليها ‪ return‬او ال ‪ Return‬ب ‪NONE‬‬
‫فالول نختبر هل فى ‪ arguments‬تم تمرريها لل ‪ Function‬او ل‬
‫))‪if (!PyArg_ParseTuple(args, "", NULL‬‬
‫;‪        return NULL‬‬

‫‪ PyArg_ParseTuple‬هى ‪ Function‬بتسخدم فى عمل ‪ Parse‬او تحليل لل ‪ Arguments‬وفيها بيتم تحويل ال ‪ Python‬‬
‫‪ Values‬ل ‪ C Values‬زى ماهنشوف فى مثال قادم
...
 etc‬‬
‫‪ NULL‬هنا بيعبر عن ال متغيرات اللتى هتاخد القيم اللتى تم تمرريها لل ‪- args‬هنطلع عليها اكثر فى مثال قادم-‬
‫;‪   return NULL‬‬

‫للخروج مباشرة من تنفيذ ال ‪Function‬‬
‫بعد كدا نيجى لل ال ‪ Function‬هتعمله وهو طباعة كلمة ‪ Hola‬بإستخدام ‪printf‬‬
‫;)"!‪printf("Hola‬‬

Py_RETURN_NONE ‫ فهنعمل‬Function ‫ من ال‬return ‫واخيرا زى ماقلنا اننا مش نريد ان اى‬

    Py_RETURN_NONE;

‫ وال‬name, address ‫ زى ال‬Function ‫ بتشمل معلومات عن ال‬array ‫ وهو عبارة عن‬methodTable ‫هنحتاج نعرف ال‬
‫ الخاصة بيها وهكذا‬Documentation
static PyMethodDef HolaMethods[] =
{
     {"hola", hola, METH_VARARGS, "prints Hola"},
     {NULL, NULL, 0, NULL}
};

function ‫ الخاص بال‬name ‫ هو ال‬field ‫اول‬
‫ نفسها‬function ‫التانى هو ال‬
METH_VARAGS ‫ وغالبا بنستخدم‬Python­Level Arguments ‫ اللتى هتتمرر هى‬Arguments ‫التالت بيعبر عن ان ال‬
function ‫الرابع هو الوصف الخاص بال‬
‫ ب‬Array ‫ونحجز المكان التانى فى ال‬
{NULL, NULL, 0, NULL}
‫ بتاعتنا كالتالى‬Module ‫ لل‬Initialize ‫نعمل‬
PyMODINIT_FUNC
inithola(void)
{
     (void) Py_InitModule("hola", HolaMethods);
}

Module ‫ و فيها بيتم تجهيز ال‬Python Module Initializer Function ‫ هى إختصار ل‬PyMODINIT_FUNC
2Arguments ‫ وهى اللتى بتقوم بالتجهيز بالفعل وبتاخد‬Function ‫ وهى‬Py_InitModule ‫بإستدعاء‬
Module ‫1- اسم ال‬
Methods Table ‫2- ال‬
!‫ خاصة بينا‬Module ‫جميل جدا
...
core import setup, Extension
 
modExt = Extension('hola', sources = ['hola
...
0',
        description = 'Simple demo',
        ext_modules = [modExt])

:‫الخطوات سهلة وسلسة كالتالى‬
Disutils
...
c'])
extension ‫ واسم ال‬source ‫وفيه بنحدد ال‬
‫ كالتالى‬extensions ‫ و الصدار والوصف و ال‬Package ‫ بإننا نسجل فيه إسم ال‬setup script ‫3- تجهيز ال‬

setup (name = 'HolaPackage',
        version = '1
...
py build
‫ كالتالى‬Package ‫ لل‬Install ‫وبعد كدا تعمل‬
Python setup
...
py ‫ وليكن‬Test Script ‫1- اعمل اى‬
‫ كالتالى‬hola Module ‫ ل‬import ‫2- اعمل‬
import hola

‫ كالتالى‬hola function ‫3- استدعى ال‬

hola
...
hola()
#Output:
Hola!
None 

‫ وتطبعهم و‬age ‫ و‬name ‫ ك‬argument ‫ بتقبل‬function ‫ فيها‬module ‫بعد ماطلعنا على الساسيات نجرب نكتب‬
Tuple, Dictionary ‫ ب‬return ‫ اخرى لحساب القيمة المطلقة لرقم وواحدة تقسم عددين وواحدة تعمل‬Function
:‫الفكرة بإختصار‬
Functions ‫1- نعرف ال‬
Methods Table ‫2- نضمهم لل‬
Module ‫ لل‬Initialize ‫3- نعمل‬
setup script ‫4- نجهز ال‬
Module ‫ لل‬Install ‫ و‬Build ‫5- نعمل‬
‫ مثل كالتالى‬TestScript ‫ عن طريق‬Module ‫6- نستخدم ال‬
Functions ‫1- تعريف ال‬
Hola Function ‫ال‬
static PyObject* hola(PyObject* self, PyObject* args)
{
    const char* name;
    int age;
    if (!PyArg_ParseTuple(args, "si", &name, &age))
        return NULL;
    printf("Name: %s", name);
    printf("Age: %i", age);
    Py_RETURN_NONE;
}
 if (!PyArg_ParseTuple(args, "si", &name, &age))

integer ‫ وهى‬i ‫ و‬string ‫ وهى‬s ‫ التالى‬Function ‫لحظ إننا هنا توقعنا إن هيتمرر لل‬
age ‫ و‬name ‫وقمنا بإسناد هذه القيم ل‬
‫ فيكون تعريفه كالتالى‬const ‫ فافضل تعريف إنه يكون‬name ‫ملحوظة: انت لن تقوم بالتعديل على‬
const char* name;

MyABS Function 
static PyObject* myabs(PyObject* self, PyObject* args)
{
    int number;
    if (!PyArg_ParseTuple(args, "i", &number))
        return NULL;
    
    if (number<0){
      number=­number;
    }
    return Py_BuildValue("i", number);
}

‫ وبيعبر عن الرقم‬integer ‫ وهو‬i ‫ التالى‬Function ‫لحظ اننا توقعنا إن هيتمرر لل‬
(C Value ‫ إلى‬Python Value ‫ )التحويل من‬number ‫اسندنا القيمة الى‬
 myabs Function ‫ الخاص بال‬Return Type ‫( وهو ال‬PyObject ‫ )او‬Python Value ‫ لزم يكون عبارة عن‬Return ‫ال‬
‫ ودا هيتم عن طريق إستخدام‬Python Value ‫ إلى‬C Value ‫كما لحظت، فبالتالى هنحتاج نحول من ال‬
Py_BuildValue
number ‫ وقيمته مساوية ل‬Integer ‫ وهو‬i ‫ ل‬return ‫وهنا تم تحديد إن هيتم عمل‬
holaDict Function

static PyObject* holaDict(PyObject* self, PyObject* args)
{
    const char* key;
    int value;
    if (!PyArg_ParseTuple(args, "si", &key, &value))
        return NULL;
    return Py_BuildValue("{s:i}", key, value); //Returns a Dict
...
‫ هو حاجز‬Array ‫لحظ إن آخر عنصر فى ال‬
‫ كالتالى‬Py_InitModule Function ‫ كالتالى بنستدعى فيها ال‬Module ‫ لل‬Initialize ‫3- عمل‬
PyMODINIT_FUNC
initsimplemodule(void)
{
     (void) Py_InitModule("simplemodule", SimpleModuleMethods);
}

‫ كالتالى‬Setup Script ‫4- ال‬
from distutils
...
c'])
 
setup (name = 'SimpleModPackage',
        version = '1
...
py build
python setup
...
hola("Ahmed", 18)
print sm
...
myabs(7) #7
print sm
...
holaTuple("ahmed", 999)
print sm
...
py", line 10, in 
print sm
...


ctypes
‫ -وهى مكتبة نستطيع من خللها تحديد نوع الملف من خلل‬libmagic ‫ ل‬extension ‫سنطور فى هذه الجزئية‬
foreign Function library ‫- لنستطيع استخدامها فى بايثون عن طريق ال‬magic number ‫الرقم السحرى‬
‫ وتسمح‬C ‫ وهى تقدم انواع بيانات متوافقة مع تلك الموجودة فى ال‬ctypes ‫ للختصار والمسماه ب‬FFL ‫او ال‬
‫ حول مكتبة ما‬wrapper ‫لنا بإستدعاء الدوال بالمكتبات لنستطيع استغللها كمانريد )فى الغالب ستريد تقديم‬
(‫لتستطيع استخدامها بسهولة فى بايثون‬

libmagic­dev ‫ وملفات التطوير‬libmagic ‫1- قم بتستب‬
magic
...
h>
#define
#define
#define
#define
#define
#define

...

const char *magic_file(magic_t, const char *);
const char *magic_descriptor(magic_t, int);
const char *magic_buffer(magic_t, const void *, size_t);

‫ لساحة العمل‬FFL ‫3- نستدعى ال‬
from ctypes import *

‫4- نقوم بتعريف الثوابت‬

MAGIC_NONE=0x000000 
# No flags 
MAGIC_DEBUG=0x000001 
# Turn on debugging 
MAGIC_SYMLINK=0x000002 
# Follow symlinks 
MAGIC_COMPRESS=0x000004
# Check inside compressed files 
MAGIC_DEVICES=0x000008
 
# Look at the contents of devices 
MAGIC_MIME_TYPE=0x000010
# Return only the MIME type 
MAGIC_CONTINUE=0x000020 
# Return all matches 
MAGIC_MIME_ENCODING=0x000400 
# Return only the MIME encoding 

# Defined for backwards compatibility; do nothing 
MAGIC_NO_CHECK_FORTRAN=0x000000 
# Don't check ascii/fortran 
MAGIC_NO_CHECK_TROFF=0x000000      # Don't check ascii/troff 

-loading- ‫نقوم بتحميل المكتبة‬
libmagic=CDLL("libmagic
...
util

‫سريعا حول انواع البيانات‬
ctypes type

C type

c_char

Char

c_wchar

wchar_t

c_byte

Char

c_ubyte

Unsigned char

c+short

Short

c_ushort

Unsigned short

c_int

Int

c_uint

Unsigned int

c_long

long

c_ulong

Unsigned long

c_longlong

Long long

c_ulonglong

Unsigned long long

c_float

Float

c_double

Double

c_longdouble

Long double

c_char_p

Char* (null terminated)

c_wchar_p

wchar_t* (null terminated)

c_void_p

Void*

types ‫5- نحدد ال‬
magic_t=c_void_p #void pointer
...
magic_open
magic_open
...
argtypes=[c_int]
‫تحديد المعاملت‬
char ‫ و مؤشر ل‬magic_t ‫ وبتاخد معاملت‬char ‫ بتدى ريترن بمؤشر ل‬magic_file ‫الدالة‬
const char *magic_file(magic_t, const char *);

magic_file=libmagic
...
restype=c_char_
magic_file
...
org/xmonader/libmagicbindings/
libmagic ‫ وتجد فيها ايضا مكتبات اضافية لسى شارب وباسكال لستخدام‬pymagic ‫بإسم‬
‫ على‬PCRE ‫ لمكتبة‬binding ‫ تقدر تطلع على‬ctypes ‫لمثال اكبر ومتعمق فى‬
http://bitbucket
...
هنتكلم عن وحدتى ‪ functools‬و ‪itertools‬‬
‫فى الواقع بايثون ينقصها الكثير من التحسينات لتقديم لغة وظيفية حقيقية ولكنها تسمح لك بالبرمجة بهذا‬
‫السلوب‬

functools 
reduce(function, iterable[, init])
reduce ‫ملحوظة هى هى الدالة‬
‫ لقيمة واحدة‬sequence ‫من اسمها "تقليل" الهدف منها هو تقليل‬

#reduce (func, seq[, init])
print reduce((lambda x, y: x+y), [1, 2, 3, 4, 5]) #15
#((((1+2)+3)+4)+5)

print reduce((lambda x, y: x*y), [1, 2, 3, 4, 5]) #120

partial(func, *args, **kwargs)
‫هدفها هو تغليف دالة ما ومعاملتها واعادة كائن -دالة جزئية مازالت تنتظر باقى المعاملت- يحويها هذا‬
Currying ‫المفهوم يسمى‬
>>> def sayhi(to):

...
 
  print "Visitors: "

...
       print "\t", g
>>> someparty("Ahmed")

Visitors: 
Ahmed
>>> someparty("Ahmed", "Mido")
Visitors: 
Ahmed
Mido
>>> p=partial(someparty, "Ahmed")
>>> p("Mido")
Visitors: 
Ahmed
Mido
>>> p
...
connect(btn, SIGNAL("clicked()"),

partial(self
...
anyButton ‫ -تغلف‬slot ‫ ب‬button2 ‫ للزر‬clicked ‫هنا مثل نقوم بربط الشارة‬
‫- هكذا قد تغلبنا على العملية اليس كذلك ؟‬slot ‫اللتى يتم تنفيذها عند محاولة استدعاء ال‬

‫‪itertools‬‬
‫)‪any(iterable‬‬
‫عمرك كان عندك مثل ‪ list‬من مجموعة ارقام وعايز تعرف هل فيها رقم اكبر من 3 مثل ؟‬
‫‪print any(x>3 for x in [1, 3, 4, 5, 6, 7]) #True‬‬

‫)‪all(iterable‬‬
‫عمرك كان عندك مثل ‪ list‬من مجموعة ارقام وعايز تعرف هل كلها اكبر من 3 مثل ؟‬
‫‪print all(x>3 for x in [1, 3, 4, 5, 6, 7]) #False‬‬

‫الفكرة هى ان بتنشئ ‪ list‬من ‪ True/False‬ويتم حساب الناتج عن طريقها سواء على قيمة واحدة او كل‬
‫القيم‬
‫لحظ ان هنا ال ‪ iterable‬انشئناه بإستخدام ال ‪ list comprehension‬ولو اتكلمنا عنها تانى هنختصرها ل‬
‫‪LC‬‬
‫)‪repeat(obj, times=None‬‬
‫بتقوم بعمل ‪ iterator‬يعيد نفس الكائن بعدد ‪ times‬او للبد اذا كان ‪None‬‬
‫))3 ,01(‪>>> list(repeat‬‬
‫]01 ,01 ,01[‬

‫هنلحظ ان الناتج ]01, 01, 01[ تم تكرار الكائن 01 ل 3 مرات‬
‫وهكذا‬
‫)‪takewhile(pred, seq‬‬
‫بتأخذ عناصر من ‪ seq‬كلما يتم تأكيد الشرط المؤكد ‪pred‬‬
‫))]4 ,3 ,2 ,1 ,0[ ,3<‪>>> list(takewhile(lambda x: x‬‬
‫]2 ,1 ,0[‬

dropwhile(pred, seq)
pred ‫ كلما يتم تأكيد ال‬seq ‫العكس بقة بتترك عناصر من‬
>>> list(dropwhile(lambda x: x<3, [0, 1, 2, 3, 4, 6, 7]))
[3, 4, 6, 7]

groupby(seq[, key=None])
 key function ‫ بإستخدام‬seq ‫على فرض عندنا سلسلة من العناصر وعايزين نجمع كل العناصر من‬
-lambda x: x -‫ هو العنصر‬key ‫افتراضيا ال‬
>>> list(groupby("111122233344"))
[('1',  ...
_grouper object at 0xb77ef3ec>), ('3', 
...
_grouper object at 0xb77ef42c>)]
print [list(i) for (x,i) in itertools
...
" % (thing[1], key)
    print " "

‫الناتج‬
A bear is a animal
...

A cactus is a plant
...
 
A school bus is a vehicle
...
com/questions/773/how­do­i­use­pythons­itertoolsgroupby
chain(*iters)
‫ ليعيد العناصر من اول عنصر يتم تمريره حتى ينتهى فينتقل للعنصر التالى وهكذا‬iterator ‫ينشئ‬
iters ‫او تقدر تقول بتنشئ سلسلة بين ال‬
>>> for el in chain("Hello", "World", range(3)): 

...
تعيد‬filter ‫نفس فكرة‬
>>> for x in ifilter(lambda x: x>3, [3,2, 1, 9, 8]): print x

...
على‬
‫سبيل لدينا تطبيق مدير ملفات او برنامج للنسخ الحتياطى او ‪ Real-Time indexer‬هل منطقى ان نجبر‬
‫البرنامج كل شوية انه يقرا المحتوى عشان نشوف الملفات الجديدة ؟ او اللى تم حذفها او غيره ؟ الكرنل ب‬
‫"يدفع" الحداث والبرنامج يعالج الحداث اللى تهمه‬

‫‪Watches‬‬
‫ال ‪
...
يمكن اذا ربنا ادانا العمر نتكلم عن ‪ inotify‬مباشرة‬

‫‪Events‬‬
‫تقدر توصل للحداث هنا‬
‫‪http://seb
...
org/swp/pages/pyinotify
...
WatchManger‬وهكذا بدل من استيراد الكل من ‪pyinotify‬‬
‫بننشئ ال ‪ WatchManager‬ليدير كل العناصر المراقبة‬
‫‪ mask‬بنحدد فيه الحداث اللى مهتمين فيها‬

‫)(‪wm=WatchManager‬‬

...

‫ثم بننشئ ال ‪) inotify‬بمدير العناصر المراقبة و كائن من صف خاص بمعالجة الحداث اللتى نريدها (ونضيف‬
‫المسار المطلوب مراقبة الحداث عليه ونحدد ال ‪ mask‬ونجعل ‪ rec=True‬لمراقبة الحداث بما فى اسفله‬

p=PDir()
notifier=Notifier(wm, p)
#add a watch
...
add_watch("/home/striky/Desktop", mask, rec=True)

‫ونبدأ حلقة المعالجة‬
notifier
...
ProcessEvent ‫بإختصار هو صف عرفنا فيه معالجات خاصة بالحداث دى بيورث‬
class PDir(ProcessEvent):
def my_init(self, **kwargs):
self
...
pathname
def process_IN_CREATE(self, event):
print "Create: %s"%event
...
pathname
self
...
cookie]=event
...
pathname
print " WAS MOVED FROM: ", self
...
cookie]

Event
‫ وله صفات منها‬Event ‫ فى اى من معالجات الحدث هو كائن من الصف‬event ‫الصف مباشر جدا
...
وهنا استخدمنا ال‬
‫ للربط بينهم‬mv_cookies
‫المثال كامل‬
import os
from pyinotify import *
wm=WatchManager()
mask=IN_DELETE | IN_CREATE | IN_MOVED_FROM | IN_MOVED_TO #to watch
...
use
...

def fullname(event):
return os
...
join(event
...
name)
class PDir(ProcessEvent):
def my_init(self, **kwargs):
self
...
pathname
def process_IN_CREATE(self, event):
print "Create: %s"%event
...
pathname
self
...
cookie]=event
...
pathname
print " WAS MOVED FROM: ", self
...
cookie] #same unique number
#notifier
p=PDir()
notifier=Notifier(wm, p)
#add a watch
...
add_watch("/home/striky/Desktop", mask, rec=True)
notifier
...
dbzteam
...
html

Chapter 17 (GUI)
PyGTK
GTK ‫هنتناول فى الجزئية دى مقدمة فى‬

‫ -نافذة-مشابهه لدى ونخليها متسنتره )فى منتصف الشاشة ( اول ماتنشئ‬window ‫نريد ان نعمل‬
gtk ‫1- استدعى ال‬
import gtk
gtk ‫ يورث ال‬class ‫2-انشئ‬
class Window(gtk
...
__init__(gtk
...
__init_comp()

self
...
show_all
‫ وهنا مش فى غيرها بس اتعود تستخدمها‬Window ‫ داخل ال‬components ‫ بتعرض كل ال‬show_all ‫الطريقة‬
‫لنك هتبقة تحط ويدجتس كتير جواها‬

...
set_title("Hello, World!")
self
...
WIN_POS_CENTER)


...
set_position(pos)
‫بتستخدم هنا لتحديد ال مكان الخاص بالنافذة‬
‫وليها عدة قيم زى‬
gtk
...
WIN_POS_CENTER_ALWAYS
size‫هيتم سنترتها عند اى تغيير فى ال‬
gtk
...
set_size_request(h,w)
‫لتحديد ارتفاع وعرض النافذة‬

if __name__=="__main__":
w=Window()
gtk
...
Window):
def __init__(self):
super(Window, self)
...
WINDOW_TOPLEVEL)
self
...
show_all()
def __init_comp(self):
self
...
set_border_width(20)
self
...
WIN_POS_CENTER)
btn=gtk
...
add(btn)

button ‫التعريف العام لل‬
button = gtk
...
set_border_width(width)

‫ دا‬button ‫نريد ان يظهر مسج لطيفة كلمانضغط على ال‬

def __on_btn_clicked(self, widget, data):
md=gtk
...
DIALOG_DESTROY_WITH_PARENT,
gtk
...
BUTTONS_OK, "Hi!")
print widget
print data
md
...
destroy()

‫ يعنى طريقة هيتم تنفيذها عند حدوث شئ معين زى الضغط على‬callback ‫دى اسمها‬
MessageDialog ‫نيجى لل‬
parent ‫اول معامل هو ال‬
‫تانى معامل فيه خصائص الديالوج‬
gtk
...
DIALOG_DESTROY_WITH_PARENT
parent ‫هيتقفل فى حال قفل ال‬
gtk
...
MESSAGE_INFO‬‬
‫معلومة‬
‫‪gtk
...
MESSAGE_QUESTION‬‬
‫سؤال‬
‫‪gtk
...
connect("clicked", self
...
Button object (GtkButton) at 0xb803f‬‬
‫‪None‬‬

‫ال ‪ widget‬دا ال ‪ button‬فى مثالنا‬
‫ال ‪ data‬هى ال ‪ None‬تقدر طبعا تستبدلها بأى حاجة المهم انها تكون شئ هيفيدك
...


‫‪Clicks‬‬

‫لحظ ان النافذة متقسمة لجزئين راسي اول جزء فيه ‪ button‬والتانى فيه ‪ label‬بيتكتب عليه عدد مرات الضغط‬
‫على ال ‪button‬‬
‫احنا ممكن نكتبها بالطريقة المعتادة وممكن نكتبها بطريقة كتير افضل بإستخدام ال ‪OOP‬‬
‫تمام الول عشان نخليهم متقسمين فى شكل معين افقى او رأسى بنستخدم ‪) Hbox‬اختصار ل ‪( Horizontal Box‬‬
‫او ‪) Vbox‬اختصار ل ‪ (Vertical Box‬تمام ؟ قشطة‬

‫ال ‪ vertical box‬بياخد ال ‪ widgets‬او بوكسز تانية فى صورة ‪ rows‬صفوف -صندوق رأسى-‬

‫ال ‪ horizontal box‬بياخد ال ‪ widgets‬او البوكسز التانى فى صورة ‪ Columns‬عواميد -صندوق افقى-‬

‫لنشاء ‪ box‬بتبدأ اول ب ‪ homogeneous‬ودى معناها هل كل الجزء متساوية فى العرض او الطول ليها ترجمة بإسم‬
‫متجانسة اعتقد مناسبة ؟ والمعامل التانى لتحديد عرض الفاصل‬
‫)2 ,‪     vbox=gtk
...
Table( rows, columns, homogeneous‬‬

‫عدد الصفوف وعدد العمدة وهل متجانسين او ل‬
‫لضافة ‪ child‬بإستخدام ال ‪attach method‬‬
‫,‪
...
FILL‬لو الحدول اكبر من الويدجت فالويدجت هيتمدد ليشغل المساحة‬
‫‪: gtk
...
SHRINK‬اذا تم تصغير المساحة المتاحة للويدجت "مع تصغير الجدول مثل" هيتم تصغيره‬
‫‪ :yoptions‬الختيارات ل ‪ y‬مشابهه ل ‪x‬‬

‫‪ :xpadding‬الهامش من ناحية ال ‪x‬‬
‫‪ :ypadding‬الهامش من ناحية ال ‪y‬‬
‫لو انت مرضى مع الخيارات الساسية تقدر تستخدم ‪attach_defaults‬‬
‫,‪attach_defaults( child, left_attach, right_attach, top_attach‬‬
‫) ‪bottom_attach‬‬
‫ودى هتخليك تدخل ال ‪ left, right, top, bottom attach‬فقط والباقى هيكون بالفتراضى لل ‪x,y options‬‬
‫‪gtk
...
EXPAND‬‬
‫وال ‪ x,y padding‬هيكون 0‬
‫فين ال ‪ fixed‬؟ موجود ‪ fixed‬لعرض ال ويدجتس بتحديد ال مكان على الفورم ولكن "استخدام السابق افضل من‬
‫حيث حماية طريقة وضعك لل ويدجتس من حيث التمدد والنكماش وكدا"‬
‫تعالى نعمل مثال ‪ clicks‬بصورة واضحة‬

‫التصميم‬

‫المستطيل الحمر الكبير عبارة عن ‪Vbox‬‬
‫وجواه صفين الصف الول فيه ‪ button‬والتانى فيه ‪label‬‬
‫الول عندنا متغير __‪ clicks‬بيعبر عن عدد الضغطات‬
‫:)‪class Window(gtk
...
__init__(gtk
...
__init_comp‬‬
‫0=‪self
...
show_all()
def getClicks(self):
return self
...
__clicks = value
def delClicks(self):
del self
...
set_title("Hello, World!")
self
...
WIN_POS_CENTER)
self
...
VBox(False, 0)

button, label ‫ عشان نضم فيه‬Vertical Box ‫بننشئ‬

btnclicks=gtk
...
Label("Clicks: ")

!Click Me ‫ مكتوب عليه‬Button ‫بننشئ ال‬
:Clicks ‫ مكتوب عليه‬Label ‫بننشئ‬

mvbox
...
pack_start(lbl, True, True, 0)

self
...
connect("clicked", self
...
__clicks += 1

print widget, lblclicks, data
lblclicks
...
__clicks))
signal ‫ لل‬receiver ‫ بيعبر عن ال‬widget ‫المعامل الول‬
‫ اللذى نريد ان نغيره‬label ‫ بيعبر عن ال‬lblclicks ‫التانى ال‬
‫ بيعبر عن اى داتا اضافية‬data ‫التالت ال‬
lblclicks‫ ونعدل ال تكست على ال‬clicks__ ‫كل اللى هيحصل اننا هنزود عدد ال‬
‫بإستخدام‬

...
ToggleButton(label=None)
False ‫ او‬True ‫ ودا ليه حالتين‬check box ‫مشابه لل‬

False ‫هنا وهو مش متنشط يعنى‬

active ‫هنا هو متنشط يعنى‬
toggled signal ‫اول مايضغط عليه بيرسل‬
import gtk
class Window(gtk
...
__init__(gtk
...
__init_comp()

self
...
set_title("Hello, World!")
self
...
WIN_POS_CENTER)
mvbox=gtk
...
ToggleButton("Show Title")
togbtn
...
connect("toggled", self
...
pack_start(togbtn, True, True, 2)

self
...
title
...
set_title(" ")
else:
self
...
main()

CheckButton

‫الصورة العامة لنشاءه‬

check_button = gtk
...
Window):
def __init__(self):

super(Window, self)
...
WINDOW_TOPLEVEL)
self
...
show_all()
def __init_comp(self):
self
...
set_position(gtk
...
VBox(False, 0)
chkbtn=gtk
...
set_active(True)
chkbtn
...
__on_toggled)
mvbox
...
add(mvbox)
def __on_toggled(self, widget):
if self
...
strip():
self
...
set_title("Hello, World!")

if __name__=="__main__":
w=Window()
gtk
...
RadioButton(group=None, label=None)

‫ وبعد‬radio button ‫ لول‬None ‫ دى عشان يشتغل بصورة سليمة فبكل بساطة خليها‬group ‫لزم تظبط ال‬
!‫ اللذي انشئ اول واحد‬radio button ‫كدا خليها ال‬
‫هننشئ حاجة مشابهه لدى‬

‫التصميم‬

button ‫ و‬Horizontal Separator ‫ وفيها‬radio buttons 2 ‫النافذة فيها‬
class Window(gtk
...
__init__(gtk
...
__init_comp()
self
...
show_all()
def __init_comp(self):
self
...
set_position(gtk
...
set_border_width(12)
mvbox=gtk
...
RadioButton(None, "Male")
rd1
...
connect("toggled",self
...
RadioButton(rd1, "Female")
rd2
...
__on_radio_toggled, "Female")
mvbox
...
pack_start(rd2, False, False, 2)

mvbox
...
HSeparator(), True, True, 0)
btninfo=gtk
...
connect("clicked", self
...
pack_start(btninfo, False, False, 3)
self
...
gender=data
def __on_btninfo_clicked(self, w):
md=gtk
...
DIALOG_DESTROY_WITH_PARENT,
gtk
...
BUTTONS_OK, self
...
run()
md
...
pack_start(gtk
...
‫ افتراضيا‬true ‫- هى‬digits/set_digits 
‫لتحديد عدد الرقام بعد العلمة العشرية المرغوب فى ظهورها‬
set_value_pos(pos)
‫ ودى بتاخد القيم‬value ‫تقدر تستخدمهم لتحديد المكان اللذى سيظهر عليه قيمة ال‬

gtk
...
POS_RIGHT
gtk
...
POS_BOTTOM

‫مثل لعمل المثال دا هننشئه كالتالى‬
class Window(gtk
...
__init__(gtk
...
__init_comp()

self
...
set_title("Hello, World!")
self
...
WIN_POS_CENTER)
self
...
Adjustment(5,1, 101)
hscale=gtk
...
set_digits(0)
mvbox=gtk
...
pack_start(hscale, True, True, 0)
mvbox
...
HSeparator(), True, True, 0)

‫)‪self
...
UPDATE_CONTINUOUS‬‬
‫بترسل عند حدوث اقل تغيير ممكن فى ال ‪range‬‬
‫‪gtk
...
UPDATE_DELAYED‬‬
‫بترسل بمجرد ان المستخدم يترك الماوس او يتوقف عن الحركة لفترة صغيرة وبيتم التحكم فى ال ‪ policy‬من‬
‫خلل‬
‫)‪
...
‪get_adjustment‬‬
‫لتعديل ال ‪ adjustment‬استخدم‬
‫)‪
...
Window):
def __init__(self):
super(Window, self)
...
WINDOW_TOPLEVEL)
self
...
show_all()
def __init_comp(self):
self
...
set_position(gtk
...
set_border_width(12)
adj=gtk
...
HScale(adj)
hscale
...
VScale(adj)
vscale
...
VBox(False, 0)
mvbox
...
pack_start(vscale, True, True, 2)

self
...
set_digits(num)
(0 ‫بتحدد عدد الرقام المطلوبة بعد العلمة)خليناها‬

‫ نريد ان نربطهم ان لما يتغير قيمة اى منهم يتعدل فى التانية‬SpinButton ‫و‬Scale ‫نيجى لمثال تانى هنا عندنا‬
‫ اللذى‬model ‫ فيها للتنين )بما انها ال‬value ‫ للتنين بحيث ان يتعدل قيمة ال‬adjustment object ‫هنا هنستخدم ال‬
(Scale, SpinButton ‫يعرضه كل من ال‬
‫كود المثال‬

class Window(gtk
...
__init__(gtk
...
__init_comp()

self
...
set_title("Hello, World!")
self
...
WIN_POS_CENTER)
self
...
Adjustment(5,1, 101)
hscale=gtk
...
set_digits(0)
spin=gtk
...
set_digits(0)
mvbox=gtk
...
pack_start(hscale, True, True, 0)
mvbox
...
pack_start(gtk
...
add(mvbox)

Label/Entry

‫ بيستخدم لعرض تكست ما بدون الحاجة لتغييره من المستخدم‬Label ‫ال‬

...
Window):
def __init__(self):
super(Window, self)
...
WINDOW_TOPLEVEL)
self
...
show_all()
def __init_comp(self):
self
...
set_position(gtk
...
set_border_width(12)
mvbox=gtk
...
Label("Name:")
nameentry=gtk
...
HBox(False, 0)
hbox
...
pack_start(nameentry, True, True, 4)

mvbox
...
pack_start(gtk
...
Button("OK!")
btnok
...
__on_btnok_clicked , nameentry)
mvbox
...
add(mvbox)
def __on_btnok_clicked(self, w,e, data=None):
print e
...
set_text(newtext)

...
select_region(_from,_to)

...
set_editable(bool)

text ‫لتغيير ال‬
from_ ‫ من عند نقطة ال‬text ‫بتضيف‬
to_ ‫ وتنتهى ب‬from_ ‫بتظلل منطقة معينة تبدأ من‬
entry ‫بتحدد بيها اقصى عدد حروف لل‬
‫هل يقدر المستخدم يعدل فيها؟‬

Label:

...
get_text()

...
set_line_wrap(bool)

...
Arrow

text ‫تعديل ال‬
text ‫اعادة ال‬
‫بتاخد قيم كالتالى‬

‫ السطور او ل؟‬wrap ‫هل ي‬
markup ‫تخزين‬

(‫بيستخدم ليشير الى اتجاه ما لبرنامج )بوضع رأس السهم‬

arrow = gtk
...
set(arrow_type, shadow_type)

‫ بتعبر عن نوع السهم اعلى ، اسفل ، يمين ، يسار‬arrow_type
ARROW_UP
ARROW_DOWN
ARROW_LEFT
ARROW_RIGHT

shadow ‫ بتحدد نوع ال‬shadow_type ‫و‬
SHADOW_IN
SHADOW_OUT
# the default
SHADOW_ETCHED_IN
SHADOW_ETCHED_OUT

‫مثال‬
# Create an Arrow widget with the specified parameters
# and pack it into a button
def create_arrow_button(arrow_type, shadow_type):
button = gtk
...
Arrow(arrow_type, shadow_type);
button
...
show()
arrow
...
Window(gtk
...
set_title("Arrow Buttons")
# It's a good idea to do this for all windows
...
connect("destroy", lambda x: gtk
...

window
...
HBox(False, 0)
box
...
add(box)
# Pack and show all our widgets
box
...
ARROW_UP, gtk
...
pack_start(button, False, False, 3)
button = create_arrow_button(gtk
...
SHADOW_OUT)
box
...
ARROW_LEFT, gtk
...
pack_start(button, False, False, 3)
button = create_arrow_button(gtk
...
SHADOW_ETCHED_OUT)
box
...
show()

‫فى الدالة‬
# and pack it into a button
def create_arrow_button(arrow_type, shadow_type):
button = gtk
...
Arrow(arrow_type, shadow_type);
button
...
show()
arrow
...
Tooltips

(‫ )نص مساعد على الويدجت‬tooltip ‫بتستخدم لتحديد ال‬
‫تنشئ كالتالى‬

tooltips = gtk
...
set_tip(widget, tip_text)

‫ له‬tip ‫ هو الويدجت المطلوب تحديد ال‬widget
‫ النص‬tip_text

create_arrow_button ‫فقط قم بإضافة ال‬
class Tooltips:
def __init__(self):
# Create a new window
window = gtk
...
WINDOW_TOPLEVEL)
window
...

window
...
main_quit())
# Sets the border width of the window
...
set_border_width(10)
# Create a box to hold the arrows/buttons
box = gtk
...
set_border_width(2)
window
...
tooltips = gtk
...
show()
button = create_arrow_button(gtk
...
SHADOW_IN)
box
...
tooltips
...
ARROW_DOWN, gtk
...
pack_start(button, False, False, 3)

self
...
set_tip(button, "SHADOW_OUT")
button = create_arrow_button(gtk
...
SHADOW_ETCHED_IN)
box
...
tooltips
...
ARROW_RIGHT,
gtk
...
pack_start(button, False, False, 3)
self
...
set_tip(button, "SHADOW_ETCHED_OUT")
window
...
ProgressBar

‫هو ويدجت يستخدم لعرض تقرير عن الحالة‬

‫لنشاءه‬
progressbar = gtk
...
set_fraction(fraction)

‫ وهى الكم المنتهى‬fraction ‫لتحديد ال‬

...
get_text()
progressbar ‫للحصول على النص الظاهر على ال‬

...
pulse()
progressbar ‫لتشير حدوث تغيير فى ال‬
def progress_timeout(pbobj):
if pbobj
...
get_active():
pbobj
...
pulse()
else:
# Calculate the value of the progress bar using the
# value range set in the adjustment object
new_val = pbobj
...
get_fraction() + 0
...
0:
new_val = 0
...
pbar
...
activity_check
...
filepath=p
fileobj=file(p, "r")
self
...
read()
fileobj
...
txt
...
txt
...
txt)
else:
return len(self
...
get_nwords()
def get_info_as_markup(self, spaces=True):
s="""
Lines: %s line(s)
...

Chars: %s char(s)
...
get_nlines(), self
...
get_nchars(spaces))
return s

‫التصميم‬

‫الكود‬
class Window(gtk
...
__init__(gtk
...
__init_comp()
self
...
show_all()
def __init_comp(self):
self
...
set_position(gtk
...
set_border_width(12)
mvbox=gtk
...
Button("File")
btnfile
...
select_file)
self
...
Entry()
self
...
set_editable(False)
hbox=gtk
...
pack_start(btnfile, True, True, 2)
hbox
...
fileentry, True, True, 1)
mvbox
...
pack_start(gtk
...
lblinfo=gtk
...
pack_start(self
...
add(mvbox)

‫ المعرفة‬select_file callback ‫ ب‬btnfile ‫ الخاصة بال‬clicked signal ‫هنربط ال‬
‫كالتالى‬
def select_file(self,w):
sel = gtk
...
",
self,
gtk
...
STOCK_CANCEL,
gtk
...
STOCK_OPEN, gtk
...
set_default_response(gtk
...
run()
if res==gtk
...
wc
...
get_filename())
self
...
set_text(sel
...
lblinfo
...
wc
...
destroy()

‫ )لختيار الملفات او الفولدرات( ونحدد العنوان بال‬FilechooserDialog ‫هنا بننشئ كائن من ال‬
constructor
‫ لفتح الملفات وليست للحفظ( وانواع ردود‬ACTION_OPEN) ‫واخبرناه بعنوان النافذة ،ونوع فعلها‬
stocks ‫ وايضا ال‬OK, CANCEL ‫الفعل العائدة منها وهى‬

sel = gtk
...
FILE_CHOOSER_ACTION_OPEN,
(gtk
...
RESPONSE_CANCEL,
gtk
...
RESPONSE_OK)
)

‫يتم تدمير ال ‪ sel‬ويتم تحدد اسم الفايل الخاص بال ‪WordCounter object‬‬
‫نعدل التكست على ال ‪ fileentry‬لسم الفايل‬
‫اخيرا نضع ال ‪ markup‬الناتج من ال ‪ wc
...
ComboBox

‫قائمة منسدلة بتشمل مجموعة من الختيارات ، فى مثالنا هنا مجموعة من اسماء التوزيعات‬

class Window(gtk
...
__init__()
self
...
show_all()
def __init_comp(self):

self
...
VBox(False, 2)
entries = ["Slackware", "Ubuntu", "Mandriva", "Debian"]
cbo=gtk
...
append_text, entries)
cbo
...
_on_cboselection_changed)
self
...
pack_start(cbo, False, False)

self
...
vbox)
def _on_cboselection_changed(self, widget, *args):
print widget
...
Window):

def __init__(self):
super(Window, self)
...
__init_comp() #prepare components

self
...
vbox=gtk
...
MenuBar()
self
...
pack_start(mbar, False, False, 2)

self
...
main_quit())
file_item=gtk
...
Menu()
file_item
...
MenuItem("Open")
save_item = gtk
...
MenuItem("Quit")
map(fmenu
...
connect("activate", self
...
connect("activate", self
...
connect("activate", self
...
append(file_item)

self
...
vbox)

‫خطوات متتالية لنشاءا القوائم‬
‫ وإضافته للصندوق الرأسى‬MenuBar ‫1- شريط القوائم من الصف‬
mbar=gtk
...
vbox
...
MenuItem("File")

Menu ‫3- القائمة من الصف‬
fmenu=gtk
...
set_submenu(fmenu)

append ‫5- إنشاء عناصر القائمة وإضافتهم بإستخدام الطريقة‬
open_item = gtk
...
MenuItem("Save")
quit_item = gtk
...
append, [open_item,save_item, gtk
...
connect("activate", self
...
connect("activate", self
...
connect("activate", self
...
append(file_item‬‬

‫يوجد طريقة اسهل وهى بإستخدام ال ‪ UIManager‬توفر عليك الكثير من الكتابة‬

Gladizer
‫ وبدون الحاجة لكتابة الكثير من الكواد فيما يتعلق بشكل‬glade ‫تقدر تصمم واجهات ممتازة بإستخدام‬
‫ لتعلم بايثون عنها شئ‬XML ‫ الواجهة الممثلة بصورة‬glade
...
تستطيع القيام بذلك يدويا، او بإستخدام‬
hello
...
0" encoding="UTF-8" standalone="no"?>
...
dtd">









‫ ليقوم بالربط‬gladizer ‫استدعى‬
striky@striky­desktop:~/Desktop$ gladizer
...
glade ­p Python > hello
...
py 

‫تصفح الكود الناتج من جلديزر ستجده مشابه للتالى‬
#!bin/python 
##CODE GENERATED by gladizer 1
...
require('2
...
glade 
class MainWindow(object): 
def __init__(self): 
    
#Widget tree
...
wTree=gtk
...
XML('hello
...
 
self
...
signal_autoconnect(self) 
self
...
wTree
...
_window1
...
window1
...
main() 
if __name__ == "__main__": 
    main() 
(: ‫ كما تحب‬callbacks ‫وبعد ذلك قم بإضافة ال‬

gladizerguitk ‫ بواجهة رسومية من خلل‬gladizer ‫تستطيع ايضا استخدام‬

gladizer ‫صفحة‬

/http://sourceforge
...
org/pygtk2tutorial/index
...
‫ الرائع‬GTK ‫وهذا الفصل ليس إل مقدمة لعالم‬

Rad with Glade (Gqamoos)

‫ مع‬wordlist ‫ لنشاء برنامج قاموس يعتمد على‬Gladizer ‫ و‬PyGTK ‫ مع‬Glade ‫هنشرح مثال على كيفية استخدام‬
‫عرب ايز‬
wordlist ‫1- حمل ال‬
http://www
...
org/project
...
py ‫ ليكون الخرج هو‬gqamoos
...
py ­­file gqamoos
...
py
gladizerguitk
...
2
import pygtk
pygtk
...
0')
import gtk, gtk
...

self
...
glade
...
glade')
#connect signals and handlers
...
wTree
...
_window1=self
...
get_widget('window1')
self
...
wTree
...
_hbox1=self
...
get_widget('hbox1')
self
...
wTree
...
_btnAbout=self
...
get_widget('btnAbout')

self
...
wTree
...
_window1
...
window1
...
main()
if __name__ == "__main__":
main()

wordlist ‫ للبحث فى ال‬looker service ‫وذلك بإضافة ال‬
import looker
gobject ‫ بإضافة ال‬TYPE_STRING ‫ مثل‬gobject ‫وإضافة الوصول لنواع البيانات الخاصة ب‬
import gobject
looker
...
_wc=looker
...
_init_tv()
‫ معرفة كالتالى‬init_tv_ ‫الطريقة‬

def _init_tv(self):
encell=gtk
...
TreeViewColumn("English", encell, text=0)
arcell=gtk
...
TreeViewColumn("Arabic", arcell, text=1)
map(self
...
append_column,[encol, arcol])

‫ وهم من النوع‬encol, arcol ‫ باسماء العمدة ونوعهم وإضافتهم وذلك من خلل اضافة العمدة‬TreeView ‫سيتم ال‬
‫ ويأخذون معاملت كالتالى‬gtk
...
ListStore(gobject
...
TYPE_STRING)
self
...
searchKey=self
...
get_text()
for row in self
...
lookup():
iter=lstore
...
TYPE_STRING ‫ بدل من‬str ‫هنا نقوم بتحديد نوع البيانات المخزنة
...
_wc ‫لل‬
store ‫ ونقوم بإعادة ذلك ال‬list ‫ فى داخل‬lstore
...
_tvResult
...
_get_model())
”TreeView ‫ “ال‬tvResult ‫ الخاصة بال‬set_model ‫ بإستخدام الطريقة‬model ‫نقوم بتحديد ال‬
‫ للزر‬clicked signal ‫ المسئولة عن معالجة ال‬on_btnAbout_clicked ‫تحديد رسالة حول البرنامج قم بتعديل ال‬
btnAbout
def on_btnAbout_clicked(self, widget, *args):
md=gtk
...
_window1,
gtk
...
MESSAGE_INFO, gtk
...
set_title("About GQamoos")
md
...
destroy()

‫قم بتشغيل البرنامج‬

‫ستلحظ اننا لم نحدد عنوان النافذة
...
_window‬او من‬
‫خلل ملف ‪glade‬‬
‫بتعديل ‪ Title‬لل 1‪ window‬إلى ‪Gqamoos‬‬

‫الكود النهائى‬
#!bin/python
##CODE GENERATED by gladizer 1
...
require('2
...
glade
class MainWindow(object):
def __init__(self):
#Widget tree
...
wTree=gtk
...
XML('gqamoos
...

self
...
signal_autoconnect(self)

self
...
wTree
...
_vbox1=self
...
get_widget('vbox1')
self
...
wTree
...
_entryKey=self
...
get_widget('entryKey')
self
...
wTree
...
_tvResult=self
...
get_widget('tvResult')
self
...
show()
self
...
WordsListLooker()
self
...
CellRendererText()
encol=gtk
...
CellRendererText()
arcol=gtk
...
_tvResult
...
ListStore(str, str) #gobject
...
TYPE_STRING
self
...
searchKey=self
...
get_text()
for row in self
...
lookup():
iter=lstore
...
_tvResult
...
_get_model())
def on_btnAbout_clicked(self, widget, *args):
md=gtk
...
_window1,
gtk
...
MESSAGE_INFO, gtk
...
set_title("About GQamoos")
md
...
destroy()
#pass
# run main loop
def main():
mainwindow = MainWindow()
#mainwindow
...
show()
gtk
...
__init__(self, master) 
         self
...
_outputfile=StringVar() 
         self
...
_init_comps()

‫)( اللذى سنقوم بربطه بال مسارات‬StringVar ‫ من الصف‬objects ‫ هم‬self
...
_outputfile ‫لحظ ال‬
‫المطلوبة‬
‫ لنشاء الواجهة اللتى ذكرناها بالعلى‬init_comps_ ‫استدعاءنا للطريقة‬
get, set ‫ويتم التعامل مع القيمة المخزنة بإستخدام الطرق‬

    def _init_comps(self): 
        inp=Button(self, text="Input", command=self
...
grid(row=0, sticky=W+N) 
        self
...
_inputfile) 
        self
...
grid(row=0, column=1, sticky=E) 
        out=Button(self, text="Output", command=self
...
grid(row=1, sticky=W+N) 
        self
...
_outputfile) 
        self
...
grid(row=1, column=1, sticky=E) 
        Label(self, text="Plugins:")
...
 
        self
...
lbplugins
...
lbplugins
...
lbplugins
...
_gladize)
...
grid()
Button ‫لنشاء زر من الصف‬
        inp=Button(self, text="Input", command=self
...
inpentry=Entry(self, textvariable=self
...
_inputfile ‫ بالمتغير‬textvariable ‫لحظ ربطنا لل‬
Listbox ‫لنشاء ال‬
        self
...
الخ‬
       self
...
grid(row=2, column=1, columnspan=3, sticky=E+S) 
‫ وتأخذ اول معامل المركز الذى سيتم الدخال عنده والثانى هو القيمة‬insert ‫نضيف العناصر لها بإستخدام الطريقة‬
‫المدخلة‬
        if len(getplugins())>=1: 
            for plugin in getplugins(): 
                self
...
insert(0, plugin) 
‫ اللتى تأخذ معامل قيمته المركز‬select_set ‫نحدد الختيار الفتراضى بإستخدام الطريقة‬
        self
...
select_set(0)
‫(لجعلها غائصة‬SUNKEN ‫ )اللتى جعلنا قيمتها‬relief ‫تأخذ عدة معاملت مثل الرتفاع ونوع الختيار ولحظ ايضا‬
input, output ‫ للزرين‬callbacks ‫ال‬
    def _getinputfile(self, *args): 
        self
...
set(tfd
...
inpentry
...
inpentry
...
_inputfile) 
    def _getoutputfile(self, *args): 
        self
...
set(tfd
...
outentry
...
outentry
...
_outputfile)
(‫ الدوال اللزمة للتعامل مع الملفات )اختيار ملف مثل‬tkFileDialog ‫تقدم لنا الوحدة‬
‫)( للحصول على مسار الملف المطلوب فتحه ونخزن قيمته بإستخدام‬tfd
...
asksaveasfilename ‫وبنفس الكيفية نحصل على مسار ملف الحفظ بإستخدام‬
showerror, showinfo,
...
showerror("Error", msg‬‬
‫لعرض رسالة خطأ ‪showerror‬‬
‫))(‪  tmd
...
_outputfile
...
mainloop()         #Entering the mainloop‬‬
‫ :"__‪if __name__=="__main‬‬
‫ )(‪    main‬‬

‫اخيرا نعرض النافذة وندخل التطبيق‬
‫ ‪    root=Tk()               #Master‬‬
‫‪    gw=GladizerWindow(root) #GladizerWindow‬‬
‫ونبدأ دائرة الحداث بإستخدام الطريقة ‪mainloop‬‬
‫ ‪    root
...
2 ‪ Python‬وربما فى التحديث القادم يتم وضع اهم التغييرات‬
‫تستطيع الطلع عليها من هنا‬
‫‪http://docs
...
org/3
...
0
...
 etc‬وايضا كيفية انشاء‬
‫واجهات ) استخدام ‪ GTK‬و ‪( Glade‬وايضا تعلمت قدرا جيدا من اساسيات انشاء تطبيقات الشبكات‬
‫تم توفير الكثير من المصادر حول بايثون وانشاء التطبيقات الرسومية منها‬
‫‪Mono IronPython WinForms Tutorial‬‬
‫ ‪PyGTK Tutorial‬‬
‫-للتعامل مع 4‪ PyQt‬قم بفتح الملف المرفق مع الكتاب اللذي يشمل ترجمة الدورة الشهيرة من ‪ ZetCode‬فى‬‫استخدام 4‪ PyQt‬وايضا لغنى عن المثلة المرفقة مع حزمة 4‪
...
org/wiki/doku
...
org/doc‬‬

‫مصادر اخرى‬
‫ارشح لك الكتب التالية لستمرار المشوار‬

‫كتاب اقل مايقال عنه انه ممتاز يحقق لك الرسوخ فى اللغة بطريقة لتتخيلها‬

‫ ‪Learning Python 3rd‬‬

‫‪Programming Python, 3rd Edition‬‬

‫الجزء الثانى )المتقدم( ل ‪Learning Python 3rd‬‬
‫يتناول برمجة النظام الملفات والخيوط والعمليات وايضا الواجهات الرسومية بإستخدام ‪ tKInter‬وعدة‬
‫تطبيقات مكتملة كمحرر نصوص ومستعرض صور ولعبة وغيره وجزئية متعمقة فى الشبكات من ناحية‬
‫ال ‪ client side‬وال ‪ server side‬وبعض التعرض لهياكل البيانات ومعالجة النصوص والكثير‬

‫‪Core Python Programming, 2nd‬‬
‫بإختصار هو الكتاب الفضل فى رأيى كمرحلة تانية لكتاب ‪ Learning Python‬او تكملة ل ‪ Programming‬‬
‫‪ Python 3rd‬يناقش الكثير والكثير من الموضوعات البايثونية بدرجة متعمقة‬
‫كتاب سيجعلك مبرمج بايثون افضل للبد‬

‫‪Foundations of Agile Python Development‬‬

‫‪Foundations of Python Network Programming‬‬
‫اذا حبيت ابدا برمجة الشبكات فذلك الكتاب هو اختيارك الول ليس خاص بالشبكات فقط ولكن ايضا‬
‫ببعض الجزاء عن الويب وتعدد المهام والويب سرفسز وايضا جزئيات متعلقة ب ‪POP, IMAP, SMTP‬‬

‫ ‪Wrox Beginning Python‬‬
‫كتاب رائع ياخذك للناحية العملية وانشاء تطبيقات مفيدة واهتمام مكثف بال ‪ XML‬وال ‪ Networking‬‬
‫ولكن لتأخذه للستفادة من الساسيات فكتاب ‪ Learning Python‬افضل كثيرا فى هذه الجزئية‬
‫‪Twisted Network Programming Essentials‬‬
‫الكتاب الوحيد اللذى يغطى ‪ twisted‬بتعمق )هو حلك الفضل لكتابة تطبيقات شبكات امنة وعالية الجودة‬
‫بإستخدام ‪( twisted‬‬
‫‪Manning wxPython in Action‬‬
‫الكتاب الخاص ب ‪ wxPython‬ومقسم لمقدمة عن ‪ wxPython‬ومميزاتها والمخطط الساسى واساسيات‬
‫انشاء الوجهات واستخدام متقدم كالطباعة وبعض الويدجات المتقدمة‬
‫الكتاب والمثلة اللتى تأتى مع الوثائق هم خيارك الول لعالم ‪ wxPython‬الرائع‬
‫‪Rapid GUI Programming with Python and Qt‬‬

‫الكتاب رقم 1 للتعامل مع ‪ Python, Qt‬مقسم ايضا لعدة اجزاء الساسيات كمقدمة عامة وبعض التطبيقات‬
‫الخفيفة وايضا استخدام ‪ Qt Designer‬واساسيات استخدام المخططات وقواعد البيانات والطباعة والحداث الخ‬
‫الخ واستخدام متقدم كتعدد الخيوط‬

‫لتنس قسم المقالت الخاص ب ‪Programming­Fr34ks‬‬
‫/21­‪http://programming­fr34ks
...
py2exe
...
py‬وقم بتجربته حتى ليكون هناك اخطاء‬
‫4( اكتب سكربت التستيب‬
‫‪#!bin/python‬‬
‫‪from distutils
...
py is our script name‬‬

‫)]'‪setup(console=['pf
...
py py2exe‬‬

‫6( انقل لمجلد ال ‪dist‬‬
‫7( شغله‬

‫‪%>pf
...
wikipedia
...
swaroopch
...
co
...
sourceforge
...
‫ و غيرها‬quick fixes ‫ و‬refractoring ‫التعامل على حجم اكبر من احتياجات اكثر من ال‬

‫‪Glade‬‬
‫مصمم للواجهات مختص ب ‪ GTK‬ذكرنا كيفية استخدامه فى ‪Gqamoos‬‬

‫‪Geany‬‬

‫برنامج ‪ geany‬هو محرر نصوص متقدم مكتوب ب ‪ +GTK‬ويقدم بعض مزايا ال ‪ IDE‬ليساعد فى التطوير السريع‬
‫لبرامجك‬
‫للمزيد : ‪/http://www
...
org‬‬

Gazpacho
http://gazpacho
...
biz/
gtk ‫ مكتوب ببايثون و‬glade ‫الجيل الجديد من‬

wxGlade
http://wxglade
...
net/

‫الصورة مأخوذة من الموقع الرسمى‬
wx ‫ ولكن ل‬Glade ‫مشابه ل‬

BoaConstructor
http://boa­constructor
...
net/
‫ متكاملة محرر نصوص ومصمم واجهات )مشابهه لدلفى(
...
codeplex
...
enu
Title: pleesee
Description: loook