6.5 لغة البرمجة python
محتويات هذا الفصل:
6.5.1 مقدمة
لغة python (وهو نوع من الأفاعي) لغة تفسيرية ويمكن تسريعها بعمل byte code
. لغة سريعة وقابلة للتطوير وهي موجهة للكائنات OOP
كما أنها اللغة التي كتب بها سلسلة أدوات ريدهات redhat-config-*
هذه اللغة حاسة لحالة الحروف إن كبيرة أو صغيرة
وهي أيضا حساسة لعدد المسافات البادئة فبدلا من
وضع الوحدة ضمن أقواس {} نقوم بازاحة الكلمات عدد معين
وكل الكلمات المزاحة بذلك المقدار تعتبر وحدة
يمكن تنفيذها بطريقة تفاعلية مباشرة حيث تطبع الأمر فيعطيك النتيجة.
أو لعمل نص تنفيذي كما
#!/usr/bin/python
# hello.py - My 1st python application
print "Hello World!!"
يبدأ البرنامج ب"شابانغ" كأي script من الواضح لديك أن السطر الذي يبدأ
ب # هو مجرد تعليق، لاداع لوضع فاصلة منقوطة ‘;‘ بعد كل أمر ولكن نستعملها لوضع أكثر من أمر على نفس السطر.
إذا كان الأمر طويلاً ضع \ وتابع على السطر التالي.
في بايثون أكثر من نوع من الإقتباس ولكنها لا تختلف من حيث القوة
بل من حيث علامة البداية والنهاية
#!/usr/bin/python
# quoting.py - quoted strings in python
print "you can put ' in side double quotes without a escape"
print "you can't put \" in side double quotes without a escape"
print 'you can put " in side single quotes without a escape'
print 'you can\'t put \' in side single quotes without a escape'
# \X1b ,\x1b, \X1B or \x1B (hex for ESC) and \033 for oct ESC
print "Visit us on \033[34,4mwww.daif.net/linux\033[0m"
print 'Do \033[1mNOT\033[0m ignore \033[5mme\033[0m.'
# put r or R in front of a quote to make it raw
# in such case \n mean \n not new line
print 'backslashs need to be esaped like "C:\\windows\\fonts"'
print r'backslashs need NOT to be esaped in raw quotes like "C:\windows\fonts"'
# two adjacent strings are like if they are one string
print "what " "is " "your name ?"
print ''' W E L C O M E T O 3 Q U O T E S
This type of quoting allow you to put " and ' or even "" without
escaping, it can be a multi-line string without puting escaped
newlines, it's very usefull for CGI too.'''
print """ W E L C O M E T O 3 D O U B L E Q U O T E S
Same as the previous but with double quotes"""
Python توفر الكثير من الإمكانيات
الحسابية لا تختلف كثيراً عن تلك في سي
الأرقام يمكن أن تكون صحيحة integers أو صحيحة كبيرة long-integers
يمكن التعبير عنها بالنظام العشري أو الثماني (تبدأ بصفر) أو ست-عشرية
(تبدأ بصفر ثم x ) مثل 27 0x1B 033 على الترتيب،
الأرقام الصحيحة تعادل long في لغة سي،
والأرقام الصحيحة الطويلة لا محدودة
(كتلك في bc)
وهي تحدد بحرف L أو l في نهايته مثلاً 0xFFFFFFFEl.
من جهة أخرى لدينا الأرقم النسبة (الأعداد الكسرية) التي تعرف من الفاصلة العشرية
27. أو من خلال حرف e في التعبير الهندسي
0.3e+9 التي تعني 0.3x10+9
أما المزية الأكبر فهي دعم الأعداد المركبة (التخيلية) وذلك بوضع J أو j
بعد الجزء التخيلي من العدد مثل 0.3+1.9j
أما العميات فهي تشبه تلك في سي مع بعض الزيادة
هذا الجدول يوضح العمليات مرتبة حسب الأولويات
| الأولوية الأعلى |
| `` |
string conv
| ltr |
| {} |
dictionary
| ltr |
| [] |
list
| ltr |
| () |
tuple
| ltr |
| () |
functions call
| ltr |
| [:] |
slicing
| ltr |
| [ ] |
subscript access
| ltr |
| . |
member access
| ltr |
| ** |
رفع لقوة
| rtl |
| ~ |
المتممة الثنائية الأولى
| ltr |
| + - |
الإشارة (وليس الجمع والطرح)
| rtl |
| * / % |
الضرب والقسمة وباقي القسمة والتكرار
| ltr |
| + - |
الجمع والطرح وجمع النص
| ltr |
| << >> |
ازاحة لليمن واليسار في النظام الثنائي
| ltr |
| & |
'و' بالنظام الثنائي
| ltr |
| ^ |
إما(أحدهما وليس كلاهما) بالنظام الثنائي
| ltr |
| | ^ |
أو بالنظام الثنائي
| ltr |
| < > <= >= == != |
المتباينات والمقارنات
| ltr |
| is ,is not |
الهوية
| ltr |
| in ,not in |
الإنتماء
| ltr |
| not |
النفي المنطقي
| ltr |
| and |
و المنطقية
| ltr |
| or |
أو المنطقية
| ltr |
| lambda |
تعريف وظيفة من نوع خاص (تشبه define/inline في سي) وهي فقط
القيمة المعادة lembda myfoo(x,y): x+y
| ltr |
| الأولوية الأدنى |
لعمل برامج بسيطة
نطبع على الشاشة ب print كما لاحظنا، و print
على عكس أخواتها print و printf في perl تطب سطر جديد
مالم تتبع بفاصلة مثلاً
#!/usr/bin/python
# print.py - some print tricks
print "Hello ",
print "World!!"
# print can do printf just put %
print "look %8.3f" % 15.
نستخدم المتغيرات دون تعريف ودون $
(فلا يوجد تعويض قيمة داخل إقتباس)
كما أن نوع المتغير يحدد تلقائياً لنحدده يدوياً
نستعمل وظيفة مثل int للتحويل لعدد صحيح و float لتحويل لعدد نسبي.
#!/usr/bin/python
# var1.py - how to use variables
msg1 = "Hi! How are you today?"
print "/\" * 10
print msg1
print "\/" * 10
i = int(10.5)
j = int("3")
k = i/j
print "i = ", i, ",j = ", j, ",k = ", k
a = float(10.5)
b = float("3")
c = a/b
print "a = ", a, ",b = ", b, ",c = ", c
نسأل المستخدم بالوظيفة raw_input التي تأخذ معامل يمثل الرسالة التي تظهر.
#!/usr/bin/python
# user-input.py - how to get input from the user.
nm=raw_input("Enter your name: ")
print "Hi", nm
i=int(raw_input("Enter an integer: "))
j=int(raw_input("Enter an integer: "))
print " i + j =",i+j
print " i - j =",i-j
print " i * j =",i*j
try:
print " i / j =",i/j
except:
print "Can't divide by zero!!"
print "nice to meet you ",nm
Python تستطيع معالجة الحالات الاستثنائية
بواسطة try ثم الأمر الذي نتوقع أن يحدث
فيه خلل (حالة استثنائية) ثم
ثم except [EXCEPTIONS]...
ثم ماذا يفعل لو حدثت.
وعند عمل وظائف خاصة بك يمكنك الإعلان عن حدوث حالة ب
raise [EXCEPTIONS]...
هذا مثال على معالجة الحالات الاستثنائية.
#!/usr/bin/python
# python and exception handling
x=10
try:
v=float( raw_input("Enter the speed: ") )
except:
print "Error , you should enter a float number"
print v
try:
print x/v
except ZeroDivisionError:
print "Error , can't divide by zero"
انظر ملف Python Quick Reference
وهو باسم cheatsheet في مجلد وثائق python
أو Python Tutorial td في مجلد وثائق python بصيغة html
6.5.2 الشرط والحلقات والوظائف
في لغة سي نضع {} حول كل متن block منفصل من الكود
ولكن في python نضع نقطتين رأسيتين ‘:‘ ونضع مسافات أو TAB
بإزاحة متساوية لذلك المتن.
صيغة if هي if ثم الشرط (لا داع للأقواس) ثم : ثم ماذا يفعل إن تحقق وعلى سطر آخر
elif ثم شرط آخر كما في السابق ثم else
#!/usr/bin/python
# if1.py - simple if
i=int(raw_input("Enter an integer: "))
# if the remainder is not zero then it's odd
if (i % 2):
print i," is odd"
else:
print i," is even"
#!/usr/bin/python
# if2.py - more about if
i=int(raw_input("Enter an integer less than 4 : "))
if (i == 1):
print "one"
elif (i == 2):
print "two"
elif (i == 3):
print "tree"
else:
print i," is NOT less than 4"
جملة for-in التقليدية حيث نضع متسلسلة يأخذ المتغير قيمه بالترتيب
#!/usr/bin/python
for i in (0,1,2,3,4,5):
print i
for i in range(5):
print i
جملة while طالما التقليدية أيضاً
كالمعتاد شرط ثم متن
#!/usr/bin/python
i=1
while (i<=10):
print i; ++i
يمكن الخروج من الحلقات ب break ويمكن القفز عن العنصر الحالي ب continue
تسمح لنا python بوضع جملة else بعد الحلقات
ليتم تنفيذ ما بها عند الخروج دون break
هذا مثال على حساب القاسم المشترك الأكبر (القاسم لعددين دائماً أقل أو يساويهما
ويجب أن يقسمهما معاً).
يتم تعريف وظيفة بكتابة def ثم اسم الوظيفة ثم المعاملات بين
أقواس وتعيد هذه الوظيفة قيمة من أي نوع بوساطة return
#!/usr/bin/python
# gcd0.py - simple buggy gcd calc
def gcd(x,y):
d=min(x,y)
while (d>=1):
if ( x % d) == (y % d) == 0 :
return d
else:
d-=1
a=int( raw_input("Enter a +ve integer: ") )
b=int( raw_input("Enter a +ve integer: ") )
print "The greatest common divisor is", \
gcd(a,b)
تلميح
عدل البرنامج ليتعامل مع حالة السالب والصفر ثم عدله ليستعمل خوارزمية euler
يمكن إعطاء قيم تلقائية للمعاملات في حال لم تمرر
وذلك بوضع = ثم القيمة بعد اسم المتغيّر.
#!/usr/bin/python
# default-arg.py - how to give an argument a default value
def test(a="Hello",b="world"):
print a,", ",b,"!!"
test("Hi","Ahmad")
test()
test(b="Ahmad")
6.5.3 المنظومة والقاموس
المنظومات array نوعان أولها يسمى Sequence أي متسلسلة
وهي 3 أنواع قائمة List و تركيب مرتب Tuple و سلسلة نصية String
وهم مجموعة من العناصر نبدأ العد من صفر فالعنصر رقم واحد
هو العنصر الثاني والعنصر ذي الرقم السالب نعد من الأخير مثلاً العنصر رقم -2 هو قبل الأخير .
لنصل لعنصر معين بوضع رقمه داخل أقواس مربعة [ ] .
ويمكن الوصول لجزء منها بوضع رقم البداية ثم ‘:‘ ثم رقم النهاية
بهذا نولد متسلسلة أخرى
#!/usr/bin/python
# a is an array
a=[1,2,3,4,5]
# you may say a=(1,2,3,4,5) or a=1,2,3,4,5
print "a = ",a
print "the 1st one is ",a[0]
print "the last one is ",a[-1]
print "the 2nd to 4th elements are ",a[1:3]
print "from the 2nd ",a[1:]
print "to the 4th ",a[:3]
print "a = ",a[:]
# strings are array
s="Amman"
print "Am[man] : ",s[2:]
يمكن استعمال len وتمرير منظومة لها لمعرفة طولها
و min و max لمعرفة العنصر الأصغر والأكبر
#!/usr/bin/python
# mean.py - calculate the mean of integers
a=[]
while (1):
i=int( raw_input("Enter an integer (-1 to exit): ") )
if (i==-1):
break
a.append(i)
print "you entered : ",a
print " max=",max(a),
print " mix=",min(a)
s=0
for i in a:
s+=i
print " sum=",s,
print " sum=",float(s)/len(a)
لاحظ إضافة عنصر ب append
انظر الجدول للمزيد من هذه العمليات
| LIST.[i:j]=LIST2 |
تعديل/إضافة العناصر من i إلى j في القائمة LIST لتكون LIST2
|
| LIST.append(X) |
إضافة العنصر X للقائمة LIST
|
| LIST.extend(LIST2) |
إضافة القائمة LIST2 للقائمة LIST
|
| LIST.insert(I,LIST2) |
إضافة LIST2 إلى LIST بدأ من الموقع I
|
| LIST.index(X) |
البحث عن أول X داخل القائمة LIST وإعادة رقمه
|
| LIST.count(X) |
عدد العناصر التي قيمتها X في القائمة LIST
|
| del LIST.[i:j] |
حذف العناصر من i إلى j في القائمة LIST
|
| LIST.pop([I]) |
تعيد ثم حذف العنصر رقم I من القائمة LIST إذا لم يقدم تعمل على آخر عنصر
|
| LIST.remove(X) |
حذف أول عنصر قيمته X من القائمة LIST
|
| LIST.reverse() |
قلب ترتيب القائمة
|
| LIST.sort([FUNC]) |
ترتيب القائمة LIST حيث FUNC هي وظيفة الترتيب تعيد -1 أو 0 أو 1
وهي اختيارية
|
المنظومة التي تحاط بأقواس هلالية أو دون أقواس تسمى tuple
تكون ثابتة (ولكن يمكن فقط الإضافة)
#!/usr/bin/python
# A tuple is a const array you can only add
aTuple=(3.0,"two",1)
print "the second is", aTuple[1]
aTuple+=(0,)
print "it's now", aTuple
النوع الثاني من المنظومات arrays يسمى القاموس
لكنه لا يعتمد على رقم للوصول للقيمة بل يكون على شكل تقابل
كما بين الكلمة ومعنها في القاموس الورقي ، حيث هو مزاوجة بين مفتاح وقيمة.
يتم تحديده بواسطة الحاصرة {} حيث يفصل المفتاح عن القيمة ‘:‘
dict1={1 : "first","two" : "second"}
حيث نصل للعنصر بكتابة مفتاحه في أقواس مربعة
يسمى في لغات أخرى ب hash
# A dictionary is a hash (array accessed by a key)
aDict={"key1":"val1","key2":"val2","key3":"val3"}
for item in aDict.keys():
print aDict[item], # to keep in the same line
print # to end the line
هذا ملخص للطرق methods والوظائف التي لها صلة به
| len(DICT) |
عدد العناصر في DICT
|
| del DICT[KEY] |
حذف العنصر ذو المفتاح KEY من DICT
|
| DICT.clear() |
حذف كل العناصر
|
| DICT.value() |
قائمة بكل عناصر DICT
|
| DICT.items() |
قائمة بكل عناصر DICT على شكل أزواج (KEY,VALUE)
|
| DICT.keys() |
قائمة بكل مفاتيح DICT
|
| DICT.has_key(KEY) |
تحقق من وجود مفتاح KEY
|
6.5.4 السلاسل النصية
Python أداة مرنة توفر الكثير للتعمل مع النصوص
وذلك من خلال string module ضع الأمر التالي
import string في بداية البرنامج
لتفعيل الوظائف المبينة في الجدول
| STR.upper() |
تحويل الحروف إلى حروف كبيرة
|
| STR.lower() |
تحويل الحروف إلى حروف صغيرة
|
| STR.swapcase() |
عكس حالة الحروف بين كبيرة وصغيرة
|
| STR.title() |
أول حرف من كل كلمة كبير والباقي صغير
|
| STR.capitalize() |
أول حرف كبير
|
| STR.strip() |
حذف المسافات و TAB من طرفي السلسلة STR
|
| STR.lstrip() |
حذف المسافات و TAB من بداية السلسلة STR
|
| STR.rstrip() |
حذف المسافات و TAB من نهاية السلسلة STR
|
| STR.expandtabs([TABSIZE]) |
تحويل كل TAB في السلسلة STR إلى عدد TABSIZE من المسافات
|
| STR.ljust(W) |
نسخة عن STR مع مسافات في البداية ليكون إجمالي طوله W
|
| STR.rjust(W) |
نسخة عن STR مع مسافات في النهاية ليكون إجمالي طوله W
|
| STR.center(W) |
نسخة عن STR مع مسافات من الطرفين ليكون إجمالي طوله W
|
| STR.count(SUB[,START[,END]]) |
عدد SUB الموجودة في STR
|
| STR.find(SUB[,START[,END]]) |
البحث عن أول SUB في STR وإعادة رقمه (-1 إن لم يوجد)
|
| STR.index(SUB[,START[,END]]) |
البحث عن أول SUB في STR وإعادة رقمه تستخدم مع try
|
| STR.rfind(SUB[,START[,END]]) |
كما في find ولكن تبدأ البحث من الجهة الأخرى
|
| STR.rindex(SUB[,START[,END]]) |
كما في index ولكن تبدأ البحث من الجهة الأخرى
|
| STR.replace(OLD,NEW[, MAX]) |
البحث عن OLD وإبدالها ب NEW
|
| STR.isalnum() |
فحص هل STR مكوّن من حروف وأرقام
|
| STR.isalpha() |
فحص هل STR من حروف
|
| STR.digit() |
فحص هل STR من أرقام
|
| STR.islower() |
فحص هل STR من حروف صغيرة
|
| STR.isupper() |
فحص هل STR من كبيرة
|
| STR.istitle() |
فحص هل STR له حروف بادءة كبيرة والباقيات صغيرة
|
| STR.isspace() |
فحص هل STR مكون بالكامل من مسافات
|
| STR.startswith(PREFIX[,START[,END]]) |
هل يبدأ STR ب PREFIX
|
| STR.endswith(SUFFIX[,START[,END]]) |
هل يبدأ STR ب SUFFIX
|
| STR.split([SEP[,MAX]]) |
فصل STR إلى عناصر قائمة حيث SEP هي الفاصل
|
| STR.splitlines([keepends]) |
فصل STR إلى قائمة حيث كل سطر هو عنصر
|
| STR.join(SEQ) |
عكس split تعيد توحيد القائمة SEQ يفصل بينها STR
|
| STR.encode([ENCODING[,ERRORS]]) |
تحويل من نظام ترميز ENCODING إلى النظام التلقائي
|
| STR.translate(TABLE[,DELCHARS]) |
استعمال TABLE لترجمة STR
|
عملية % على السلاسل تعمل على تنسيق السلاسل بطريقة printf التي شرحناها في فصل perl مثلاً
a="you have %05d trials." % 15
print a
من الوسائل القوية في لغة python هي التعابير العادية RE التي تستخدم في البحث.
ضع import re في بداية البرنامج. للتعامل مع تعبير قياسي
عليك تصنيفه، انظر مكتبة سي.
هذا جدول بالوظائف:
| وظائف الحزمة RE |
| re.escape(STR) |
escape النص STR التي تحتاج لوضع \
|
| re.compile(PAT[,FLAGS=0]) |
تصنيف التعبير PAT بالخيارات FLAGS هي 0 أو
re.I و re.L و re.M و re.S و re.X تمزج ب ‘|‘
|
| re.match(PAT,STR[,FLAGS]) |
البحث عن PAT في بداية STR تعيد كائن من نوع خاص
|
| re.search(PAT, STR[,FLAGS]) |
البحث عن PAT في STR تعيد كائن من نوع خاص
|
| re.findall(PAT,STR) |
البحث عن مطابقات غير متداخلة وإعادة قائمة بها
|
| re.sub(PAT,NEW, STR[,COUNT=0]) |
تعيد النص الناتج من إبدال كل مطابقة ل PAT ب NEW في STR. حيث NEW هي نص أو ووظيفة تأخذ كائن وتعيد نص
|
| re.subn(PAT,NEW, STR[,COUNT=0]) |
إبدال كما سابقتها.ولكن تعيد زوج من النص وعدد المطابقات
|
| re.split(PAT,STR[,MAX=0]) |
فصل STR عند كل مطابقة ل PAT.
|
هذا ويمكن استعمال الكائن الذي تعيده compile كما التي بالجدول بالصيغة التالية.
- CPAT.match(STR[,POS][,ENDPOS])
- CPAT.search(STR[,POS][,ENDPOS])
- CPAT.findall(STR)
- CPAT.sub(NEW, STR[,COUNT=0])
- CPAT.subn(NEW, STR[,COUNT=0])
- CPAT.split(STR[,MAX=0])
الكائن الخاص الذي تعيده match وأخواتها له الخواص(عناصر) التالية
| pos |
نقطة البداية index التي بدأ التطابق عندها
|
| endpos |
نقطة نهاية index التطابق.
|
| re |
السلسلة النص التي استعملت كتعبير قياسي للبحث عنه
|
| string |
النص الذي نبحث فيه
|
هذا مثال
#!/usr/bin/python
# python and RE's
import re
str1="This is a string and it's a good string"
myre1=re.compile(r"^This") # a line starts with "This"
myre2=re.compile(r"\b\w*ood\b") # a word end's with ood
myre3=re.compile(r"\bt\w*\b,",re.I) # a word start's with t or T (case insensitive)
if (myre1.search(str1)):
print "RE 1 ws found"
if (myre2.match(str1)):
print "RE 2 ws found"
if (myre3.match(str1)):
print "RE 3 ws found"
r=myre3.findall(str1)
print "number of RE 3 matches is ", len(r)
print "and they are"
for i in r
print i,
print
لاحظ استعمال تعابير خاصة مثل
- \A
بداية السلسلة
- \b
حدود الكلمة الواحدة، بدايتها أو نهايتها.
- \B
في غير بداية أو نهاية الكلمة الواحدة
- \d
أي منزلة رقمية، تكافئ [0-9].
- \D
أي محرف غير رقمي، تكافئ [^0-9].
- \s
أي فراغ تكافئ [ \t\n\r\f\v].
- \S
أي محرف غير الفراغات تكافئ [^ \t\n\r\f\v].
- \w
أي حرف أو رقم (وتعتمد على إعدادات اللغة)
- \W
أي محرف ليس حرفاً ولا رقماً.
- \Z
نهاية السلسلة.
6.5.5 المزيد من الوظائف
هذه قائمة بأهم الوظائف
| execfile(FILENAME) |
تنفذ الملف FILENAME
|
| eval(STR) |
حساب قيمة STR وكأنها أمر مثلاً eval("1+2") تعطي 3
|
| input([PROMPT]) و raw_input([PROMPT]) |
سؤال المتخدم ليقوم بالإدخل حيث PROMPT هي الرسالة التي تظهر.
الأولى تقوم بحساب ما أدخله والثانية تبقيه كما هو.
|
| range(START [,END[,STEP]]) |
تعيد قائمة تعد من START وحتى END بزيادة STEP في كل مرة
|
| xrange(START [,END[,STEP]]) |
تعد من START وحتى END بزيادة STEP في كل مرة دون توليد قائمة
|
| slice([START,] END [,STEP]) |
تعيد كائن slice?! من START وحتى END بزيادة STEP في كل مرة
|
| xrange(START [,END[,STEP]]) |
تعد من START وحتى END بزيادة STEP في كل مرة دون توليد قائمة
|
| reduce(FUNC ,LIST) |
تطبيق العملية FUNC على عناصر LIST للحصول على قيمة واحدة
|
| len(OBJ) |
عدد عناصر OBJ
|
| max(LIST)و min(LIST) |
القيمة العظمى والصغرى للقائمة LIST
|
| cmp(X,Y) |
تعيد -1 أو 0 أو 1 حسب إشارة X-Y
|
| abs(X) |
القيمة المطلقة ل X
|
| round(X,N=0) |
تقريب X ل N منزلة عشرية
|
| pow(X,Y [,Z]) |
X مرفوعة للقوة Y وإذا حددت Z يؤخذ الباقي عند القسمة عليها
|
| div(X,Y) |
ناتج وباقي القسمة X/Y على كل زوج مرتب
|
| chr(N) |
تعيد سلسلة نصية بها المحرف المقابل للرقم N
|
| ord(C) |
حيث C سلسلة من محرف واحد. تعيد رقم هذا المحرف
|
| str(OBJ) |
تحول OBJ إلى سلسلة نصية
|
| int(OBJ) |
تحول OBJ إلى رقم صحيح
|
| long(OBJ) |
تحول OBJ إلى رقم صحيح طويل
|
| float(OBJ) |
تحول OBJ إلى رقم نسبي float
|
| oct(X) |
تحول الرقم X إلى سلسلة نصية بالتمثيل الثماني
|
| hex(X) |
تحول الرقم X إلى سلسلة نصية بالتمثيل الست-عشري
|
| complex(X,Y) |
تعيد العدد المركب X+Yj
|
| list(SEQ) |
تحويل المتسلسلة SEQ إلى قائمة
|
| tuple(SEQ) |
تحويل المتسلسلة SEQ إلى tuple تلك التي بالأقواس الهلالية.
|
| filter(FUNC,SEQ) |
أخذ العناصر من SEQ التي تعيد FUNC واحد وحذف تلك التي تعطي صفر
|
6.5.6 التعامل مع الملفات
أولاً تعريف كائن ملف (أي فتح ملف) بواسطة
open([FILENAME [,MODE='r'])
حيث FILENAME هو اسم الملف و MODE هو الطور كما في سي
(القراءة هو التلقائي)
بعد ذلك يمكن التعامل معه ب
| print [>> FILEOBJ,] [STR1 [, STR2 ]... [,] |
الطباعة داخل ملف F (أو الشاشة إذا لم يحدد)
|
| F.read([SIZE]) |
قراءة أول SIZE من الملف (أو كل الملف)
|
| F.readline() |
قراءة سطر من الملف
|
| F.write(STR) |
كتابة STR في الملف
|
| F.readlines() |
قراءة أسطر الملف وتعيد قائمة بها
|
| F.writelines(LIST) |
تكتب القائمة LIST كأسطر في الملف
|
| F.seek(OFFSET[,WHENCE=0]) |
التحرك OFFSET عن بداية الملف أو الموقع الحالي أو نهاية الملف
حسب قيم WHENCE التالية 0 أو 1 أو 2 على الترتيب.
|
| F.tell() |
تعيد الموقع الحالي
|
| F.flush() |
إفراغ ال buffer أي إهمال ما لم يقراء بعد
|
| F.close() |
إغلاق الملف
|
| F.fileno() |
تعيد واصف الملف fd انظر وظائف حزمة os
|
| F.isatty() |
هل الملف TTY
|
6.5.7 أهم الحزم modules/packages
يمكن إضافة المزيد من الوظائف والأصناف من خلال الحزم يتم إضافة الحزمة ب
import MODULE
لمعرفة ماذا توفر dir(MODULE) كما لاحظنا سابقاً مع string.
هذا جدول بأهم ما توفره الحزم من متغيرات ووظائف.
| الحزمة sys |
| sys.argv |
هذا المتغير يحتوي المعاملات الممررة للبرنامج مثلاً
sys.argv[0] هي المسار للبرنامج.
|
| sys.exit(N=0) |
الخروج من البرنامج
|
| sys.exitfunc |
الوظيفة التي يشير لها هذا المتغير تنفذ قبل الخروج
|
| sys.platform |
اسم المنصة (النظام) انظر os.name
|
| sys.maxint |
أكبر قيمة للعدد الصحيح
|
| sys.setdefaultencodin(ENCODING) |
تحديد نظام الترميز ليكون ENCODING
|
| sys.getrecursionlimit و sys.setrecursionlimit(N) |
معرفة وتحديد قيمة الحد الأعلى للاستدعاء الذاتي
|
| متغيرات الحزمة os |
| os.name |
اسم نظام التشغيل
|
| os.error |
متغير به آخر خطأ
|
| os.curdir |
الرمز الذي يمثل الدليل الحالي - قيمته "."
|
| os.pardir |
الرمز الدليل الأب - قيمته ".."
|
| os.sep |
الرمز الذي يفصل الأدلة - قيمته "\\" أو "/"
|
| os.sep |
الرمز الذي يفصل المسارات PATH - قيمته ";" أو ":"
|
| os.linsep |
الرمز الذي يفصل الاسطر - قيمته "\r\n" أو "\n"
|
| os.environ |
قاموس يحتوي متغيرات البيئة - للوصول لقيمة PATH مثلاً
os.environ["PATH"]
|
| وظائف الحزمة os |
| os.mkdir(PATH[,MODE]) و os.makedirs(PATH,[MODE=0777]) |
فتح الدليل PATH وفق الأذونات MODE
الأولى تشترط وجود الأدلة التي ينتمي لها والثانية تفتحهم إن لم يوجدوا
|
| os.rmdir(PATH) و os.removedirs(PATH) |
حذف الدليل PATH
|
| os.unlink(PATH) و os.remove(PATH) |
حذف الدليل PATH (لا فرق بينهما)
|
| os.rename(OLDNAME,NEWNAME) |
تغيير/نقل OLDNAME إلى NEWNAME انظر shutil
|
| os.getcwd() و os.chdir(PATH) |
معرفة و تغيير الدليل الحالي (كما pwd و cd في سطر الأوامر)
|
| os.listdir(PATH) |
قائمة بالملفات الموجودة في الدليل PATH
|
| os.chmod(PATH,MODE) |
تغيير أذونات الملف PATH
|
| os.stat(PATH) |
معلومات عن الملف PATH مثل
st_size و st_atime و st_mtime و st_ctime و st_ino و st_uid و st_gid
|
| os.utime(PATH, (A,M) ) |
تعديل وقت آخر وصول وتعديل للملف PATH لتكون A و M على الترتيب
|
| os.times() |
الوقت انظر حزمة time
|
| os.open(FILE,FLAG, MODE) |
فتح الملف بطريقة واصف الملف fd انظر مكتبة سي
|
| os.read(FD, N) |
القراءة من الملف FD بما لا يزيد عن N
|
| os.write(FD, STR) |
كتابة STR في الملف FD
|
| os.lseek(FD, POS,WHENCE) |
تحريك مؤشر الملف FD بمقدار POS حيث WHENCE تأخذ 0 أو 1 أو 2
|
| os.close(FD) |
إغلاق الملف
|
| os._exit(N) |
الإجبار على الخروج -دون إغلاق الملفات وتحرير الذاكرة- استعمل sys.exit
|
| os.execv(PATH, ARGV) |
تنفيذ PATH بالمعاملات ARGV أولها المسار نفسه. تستعمل مع fork
|
| os.system(COMMAND) |
تنفيذ COMMAND بواسطة shell المفضل
|
| os.pipe() |
عمل أنبوب - تعيد زوج مرتب r و w طريقة استعماله كما في مكتبة سي
|
| os.fork() |
تفريع/إنشاء عملية بنت
|
| os.popen(COMMAND,[MODE='r']) |
تنفيذ البرنامج COMMAND باستعمال shell ثم عمل أنبوب
|
| os.getpid() |
معرف العملية للبرنامج
|
| os.wait() |
انتظار إنتهاء العمليات البنت للبرنامج
|
| os.waitpid(PID,OPTIONS) |
انتظار إنتهاء العمليات PID
|
| os.kill(PID,SIGNAL) |
كما في أمر kill من سطر الأوامر
|
| وظائف حزمة path وهي جزء من os |
| os.path.dirname(PATH) |
أخذ الدليل بحذف آخر عنصر من PATH
|
| os.path.basename(PATH) |
أخذ اسم الملف فقط الجزء الأخير من PATH
|
| os.path.split(PATH) |
فصل PATH لمكونيه السابقين وتعيدهما على شكل زوج مرتب
|
| os.path.splitext(PATH) |
فصل PATH إلى زوج مرتب من اسم وامتداد
|
| os.path.abspath(PATH) |
تحويل PATH إلى مطلق مثلاً بحل ".."
|
| os.path.expanduser(PATH) |
حل "~" في PATH
|
| os.path.expandvars(PATH) |
حل "$VAR" في PATH
|
| os.path.exists(PATH) |
هل PATH موجود
|
| os.path.isabs(PATH) |
هل PATH مسار مطلق
|
| os.path.isdir(PATH) |
هل PATH دليل/مجلد
|
| os.path.islink(PATH) |
هل PATH وصلة
|
| os.path.ismount(PATH) |
هل PATH نقطة ضم
|
| os.path.join(P1[,P2[,...]]) |
تركيب P1 و P2 .. لعمل مسار (وذلك بوضع os.sep بينها)
|
| os.path.getsize(FILENAME) |
مساحة الملف FILENAME بالبايت
|
| os.path.getmtime(FILENAME) |
وقت آخر تعديل في FILENAME بالثواني بعد 1970
|
| os.path.getatime(FILENAME) |
وقت آخر وصول في FILENAME بالثواني بعد 1970
|
| وظائف الحزمة shutil |
| shutil.copy(SRC, DEST) |
نقل الملف SRC إلى DEST (يجب أن لا يكو موجوداً)
|
| shutil.copytree(SRC, DEST[, SYMS]) |
نقل الملفات في SRC إلى DEST إذا كانت SYMS واحد يتم التعامل مع الوصلات
|
| shutil.rmtree(PATH) |
حذف كل ملفات PATH
|
| وظائف الحزمة time |
| time.sleep(SEC) |
تعليق تشغيل البرنامج SEC من الثواني
|
| time.time() |
عدد نسبي يمثل الوقت الحالي بالثواني منذ 1970 بالتوقيت العالمي UTC/GMT
|
| time.gmtime(SEC) و time.localtime(SEC) |
تركيب يمثل الوقت المعطى SEC الأولى عالمي والثانية محلي. يحتوي
(year aaaa, month(1-12),day(1-31), hour(0-23), minute(0-59), second(0-59), weekday(0-6, 0 is monday), Julian day(1-366), daylight flag(-1,0 or 1))
|
| time.asctime(TM) و time.strftime(FMT,TM) |
تحويل التركيب TM إلى سلسلة نصية وفي لثانية وفق الهيئة FMT
|
| time.mktime(TM) |
تحويل TM إلى عدد ثواني
|
| time.strptime(STR[,FMT]) |
تستقبل النص STR وفق FMT وتحوله إلى تركيب كالذي يعيده localtime
|
| حزمة math |
| math.pi |
متغير قيمته النسبة التقريبية "باي"
|
| math.e |
متغير قيمته عدد euler تقريباً 2.71828183 يسمى هـ
|
| math.fabs(X) |
القيمة المطلقة
|
| math.floor(X) و math.ceil(X) |
اقتران أكبر عدد صحيح وأقل عدد صحيح
|
| math.fmod(X, Y) |
باقي القسمة X/Y
|
| math.modf(X) |
الجزء النسبي من الرقم X للجزء الصحيح اطرحهما
|
| math.frexp(X) و math.ldexp(X, Y) |
تقسيم الرقم بالصورة الهندسية 0.3x10+9
إلى كسر وقوة
|
| math.sin(X) و math.asin(X) |
جيب الزاوية و الاقتران العكسي له
|
| math.cos(X) و math.acos(X) |
جيب تمام الزاوية و الاقتران العكسي له
|
| math.tan(X) و math.atan(X) و math.atan2(X, Y) |
ظل الزاوية و الاقتران العكسي له والعكسي ل X/Y
|
| math.sinh(X) و math.cosh(X) و math.tanh(X) |
اقترنات hyperbolic
|
| math.exp(X) |
رفع عدد euler للقوة X
|
| math.log(X) و math.log10(X) |
اللوغاريتم الطبيعي وللأساس 10
|
| math.pow(X, Y) و math.sqrt(X) |
رفع X للقوة Y وأخذ الجذر التربيعي لX
|
6.5.8 البرمجة الموجهة للكائنات
تعريف صنف يكون بالكلمة المفتاحية class بالصيغة
class MyClass [(MyClassBase1 , MyClassBase2... )]:
حيث MyClass هو الصنف و MyClassBase1 هي الصنف الوالد/القاعدة له.
كل الوظائف يجب أن تأخذ معامل أول هو self يشبه this* في سي++.
نعرف وظيفة وظيفة البناء ب__init__
والهدم __del__.
المتغيرات الأعضاء member variables في الصنف تكون ب self.X
يمكنك وضع وظائف وصنوف في ملف مستقل واستعماله كمكتبة
في برنامج آخر وذلك ب import MODULE
حيث MODULE اسم الملف دون py.
وإذا كنت تريد التأكد من أن المكتبة لن تنفذ بالخطأ
أو تريد عرض رسالة تبين كيفية استعمالها ...
تكون بفحص __name__ مثلاً
ضع في آخر الملف الخاص بها
if __name__ == "__main__":
print """
Hello, I'm a lib used by other programs
don't runme
"""
#!/usr/bin/python
# this is SimpleClass.py
# OOP and classes
class Simple:
# the self arg is just like this (you can't delete it)
def __init__(self, str):
print "Inside the Simple constructor"
self.s = str
# Two methods:
def show(self):
print self.s
def showMsg(self, msg):
print msg + ':',
self.show() # Calling another method
# if we are runed as a prog (else then this file is used as module)
if __name__ == "__main__":
# Create an object:
x = Simple("constructor argument")
x.show()
x.showMsg("A message")
#!/usr/bin/python
# Inheritance
# search for SimpleClass.py and import it
from SimpleClass import Simple
class Simple2(Simple):
def __init__(self, str):
print "Inside Simple2 constructor"
# You must explicitly call
# the base-class constructor:
Simple.__init__(self, str)
def display(self):
self.showMsg("Called from display()")
# Overriding a base-class method
def show(self):
print "Overridden show() method"
# Calling a base-class method from inside
# the overridden method:
Simple.show(self)
class Different:
def show(self):
print "Not derived from Simple"
if __name__ == "__main__":
x = Simple2("Simple2 constructor argument")
x.display()
x.show()
x.showMsg("Inside main")
def f(obj): obj.show() # One-line definition
f(x)
f(Different())
#!/usr/bin/python
# i18n with python
os.environ.get("LC_LOCAL")
import gettext
gettext.bindtextdomain ("myprog", "/usr/share/locale")
gettext.textdomain ("myprog")
_=gettext.gettext
# any thing to be translated passed to _( )
print _("Hello I'll be translated")
حتى يعمل المثال التالي عرف متغير البيئة PYTHONPATH
ليشير للمجلد الذي يحتوي الملف مثلاً PYTHONPATH="./" gtk-test.py
أو ضع الأسطر التالية:
import sys
import os
sys.path.append(os.path.dirname(sys.argv[0]))
# or
# sys.environ["PYTHONPATH"]=os.path.dirname(sys.argv[0])
قبل import gtk هذا هو البرنامج
#!/usr/bin/python
# gtk-test.py: simple gtk2 example
import gtk
def hello_cb(button):
print "Hello World"
window.destroy()
window = gtk.Window(gtk.WINDOW_TOPLEVEL) # create a top level window
window.connect("destroy", gtk.mainquit) # quit the event loop on destruction
window.set_border_width(10) # set padding round child widget
button = gtk.Button("Hello World")
button.connect("clicked", hello_cb) # call hello_cb when clicked
window.add(button) # add button to window
button.show() # show button
window.show()
gtk.main() # enter the main event loop
البرنامج التالي يكافئ المثال بلغة سي الوارد في فصل
8.3 مكتبة GTK وبرنامج glade لبرمجة التطبيقات:
#!/usr/bin/python
import sys
import gtk
def quit(*args):
gtk.main_quit()
def findsum(*args):
x=float(entry1.get_text())
y=float(entry2.get_text())
z=x+y
entry3.set_text(str(z))
win = gtk.Window()
table=gtk.Table(4,2)
label1=gtk.Label('First number: '); entry1=gtk.Entry();
label2=gtk.Label('Second number: '); entry2=gtk.Entry();
label3=gtk.Label('Summation : '); entry3=gtk.Entry()
ok = gtk.Button(stock='gtk-ok');
cancel = gtk.Button(stock='gtk-cancel');
win.add(table)
table.attach(label1,0,1,0,1,gtk.FILL); table.attach(entry1,1,2,0,1,gtk.FILL);
table.attach(label2,0,1,1,2,gtk.FILL); table.attach(entry2,1,2,1,2,gtk.FILL);
table.attach(label3,0,1,2,3,gtk.FILL); table.attach(entry3,1,2,2,3,gtk.FILL);
table.attach( ok ,0,1,3,4); table.attach(cancel,1,2,3,4);
entry1.set_editable(gtk.TRUE)
entry2.set_editable(gtk.TRUE)
entry3.set_editable(gtk.FALSE)
# another method entry1.set_property('editable',gtk.FALSE)
ok.connect('clicked', findsum)
cancel.connect('clicked', quit)
win.connect('destroy', quit)
win.show_all()
gtk.main()
المثال التالي يوضح طريقة تحميل ملفات glade
import gtk
import gtk.glade
def some_handler(widget):
pass
xml = gtk.glade.XML('filename.glade')
widget = xml.get_widget('widgetname')
xml.autoconnect({
'some_handler': some_handler
})
gtk.main()
المثال التالي لاستخدام python في بناء مواقع CGI الديناميكية :
#!/usr/bin/python
# python and CGI
import cgi
print """
<html>
<body>
<h1>Hello world</h1>
</body>
</html>
"""
بإمكانك تعلم python وذلك بتشغيل برنامج python بطريقة تفاعلية
وكتابة برنامك سطراً فسطر، كما يمكنك استخدام وظيفة help
مع تمرير الصنف لها مثلاً اكتب import gtk
ثم help(gtk.Toolbar) لمعرفة الطرق والخصائص المتعلقة به.
بعض الروابط
www.python.org
www.python.sf.net
www.starship.python.net
www.vex.net/parnassus
www.zope.com
www.pythonware.com
www.devshed.com
www.mindview.net/Books/TIPython
members.nbci.com/alan_gauld/tutor/tutindex.htm
aspn.activestate.com/ASPN/Python/cookbook
www.networkcomputing.com/unixworld/tutorial/005/005.html
www.vic.auug.org.au/auugvic/av_paper_python.html
| اطلب نسختك مجاناً |
|
لكي تصلك أقراص لينكس أوبونتو Ubuntu أصلية
مجاناً والتوصيل مجاناً لن تدفع فلساً واحداً ولن تجبر على رؤية دعايات.
كل ما عليك هو أن
تنقر هنا.
|
ننصح باستخدام متصفحات الوب الحرة، جرب ثعلب النار الآن
يمكنك الحصول على الكثير من البرامج الحرة عالية الجودة
من هنا مجاناً
التدخين حرام

كن كحامل المسك ولا تكن كنافخ الكير
Generously Hosted by www.JadMadi.net
|
| |