هنتناول فى الفصل دا مفاهيم اساسية زى الvariables وال Loops وال Conditions وهى جزء حيوى من كل اللغات وبعض انواع البيانات
اولا ماهو ال variable (متغير)؟
هو قيمة متغيرة فى برنامج وبيهمك انك تتابعها وتتابع اى تغير يتم فيها.
مثلا حساب بنكى فيه فلوس "قيمة" قابلة للتغيير فلازم نعبر عنها بمتغير وليكن "money” ونشوف قيمته خلال برنامجنا سواء بالزيادة او النقص
افتح ال IDLE .. هشنتغل بنظام تفاعلى فى الأكواد الصغيرة..
>>>balance=90000 #an integer
نطبع القيمة كالتالى
>>> print balance
90000
نضيف ليه قيمة ولتكن 100 (زيادة)
>>> balance = balance + 100
>>> print balance
90100
ننقص منه اى قيمة وليكن 890 (نقص)
>>> balance = balance - 890
>>> balance
89210
على فرض اننا عندنا variable بإسم name بيعبر عن قيمة معينة لل name دا
ملحوظة ال variable ماهو الا alias لقيمة متغيرة فى برنامجك
>>> name="ahmed" #a string
>>> print name
ahmed
وهكذا تقدر تعمل متغير يعبر عن العمر مثلا age
>>> age=50
>>> print age
50
List
طب جميل موضوع المتغيرات هيدفعنا نتكلم عن ال Lists او القوائم هى عبارة عن Enhanced Array لمبرمجى ال C
اقرب مثال هو طلاب الفصل او زملاء العمل هل تعتقد ان اذا عندنا 30 طالب اننا نعمل شئ مشابه للتالى
student_1=”Ahmed”
student_2=”Wael”
student_3=”Ayman”
student_4=”Tina”
............
student_30=”Youssef”
هل تتوقع اننا نعمل 30 متغير ل30 طالب بالصورة دى ؟ ممكن بس يفضل تكتب استقالتك بعدها
بالطبع لأ.. وهنا تيجى اهمية ال List وهى بإختصار ال Grouping لل Data Types المشتركة بمعنى ان كل دول students صح ؟
>>> students=[“Ahmed”, “Wael”, “Ayman”, “Tina”]
>>> type(students)
<type 'list'>
لاحظ ان اول عنصر فى ال list ال index بتاعه هو 0 والتانى هو 1 والتالت هو 2
القاعدة العامة
idx=n-1
مثلا عندنا 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(element)
لإضافة عنصر بنستخدم ال append ميثود كالتالى
>>> students.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(iterable)
>>> students.extend(["Omar", "Waleed"])
>>> students
['Ahmed', 'Ayman', 'Tina', 'Wael', 'Gina', 'Marian', 'Omar', 'Waleed']
بتقوم بدمج ال iterable على الlist الحالية كالتالى مثلا
.remove(value)
بيتم حذف اول ظهور لل value فى ال list مباشرة كما فى المثال
>>> students.remove("Ayman")
>>> students
['Ahmed', 'Tina', 'Gina', 'Marian', 'Omar', 'Waleed']
للحذف بنقوم بتحديد ال index (الترتيب) الخاص بالعنصر ليتم حذفه كالتالى مثلا
>>> del students[3]
>>> students
['Ahmed', 'Ayman', 'Tina', 'Gina', 'Marian', 'Omar', 'Waleed']
.insert(idx, item)
لإضافة عنصر معين فى ترتيب معين بنستخدم ال insert ميثود كالتالى مثلا هيتم إضافة Ayman فى الترتيب ال 3 (العنصر ال4)
>>> students.insert(3, "Ayman")
>>> students
['Ahmed', 'Tina', 'Gina', 'Ayman', 'Marian', 'Omar', 'Waleed']
.pop(idx=-1)
بتقوم بحذف + اعادة عنصر فى ال list بإستخدام ال idx وفى حال عدم توفيره هيتم التطبيق على آخر عنصر بال list
>>> popped=students.pop()
>>> popped
'Waleed'
>>> popped=students.pop(2)
>>> popped
'Tina'
>>> students
['Ahmed', 'Ayman', 'Wael', 'Omar']
.reverse()
بيتم عكس الترتيب من الآخر للأول كالتالى
>>> students
['Ahmed', 'Ayman', 'Wael', 'Omar']
>>> students.reverse()
>>> students
['Omar', 'Wael', 'Ayman', 'Ahmed']
.sort()
بتقوم بترتيب العناصر
>>> students.sort()
>>> students
['Ahmed', 'Ayman', 'Omar', 'Wael']
.index(value)
الحصول على الترتيب الخاص باول ظهور للعنصر
>>> students.index("Ayman")
1
.count(value)
للحصول على عدد مرات ظهور عنصر معين فى ال list
>>> students.append("Ayman")
>>> students
['Ahmed', 'Ayman', 'Omar', 'Wael', 'Ayman']
>>> students.count("Ayman")
2
Tuples(YET ANOTHER CONTATINER)
ال Tuple هى Container اخر زى ال List ولكن الفرق هى إنها غير قابلة للتغيير..
التعريف بيتضع العناصر بين ( )
>>> t=(1, 2, 3, 4, 5)
>>> t
(1, 2, 3, 4, 5)
او تقدر تعرفها كالتالى مثلا
>>> t=1, 2, 3, 4, 5
>>> t
(1, 2, 3, 4, 5)
len(tup)
هتقوم بإعادة عدد عناصر ال tup (نفس السلوك مع اى كونتينر)
احنا قلنا انها غير قابلة للتغيير يعنى لو حاولنا نعدل اى عنصر المفروض يحصل مشكلة
>>> t=1, 2, 3, 4, 5
>>>t[0]=9 #Try to set the first element to 9
هنا حاولنا نخلى العنصر اللى فى الترتيب الأول قيمته تساوى 9
رد بايثون هيكون مشابه للتالى
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
t[0]=9 #Try to set the first element to 9
TypeError: 'tuple' object does not support item a*signment
Strings
بيثون بتقدملك نوع من البيانات ليعبر عن ال String ولكن اولا ماهو ال String ؟
هو بكل بساطة مجموعة من الحروف
لغات مثل سى لاتعترف بال String ولكن تعتبره مصفوفة (او ليست) من الحروف
انشاء string
تقدر تعرفه كالتالى
>>> astring="Hello, World!"
هنا تم انشاء متغير بإسم astring وتم تخزين القيمة Hello, World داخله
لاحظ لإنشاء اى سترينج استخدم علامات التنصيص " “ او ' ' او "”” “”” هنشرح الفرق خلال الكتاب
زى مااليست بتقدملنا خدمات تسهل علينا التعامل فكذلك الstrings
اولا اسم الداتاتايب هو str (اختصار string)
>>> type(astring)
<type 'str'>
len(string)
تقوم بحساب عدد الحروف الموجودة بال string
>>> len("Hello, World")
12
.capitalize()
تقوم بإعادة اوبجكت جديد تحول فيه اول حرف إلى حرف uppercase
>>> "hello".capitalize()
'Hello'
.count(sub)
حساب عدد مرات تكرار مقطع معين
.lower()
اعادة اوبجكت بيه كل الحروف lowercase
>>> "HELlO".lower()
'hello'
.upper()
اعادة اوبجكت بيه كل الحروف uppercase
>>> "helLo".upper()
'HELLO'
.swapcase()
بتقوم بإعادة اوبجكت بعكس حالة الأحرف
>>> "hElLo".swapcase()
'HeLlO'
.title()
بتعيد اوبجكت على صورة title
>>> "hello, world".title()
'Hello, World'
.startswith(sub)
بتختبر هل السترينج يبدأ بمقطع معين او لأ
>>> "hello".startswith("he")
True
.endswith(sub)
بتختبر هل السترينج ينتهى بمقطع معين او لأ
>>> "hello".endswith('lo')
True
سؤال: إيه اللى يخلينى استخدم tuple مكان list ؟ مع إنها بتقدملى امكانيات اقل؟
لأنك غالبا مش هتستخدمها ك list ولكن هتحتاج ميزة عدم التعديل عليها
.find(sub)
بتقوم بإعادة ال index الخاص بأول ظهور لمقطع معين
>>> s="Hello, World"
>>> s.find('W')
7
.strip([chars])
بتقوم بحذف ال chars من السترينج وفى حال عدم تحديدها هيعتبر انها المسافات
.lstrip([chars])
مثل الأولى ولكن من على اليسار فقط
rstrip([chars])
مثل الأولى ولكن من اليمين فقط
.isalpha()
بتختبر هل السترينج مكون من حروف الأبجدية او لأ
.isalnum()
بتختبر هل السترينج مكون من حروف من الأبجدية او ارقام او لأ
.isdigit()
بتختبر هل الحروف المكونة للسترينج عبارة عن ارقام او لأ
.isupper()
بتختبر هل السترينج فى حالة uppercase او لأ
.islower()
بتختبر اذا كان السترينج فى حالة lowercase أو لأ
.isspace()
بتختبر هل السترينج دا مسافة
.istitle()
بتختبر هل السترينج دا title أو لأ
ويوجد العديد بكل تأكيد تقدر تطلع على باقى الميثودز فى الوثائق الخاصة بالبيثون
ملحوظة هامة ال string مش mutable!
لتستخدم mutable strings تابع فصل ال UserString
UserString
المشكلة:
somestring="hola"
print somestring, ", ", id(somestring)
somestring += " guyZ"
print somestring, ", ", id(somestring)
الناتج
hola , 3084138464
hola guyZ , 3084161896
لاحظ اختلاف ال id الخاصة بالsomestring بعد اضافة مقطع ليه ، والسبب ان تم انشاء اوبجكت جديد من ال str class وتم دمج القيمة القديمة + المقطع الجديد
الحل UserString Module
زى ماحنا عارفين إن فى python ال Strings are immutable زى العديد من اللغات زى Java/C# .. etc
بمعنى إن اى تعديل هيتم على String مثل ال Concatenation بيحذف ال Variable ويعمل Variable جديد كالتالى
>>> 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
لاحظ بعد ال Concatenation مع ال string الجديد إتغير ال location بتاعه .. لكن اللى حصل بالفعل هو إن اتعمل شئ مشابه للتالى
>>> s ="I'm a string"
>>> del s
>>> s ="I'm a string, and you?"
طب جميل ولكن على فرض إنك عايز تعمل mutable string او فى بعض اللغات إسمه
StringBuffer/StringBuilder ؟
الحل هو إنك تستخدم cla*s من UserString Module ودى Module موجودة عندك فى
PythonPath/Lib/UserString.py
استدعى ال Module كالتالى
>>> import UserString as us
استخدمت as us لتعبر عن alias لل UserString module
ال Module بتتكون من 2 Cla*ses هماUserString,MutableString
ال UserString هو ال base cla*s و immutable تقدر تستخدمه بصورة مشابه لل str type
ال MutableString هو sub cla*s من ال UserString و mutable
ملاحظة : ال MutableString معمول فيه remove(override) ل hash function لأنه طالما Mutable يبقة
unhashable !
def __hash__(self):
raise TypeError, "unhashable type (it is mutable)"
ال MutableString فيه method بإسم immutable ودى بتدى return ل immutable string !
>>> m_string=us.MutableString("Hello, ")
بنعمل Object بإسم m_string
تحديد ال location
نعمل ref ليه
>>> ref_m_string=m_string
تحديد ال id ل ref هنلقيه نفس ال id الخاص ب m_string
>>> id(ref_m_string)
13511136
عمل Concatenation
>>> m_string += "CRUEL WORLD!"
نحدد ال id تانى هنلقيه مازال هو هو
ال id الخاص بال ref مازال زى ماهو
>>> ref_m_string
'Hello, CRUEL WORLD!'
>>> id(ref_m_string)
13511136
عمل Object ولكن immutable يعنى ال id بتاعه هيتغير فى اى اى تغيير هيتم عليه
>>> im_string=m_string.immutable() # Return immutable string!
>>> im_string
'Hello, CRUEL WORLD!'
تحديد ال id
>>> id(im_string)
13532856
عمل ref ليه وتحديد ال id
>>> ref_im_string=im_string
>>> id(ref_im_string)
13532856
عملية Concatenation
>>> im_string +=" blah blah blah"
تحديد ال id هنلاقيه إنه إتغير
>>> id(im_string)
13553416
ال ref مازال زى ماهو مش تم عليه اى تغيير لأنه بيشير لمكان Object تم الإستغناء عنه واصبح اسم
im_string بيشير ل 'Hello, CRUEL WORLD! blah blah blah'
>>> ref_im_string
'Hello, CRUEL WORLD!'
>>> id(ref_im_string)
13532856
>>> im_string
'Hello, CRUEL WORLD! blah blah blah'
يفضل اعادة قراءة الفصل بعد قراءة جزئية الكائنات
Dictionaries
انشائه
اسم الداتاتيب هو dict
وبيخزن فيه البينات على صورة Key, Values زى القاموس بالظبط (من هنا جت التسمية)
>>> d['Name']='Ahmed'
>>> d['Age']=19
>>> d['Sex']='m'
هنا خزنا فى القاموس بتاعنا 3 keys وهما 'Name' , “Age', 'Sex'
.keys()
للحصول على الKeys او الكلمات الدليلية فى صورة ليست
>>> d.keys()
['Age', 'Name', 'Sex']
.values()
للحصول على ال Values فى صورة ليست
.get(key)
بتعيد لك الvalue الخاصة ب key معين
فى حال عدم وجوده هيتم إعادة None
>>> print d.get('Team')
None
Indexing
تقدر تحصل على القيمة الخاصة ب key معين من خلال ال Indexing كالتالى مثلا
او تقدر تضيف Key جديد مثلا
او تقدر تعدل على قيمة موجودة
.pop(key)
بتقوم بحذف ال Key والValue بتاعته من القاموس وبتعيدلك ال value
.update(d)
بتقوم بعمل تحديث للقاموس ببيانات قاموس d
d.update({'Lang':'Python', 'Singer':'Delta'})
>>> d
{'Lang': 'Python', 'Age': 19, 'Singer': 'Delta', 'Name': 'Youssef'}
.has_key(key)
بتختبر وجود key معين فى القاموس
>>> d.has_key('Lang')
True
.items()
بتعمل list مكونة من tuples بتشمل ال key, value فى صورة زوج
>>> print d.items()
[('Lang', 'Ruby'), ('Singer', 'Delta'), ('Name', 'Youssef'), ('Country', 'EG'), ('Age', 19), ('Sex', 'm')]
.iteritems()
بتستخدم غالبا فى ال Iterations (سنتعرض ليها لاحقا)
for key, val in d.iteritems():
print key, " => ", val
Lang => Ruby
Singer => Delta
Name => Youssef
Country => EG
Age => 19
Sex => m
مثال اخر
>>> i=d.iteritems()
>>> i.next()
('Lang', 'Ruby')
>>> i.next()
('Singer', 'Delta')
Conditions
حياتنا مبنية على الإحتمالات والبرمجة مش خارج نطاقها.. مثلا اذا الخدمات اللى بتطلب تسجيل الدخول منك مبنية على احتمال "هل انت او لأ"
الصورة العامة
if condition as True then
if_suite
مثلا "مع فارق التشفير وقواعد البيانات فى الإستخدام"
>>> if name=="ahmed" and pa*sword=="123456":
print "Welcome ahmed"
#output
Welcome ahmed
لاحظ هنا اختبرنا هل الإسم قيمته مساوية "==” لاحمد و الباسورد قيمته "123456” فإذا الناتج True يتنفذ البلوك اللى بعدها وهو print Welcome ahmed
فى حال ال ناتج الأساسى للشرط مش True يعنى False مش هيتنفذ حاجة.
تمام.. طب اذا حبينا نعالج موضوع ان الشرط يكون False ؟ بمعنى اننا لو غيرنا مثلا الباسورد لأى قيمة مخالفة ل 123456 ال condition قيمته هتكون False وفى الحالة دى مش هيحصل شئ.. ولكن احنا عايزين نعرف ان الcondition كان False مثلا؟
تابع المثال التالى وهو إستخدام if, else
الصورة العامة
if condition as True then
if_suite
else then
else_suite
لاحظ المثال التالى
>>> name="ayman"
>>> pa*sword=147859
>>> if name=="ahmed" and pa*sword=="123456":
print "Welcome ahmed" #if_suite
else:
print "Welcome, Who R U?" #else_suite
Welcome, Who R U?
طب فى حال وجود عدة احتمالات قد تكون سليمة او لأ هنستخدم if, else if, else
if condition as True then
if_suite
else_if condition as True then
else if suite
else_if condition as True then
else_if suite
else then
else_suite
تابع المثال التالى
>>> if name=="ahmed" and pa*sword=="123456":
print "Welcome ahmed" #if_suite
elif name=="tina" and pa*sword=="36987456":
print "Welcome tina" #elif_suite
elif name=="ayman" and pa*sword==147859:
print "Welcome, Ayman" #elif_suite
else:
print "Who R U?"
Welcome, Ayman
الأول تم أختبار البلوك دا
if name=="ahmed" and pa*sword=="123456":
ولكنه مش True فيتعمل Escape للى بعده وهو
elif name=="tina" and password=="36987456":
ولكنه مش True بردو فيتعمل Escape للى بعده وهو
elif name=="ayman" and password==147859:
والبلوك دا قيمته True فيتنفذ البلوك تبعه وهو
print "Welcome, Ayman" #elif_suite
ملحوظة:
لإختبار التساوى بنستخدم ==
لإسناد قيمة بنستخدم =
Loops
زى ال conditions معظم حياتنا مبنية على التكرار.. مثل كل يوم تصحى الصبح وتاخد دش وتفطر وتنزل شغلك وهكذا لحد الأجازة مثلا تنام للمغرب

