6.5 لغة البرمجة python كتاب لينكس الشامل >>

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)

tipتلميح

عدل البرنامج ليتعامل مع حالة السالب والصفر ثم عدله ليستعمل خوارزمية 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

هناك نوع خاص من المنظومات يسمى القاموس لكنه لا يعتمد على رقم للوصول للقيمة بل يكون على كل تقابل كما بين الكلمة ومعنها في القاموس الورقي ، حيث هو مزاوجة بين مفتاح وقيمة. يتم تحديده بواسطة الحاصرة {} حيث يفصل المفتاح عن القيمة ‘:‘

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 مثلاً

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 كما التي بالجدول بالصيغة التالية.

الكائن الخاص الذي تعيده 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") # start 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 and case insins
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

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

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()

#!/usr/bin/python
# python and CGI
import cgi
print """
<html>
<body>
<h1>Hello world</h1>
</body>
</html>
"""
بعض الروابط
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


<< السابق كتاب لينكس الشامل التالي >>