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.
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
>'
القاعدة العامة
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 "
StopIteration
تم رفع استثناء لنتهاء العناصر التالية فى الموجة
على فرض لدينا التالى
class Student(object):
def __init__(self, id, name):
self
...
name=name
def __str__(self):
return "
...
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: "
...
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 "
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مثل المجلد الحالى او مجلد بايثون الفتراضى او مجلد ) sitepackagesيفضل استخدامه عند اضافة
اى وحدات خارجية لبايثون(
للحصول على القائمة كاملة التى يبحث فيها المفسر استدعى sys
...
path
2
...
0['', '/usr/lib/python2
...
2py2
...
egg', '/usr/lib/python2
...
5
...
]
...
pyوعرف فيها مجموعة من الدوال كالتالى
:)(def aloha
"!print "Aloha
:)(def adios
"!print "Adios
ايه الهدف من ال modulesقلنا ؟ فصل التطبيق لكثر من جزء لمكانية استخدام خدماته اكثر من مرة وايضا
تسهيل تقسيم العمل مثال شخص يكون مسئول عن جزئية التعامل مع قاعدة البيانات وشخص اخر مسئول عن
الواجهة وهكذا
اوكى كتبنا الموديل ماذا الن ؟
انشئ ملف جديد وليكن greeter
...
py
import firstmodule
)(firstmodule
...
adios
عند التنفيذ
striky@strikydesktop:~/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@strikydesktop:~/workspace/pytut/src$ python dbtester
...
42
...
Traceback (most recent call last):
File "dbtester
...
sqlite
...
sqlite
Platform
كثيرا مانحتاج للحصول على معلومات عن النظام الذي يعمل عليه البرنامج )لختبار التوافقية ، العتماديات او
(ربما العلم بالشئ
platform تقدم لنا بايثون وحدة بإسم
مثال
striky@strikydesktop:~/workspace/pytut/src$ python platformreport
...
4')]
[mac_ver => ('', ('', '', ''), '')]
[machine => i686]
[node => strikydesktop]
[platform => Linux2
...
279generici686withdebianlennysid]
[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
...
279generic]
[system => Linux]
[uname => ('Linux', 'strikydesktop', '2
...
279generic', '#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
5http://mysqlpython
...
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 نقفل ال
#cleanup
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
...
iteinPython/
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)
[
[
/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
بيتم استدعائها عند نهاية قراءة عنصر 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"?>
وكلم كتير اخر
...
library
...
id, book
...
author
totalsum=sum([int(str(book
...
library
...
0" encoding="UTF8"?>
com/AWSECommerceService/200510
05">
...
amazon
...
html%3FASIN=0321480791%26tag=ws
%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0321480791%253FSubscript
ionId=dontbeaswoosh
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"?>
when he began to run on the wall
...
text>
basketball
...
com/twitter_production/profile_imag
es/53781608/Photo_75_normal
...
com
user وتريد الحصول على كل ماتحت ال
statuses
...
user
...
amazonaws
...
jpg
url => http://addictedtonew
...
xmlو twitter
...
org/2008/11/17/happymappermakingxmlfunagain
للحصول على 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
...
23reader=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