طالما انت فى دراسة او شغل "مش فى اجازة"
اصحى الساعة 6
خد دش
افطر
انزل شغلك
الصيغة العامة
while condition as True do
while_suite
تعالى نجرب ابسط لوب ممكن
>>> i=0
>>> while i<10:
print "i: ", i
i += 1
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
لاحط ان الكود بيتنفذ كالتالى
الشرط هو ان I تكون اقل من 10 وطالما الشرط دا حقيقى (صحيح) هيتنفذ البلوك التابع لل لوب
السبب فى إننا بنزود ال I اننا نخلى ال I توصل ل 10 بحيث ان ال loop تقف وإلا الشرط هيكون True للأبد.
Foreach element in container do
for_suite
اللوب دى بنطبقها على Containers زى ال string او list او tuple مثلا
>>> string="Hello, World!"
>>> for char in string:
print char
H
e
l
l
o
,
W
o
r
l
d
!
معناها كالتالى : لكل (حرف) فى ال string اطبع (الحرف) دا
على فرض ان عندنا list كالتالى بإسم students
>>> students=["Ahmed", "Tina", "St0rM", "Salma"]
>>> for student in students:
print student
Ahmed
Tina
St0rM
Salma
List Comprehension
اذا اخدت كورس رياضيات من قبل فربما تكون واجهت ال List Comprehension

هنا تنقسم ال LC الى جزئين جزء ماقبل ال بايب | وجزء مابعدها
ماقبلها يسمى function يتم تطبيقها على كل x
>>> [number*3 for number in range(20)]
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57]
ومابعدها يسمى قائمة المدخلات وبعض الشروط
فيما سبق قمنا بتطبيق ال LC فى بايثون حيث قمنا بتحديد الfunction (وهى ضرب كل عدد فى 3) لكل عدد ينتمى الى الفترة من صفر ل 20
Prelude> [number*3 | number <- [1..20] ]
[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60]
نفس الشئ بالنسبة لكود haskell اذا حيث تقوم بتطبيق العملية بحذافيرها ماقبل ومابعد البايب
وربما تقوم بتحديد شرط ما (هنا لكل الأعداد الزوجية)
>>> [number*3 for number in range(20) if number%2==0]
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54]
كود haskell
Prelude> [number*3 | number <- [1..20], even number]
[6,12,18,24,30,36,42,48,54,60]
طبعا تقدر تستخدم الطرق العادية للفلترة ولكن دى on the fly solution
المعنى هنا: لكل Element او student موجود فى ال Container او ال students list اطبع ال عنصر دا
ملحوظة:
لطباعة اللى فى ال Container بدون اضافة سطر جديد ضيف كومة لل print كالتالى
>>> string="Hello, World!"
>>> for char in string:
print char,
#output: H e l l o , W o r l d !
raw_input
زى ماشفنا print وعرفنا انها مختصة بالطباعة هنشوف المسؤل عن الإدخال وهنا raw_input/input
الصيغة العامة
حيث ان الprompt هى الرسالة اللى هتظهر للمستخدم
مثال
>>> name=raw_input("Enter your name: ")
Enter your name: ahmed
>>> print "Hola, ", name
Hola, ahmed
س: ايه الفرق بين raw_input, input ؟
استخدامك ل input بيساوى بالظبط التالى
مش فى احسن من التجربة العملية تابع المثال التالى
>>> val=raw_input("Enter: ")
Enter: 2+13+541
>>> print val
2+13+541
لكن مع استخدامنا ل input هيتعمل eval -اختصار ل evaluate- للمدخلات ك Python Expression كالتالى
>>> val=input("Enter: ")
Enter: 2+13+541
>>> print val
556
تم تحقيق ال 2+13+541 من خلال python واعادة الناتج ليك
eval بتاخد expression وتحاول اعادة الناتج ليك اذا كان ليه معنى
break/continueتدريب:
اكتب برنامج لتسجيل الدخول بالبينات التالية
user_name=”Ahmed”
user_pass=”123456”
ل 3 محاولات وفى حالة الفشل تطلع رسالة ب
Account Suspended!
*أستخدم raw_input للحصول على الداتا من المستخدم