اذهب إلى المحتوى

هشام رزق الله

الأعضاء
  • المساهمات

    1442
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    31

كل منشورات العضو هشام رزق الله

  1. هنالك فرق كبير بين استخدام s% وr%. إن s% تُحوّل الكائن باستخدام دالة str() أما r% فتحوله باستخدام repr(). لن تلاحظ الفرق في بعض الكائنات مثل الأعداد الصحيحة لكن دالة repr() تقوم بإرجاع الناتج كصياغة بايثون صحيحة والتي تستخدم لإعادة إنشاء الكائن الذي يمثله. تستطيع اعتبار أن r% تُرجع ناتج خام وتُستخدم في الغالب في تنقيح تطبيقات بايثون لإيجاد الأخطاء بصورة أسرع. مثال على الفرق بين s% و r% باستخدام الوقت من دالة date من وحدة datetime: >>> import datetime >>> d = datetime.date.today() >>> str(d) '2011-05-14' >>> repr(d) 'datetime.date(2011, 5, 14)' المصدر
  2. يمكنك التحقق من بداية سلسلة نصية في بايثون فيما إذا كانت تبدأ بسلسلة نصية معينة (حروف، كلمات، جملة …) أو لا؛ بطريقتين الأولى استخدام الدالة المدمجة startswith والتي تمرر لها البادئة المراد التحقق من وجودها في أوّل السلسلة النصية كما في المثال التالي: aString = "hello world" aString.startswith("hello") الطريقة الثانية استخدام التعابير النمطية fوضع شرط على دالة match من وحدة re ومن ثم تمرر لها تعبير نمطي والسلسلة النصية التي تريد التأكد منها كما في المثال التالي: import re if re.match('^hello', somestring): whatever
  3. إن المستخدم الجذر أو sudo يُستخدم في القيام بأشياء لا يجب على المستخدم العادي القيام بها لأنها قد تُسبب خطر إفساد أو تغيير إعدادات النظام بطريقة لا يسمح بها مدير النظام في العادة. فالأمور التي ذكرتها مثل إدارة الحزم وتغيير الإعدادات قد تُسبب ضرر في النظام إذا حدث خطأ ما، لذلك من الأفضل أن يتحمل هذه المسؤولية مدير النظام.
  4. إن الخدمات في أنظمة لينكس معرفة في ملفات وحدة تملك لاحقة “.service” لذلك إذا أردت إيقاف عمل خدمة معينة فيجب عليك استخدام systemctl مع الاسم الكامل لوحدة الملف (على سبيل المثال خدمة بلوتوث تسمى bluetooth.service). وفي حالة نسيانك كتابة اللاحقة “.service” فسيقوم الأمر بإضافة هذه اللاحقة بشكل افتراضي، فمثلا هذين السطرين متشابهين في الوظيفة: $ systemctl disable bluetooth.service وفي المثال التالي لم نكتب اللاحقة لكن الأمر نُفّذ كما كان متوقع: $ systemctl disable bluetooth
  5. هنالك عدة طرق يمكنك من خلالها حذف ملف قد لا يكون موجودا، فيمكنك على سبيل المثال استخدام try except على دالة remove من وحدة os ومن ثم تستثني خطأ OSError كما في المثال التالي: try: os.remove(filename) except OSError: pass هذه الطريقة تتكون من عدة أسطر وتبدو قبيحة نوعا ما، ولتجنبها يمكنك أن تتأكّد أولًا من وجود الملف عن طريق استخدام دالة os.path.exists() التي سترجع true إذا كان الملف أو المجلد موجودا. الحل بسطر واحد: os.remove(fn) if os.path.exists(fn) else None المصدر
  6. نعم يمكنك تقسيم النصوص في لغة بايثون وبطرق متنوعة عن طريق إضافة بعض الرموز أي أنك لو قمت بتقسيم السطر عن طريق الانتقال إلى السطر الموالي والكتابة فلن يتم تقسيم سطر وستحصل على رسالة خطأ. طرق تقسيم سطر طويل إلى أسطر أقصر في لغة بايثون تختلف حسب نوع السطر الذي تريد تقسيمه فمثلا إذا أردت تقسيم سطر به أقواس فيمكنك تقسيم كما في المثال التالي: a = some_function( '1' + '2' + '3' + '4') أما لو كان السطر -مثلا- يحتوي على عمليات حسابية طويلة فيمكنك تقسيمه عن طريق الرمز \ كما في المثال التالي: a = '1' + '2' + \ '3' + '4' يمكنك أيضا استخدام الرمز \ لتقسيم الشرط كما في المثال التالي: >>> x = 10 >>> if x == 10 or x > 0 or \ x < 100: print 'True' المصدر
  7. أعتقد أن حل هذه المشكلة بسيط للغاية، فإذا كنت تستخدم الإصدار الثاني من بايثون فستكون التعليمة البرمجية لإعادة تحميل وحدة معينة كالتالي: reload(my.module) لكن في الإصدارات الحديثة للبايثون حدثت عدّة تغييرات في بايثون فمثلا لو كنت تستخدم الإصدار 3.2 و 3.3 فيجب عليك في هذه الحالة استدعاء مكتبة imp ومن ثم استخدام دالة reload، لإعادة تحميل الوحدة كما في المثال التالي: import imp imp.reload(module) وفي الإصدار 3.4 فما فوق يجب استدعاء دالة reload من وحدة importlib. أي أن حل هذه المشكلة هو التأكد من إصدار بايثون الذي يعمل عليه السكربت. المصدر
  8. تستطيع الحصول على تكرارات حرف معين في سلسلة نصية في روبي بطرق متعددة، منها استخدام التابع count() الذي سيرجع لك عدد تكرارات الحرف الذي مررته كما في هذا المثال: puts "Melanie is a noob".count('a') #=> 2 أو يمكنك الحصول على عدد تكرارات حرف معين داخل السلسلة النصية عن طريق تابع scan() والذي ستُمرر الحرف الذي تريد حساب عدد تكراراته بين رمزي / ومن ثم سيرجع لك قائمة بها تكرارات هذا الحرف (يكفي حساب طول القائمة لمعرفة عدد التكرارات): ["a","a"]
  9. هنالك ثلاثة طرق سهلة لتحويل الثواني في ريلز أو في روبي (بعض الطرق تعمل على الإثنين)، فلو افترضنا مثلا أن عدد الثواني 3600 ثانية فيمكننا تحويلها إلى كلمات عن طريق تابع distance_of_time_in_words كما في المثال التالي: distance_of_time_in_words(total_seconds) #=> "about 1 hour" وهنالك طريقة أخرى تعمل على لغة روبي أيضا وهي عن طريق استخدام عدّة توابع معا مثل تابع strftime وغيره: Time.at(total_seconds).utc.strftime("%H:%M:%S") #=> "01:00:00" أما الطريقة الثالث (تعمل على الروبي أيضا) فهي تسمح لك بتحويل عدد الثواني حتى لو كان مجموعها أكثر من 24 ساعة: seconds = total_seconds % 60 minutes = (total_seconds / 60) % 60 hours = total_seconds / (60 * 60) format("%02d:%02d:%02d", hours, minutes, seconds) #=> "01:00:00"
  10. هنالك عدة طرق للحصول على عنوان IP الخاص بالمستخدم في لغة بايثون، وأسهل هذه الطرق هي عن طريق استخدام وحدة django-ipware التي تدعم كل من IPv4 و IPv6 في الإصدار الثالث للبايثون. يجب عليك أولا أن تثبت هذه الوحدة عن طريق السطر التالي: pip install django-ipware ومن ثم للحصول على عنوان IP يمكنك استخدام تابع get_ip من وحدة ipware.ip الذي ستقوم بتمرير متغير request وبعدها سوف يرجع لك عنوان IP المطلوب إن وُجد أو سيرجع لك None كما في المثال التالي: from ipware.ip import get_ip ip = get_ip(request) if ip is not None: print "we have an IP address for user" else: print "we don't have an IP address for user" المصدر
  11. هنالك فائدة وفرق في هذا العامل، فالفرق في إصدارات لغة بايثون، في الإصدار الثالث للبايثون جعلوا العامل / يقوم فقط بعمليات القسمة بالفاصلة (أي بدون باقي) ومن ثم أضافوا عامل جديد آخر وهو العامل // الذي يقوم بعمليات القسمة الإقليدية (ناتج القسمة مع الباقي) أما في الإصدار الثاني للبايثون فإن العامل / سيقوم ببساطة بعمليات القسمة الإقليدية إلا لو كان أحد هذين المتغيرين الذي تريد أن تقوم بقسمته من نوع float ففي هذه الحالة سيقوم بعملية القسمة بالفاصلة.
  12. هنالك طرق عديدة للحصول على رقم الأسبوع من تاريخ معين في لغة بايثون، فمثلا هنالك تابع isocalendar() من وحدة datetime.date الذي يُرجع tuple يحتوي على رقم الأسبوع في العنصر الثاني (ترتيبه سيكون 1 لأن العد سيبدأ من 0) كما في المثال التالي: >>> datetime.date(2010, 6, 16).isocalendar()[1] 24 أما بالنسبة لبقية عناصر tuple ففي العنصر الأول توجد السنة والعنصر الأخير يحتوي على رقم اليوم في الأسبوع. من الطرق الأخرى للحصول على رقم الأسبوع هي عن طريق دالتي gmtime و strftime من مكتبة time كما في المثال التالي: import time from time import gmtime, strftime d = time.strptime("16 Jun 2010", "%d %b %Y") print(strftime("%U", d)) المصدر
  13. هنالك عدة طرق لتحويل سلسلة نصية إلى مصفوفة من الحروف وأسهلها استخدام الدالة المدمجة list() وتمرير السلسلة النصية التي ترغب في تقسيمها كما في المثال التالي: >>> s = "foobar" >>> list(s) ['f', 'o', 'o', 'b', 'a', 'r'] وهنالك طريقة أخرى سهلة أيضا بإنشاء مصفوفة فارغة ومن ثم إضافة السلسلة النصية إلى هذه المصفوفة حتى تصبح المصفوفة متكونة من أحرف السلسلة النصية كما في المثال التالي: In [25]: a = [] In [26]: s = 'foobar' In [27]: a += s In [28]: a Out[28]: ['f', 'o', 'o', 'b', 'a', 'r'] كما يمكنك استخدام map ودالة lambda لإنشاء المصفوفة التي تريدها كما في المثال التالي: In [36]: s = 'foobar12' In [37]: a = map(lambda c: c, s) In [38]: a Out[38]: ['f', 'o', 'o', 'b', 'a', 'r', '1', '2'] المصدر
  14. هنالك طرق مختلفة لإعادة توجيه صفحة معينة حسب إصدار دجانغو الذي تستخدمه، فمثلا يمكنك إعادة توجيه الصفحة عن طريقة دالة HttpResponseRedirect من وحدة django.http كما في المثال التالي: from django.http import HttpResponseRedirect def myview(request): ... return HttpResponseRedirect("/path/")أما لو كنت تستخدم الإصدار 1.0 من دجانغو فيجب عليك في هذه الحالة استخدام دالة redirect_to من وحدة django.views.generic.simple كما في المثال التالي: from django.views.generic.simple import redirect_to urlpatterns = patterns('', (r'^one/$', redirect_to, {'url': '/another/'}), #etc... )أما في الإصدار 1.5 فلقد تم استبدال دالة redirect_to بدالة RedirectView من وحدة django.views.generic لتصبح الشيفرة البرمجية لإعادة توجيه الصفحة هي: from django.views.generic import RedirectView urlpatterns = patterns('', (r'^one/$', RedirectView.as_view(url='/another/')), )المصدر
  15. يمكنك معرفة نوع الملف بعدة طرق في لغة روبي فمثلا يمكنك تثبيت حزمة filemagic من gem كالتالي: gem install ruby-filemagic ومن ثم نستدعي الوحدة ونستخدمها في الحصول على معلومات حول نوع الملف الذي قمنا بتمريره إلى تابع file من نفس الوحدة كما في المثال التالي: $ irb irb(main):001:0> require 'filemagic' => true irb(main):002:0> fm = FileMagic.new => #<FileMagic:0x7fd4afb0> irb(main):003:0> fm.file('foo.zip') => "Zip archive data, at least v2.0 to extract" irb(main):004:0>إذا كنت تستخدم أنظمة يونكس – Unix فيمكنك استخدام هذا الحل: mimetype = `file -Ib #{path}`.gsub(/\n/,"") ملاحظة: بالاعتماد على نوع نظام التشغيل قد تحتاج إلى تغيير "l” إلى "i”. كما يمكنك إنشاء آلية خاصة بك لمعرفة نوع الملف.
  16. هنالك عدة أنواع من لغة الأسمبلي، لكن أشهرها في الوقت الحالي هي ARM وMIPS وx86. فـ ARM تُستخدم في الأغلب في أجهزة الهاتف أما MIPS فهي تُستخدم في أنظمة موتورولا وماك بالإضافة إلى بعض أجهزة الألعاب في حين أن x86 يستخدم في حواسيب Intel. قد تعتقد أن هنالك أكثر من لغة أسمبلي لكن جميعها متشابهة فأساسيات لغة أسمبلي واحدة (نفس تعليمات البرمجية) لكن هنالك اختلافات بسيطة في برامج التجميع وفي اختلاف نوع الأجهزة ولوحة الأم المثبتة في الجهاز.
  17. إذا أردت تنفيذ تعابير موجودة في سلسلة نصية فيمكنك في هذه الحالة استخدام eval() وهذه الدالة تعمل مع العمليات الحسابية حيث تقوم بالعمليات الحسابية الموجودة في سلسلة نصية كما يلي: >>> x = eval("2+2") >>> x 4 >>> x = eval("2+2") >>> x 4 أما إذا أردت تنفيذ تعليمات برمجية طويلة مثل سطور للطباعة أو دوال أو غيرها من التعليمات فيمكنك في هذه الحالة أن تقوم باستخدام دالة exec لتنفيذ الأوامر كالتالي: >>> mycode = 'print "hello world"' >>> exec mycode Hello world ملاحظة: في الإصدار الثالث للبايثون أصبحت exec دالة. المصدر
  18. للأسف فحسب علمي لا توجد دالة مدمجة للحصول على مواقع تكرارات كلمة معينة في بايثون لكن على الرغم من ذلك توجد العديد من الطرق لفعل ذلك الأمر بدون استدعاء أي دوال أو وحدات. يمكنك على سبيل المثال، استخدام التعابير النمطية للحصول على ما أردته كما في هذا المثال: >>> [m.start() for m in re.finditer('test', 'test test test test')] [0, 5, 10, 15] أو يمكنك استخدام حلقة التكرار for مع دالة startswith كما في هذا المثال: >>> string = "test test test test" >>> [i for i in range(len(string)) if string.startswith('test', i)] [0, 5, 10, 15] def find_all(a_str, sub): start = 0 while True: start = a_str.find(sub, start) if start == -1: return yield start start += len(sub) # use start += 1 to find overlapping matches list(find_all('spam spam spam spam', 'spam')) # [0, 5, 10, 15]المصدر
  19. نعم، يمكنك قراءة ملفات .mat عن طريق بايثون وبطرق متعددة حسب إصدار ملفات mat، فإذا كنت تريد قراءة ملفات .mat بنسخة ما قبل 7.3 نستخدم دالة loadmat من مكتبة scipy.io كما في المثال التالي: import scipy.io mat = scipy.io.loadmat('file.mat') لكن إذا كنت تحتاج إلى استخدام نسخة 7.3 أو أحدث من ملفات .mat فيمكنك في هذه الحالة استخدام دالة h5py من وحدة numpy بسبب أن ملفات matlab هي قواعد بيانات من نوع hdf5. مثال على استخدام وحدة numpy: import numpy as np, h5py f = h5py.File('somefile.mat','r') data = f.get('data/variable1') data = np.array(data) # For converting to numpy array المصدر
  20. هنالك عدة طرق لمعرفة فرق الأيام بين تاريخين في بايثون، فإذا كنت تملك كائنين من نوع تاريخ date قمت بعملهم عن طريق دالة date الموجودة في وحدة datetime، فأسهل طريق لمعرفة فرق الأيام هي عن طريق طرح تاريخ الأول من التاريخ الثاني ومن ثم تنفيذ دالة days عليهم لمعرفة عدد الأيام (يمكنك طباعة الناتج لاحقا)، مثال: from datetime import date d0 = date(2008, 8, 18) d1 = date(2008, 9, 26) delta = d0 - d1 print delta.daysكما يمكنك استخدام دوال datetime وstrptime ومن ثم طرح التاريخ الثاني من التاريخ الأول: from datetime import datetime date_format = "%m/%d/%Y" a = datetime.strptime('8/18/2008', date_format) b = datetime.strptime('9/26/2008', date_format) delta = b - a print delta.days # that's it المصدر
  21. هنالك عدة طرق للمقارنة بين الإصدارات في روبي فيمكنك على سبيل المثال استخدام هذا كشرط للمقارنة ومعرفة الإصدار الأكبر بين الإصدارين: Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1') وهنالك طريقة ثانية عن طريق استخدام Gem::Dependency مع تابع match?() وnew حيث نمرر رقم الإصدار الأول في new وأما الإصدار الثاني فسنمرره إلى تابع match?() للمقارنة بين هذين الإصدارين كما في المثال التالي: Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4') أو يمكنك إنشاء صنف جديد للمقارنة بين الإصدارات كما يظهر في المثال التالي: class Version < Array def initialize s super(s.split('.').map { |e| e.to_i }) end def < x (self <=> x) < 0 end def > x (self <=> x) > 0 end def == x (self <=> x) == 0 end end p [Version.new('1.2') < Version.new('1.2.1')] p [Version.new('1.2') < Version.new('1.10.1')] المصدر
  22. يجب أن يعمل السطران اللذان كتبتهما بدون مشاكل، فدالة tuple() تقوم بتحويل السلاسل النصية إلى tuple كما في المثال التالي: In [1]: l = [4,5,6] In [2]: tuple Out[2]: <type 'tuple'> In [3]: tuple(l) Out[3]: (4, 5, 6)لكن إذا أعدت تعريف tuple لتصبح متغير tuple بدلا من type tuple كما في المثال التالي: In [4]: tuple = tuple(l) In [5]: tuple Out[5]: (4, 5, 6)وسوف تحصل على رسالة خطأ بما أن tuple لا يمكن استدعاؤها كما في المثال التالي: In [6]: tuple(l) TypeError: 'tuple' object is not callable ويمكنك الحصول على التعريف الأصل لـ tuple عن طريق إعادة تشغيل مفسر باثون أو عن طريق حذف دالة tuple كالتالي: In [6]: del tuple In [7]: tuple Out[7]: <type 'tuple'>وهذا النوع من الأخطاء شائع عند المبتدئين ونادر عند المحترفين إلا في حالة لو كان أكثر من شخص يعمل على برمجة نفس السكربت.
  23. إن السطر الأول الذي به مسار مفسر بايثون هو سطر مهم حيث سيُمكن من تنفيذ السكربت بشكل مستقل بدون كتابة python مسبقا في الطرفية أو عندما تضغط مرتين على الملف في مدير الملفات المثبت على نظامك (إذا تم وضع الإعدادات الملائمة لذلك). على الرغم من أن وضع هذا السطر غير ضروري إلا أنه من الأفضل أن يوضع حتى يفهم قارئ الشيفرة المصدرية الخاصة بك ما الذي يَنظُر إليه. ملاحظة: لا تستخدم السطر التالي: #!/usr/local/bin/python لأن بايثون قد يكون مثبت في /usr/bin/python أو في /usr/bin/python وفي هذه الحالة ستفشل عملية تشغيل الملف. المصدر
  24. يمكنك استخدام دالة split من وحدة shlex حيث ستقوم بالمطلوب كما في المثال التالي: >>> import shlex >>> shlex.split('this is "a test"') ['this', 'is', 'a test'] أو يمكنك استخدام التعابير النمطية على الرغم من أن استخدام الطريقة السابقة أفضل بكثير كما في المثال التالي: test = 'this is "a test"' # or "this is 'a test'" # pieces = [p for p in re.split("( |[\\\"'].*[\\\"'])", test) if p.strip()] # From comments, use this: pieces = [p for p in re.split("( |\\\".*?\\\"|'.*?')", test) if p.strip()] شرح التعابير النمطية: [\\\"'] لعلامات الاقتباس المفردة والمزدوجة.* معناها أي شيء( |X) فراغ أو قيمة X.strip() معناها احذف الفراغ وفواصل السلسلة النصية الفارغةومن الطرق الأخرى لفصل محتوى سلسلة نصية يمكنك الاستعانة بوحدة csv مع وضع الفراغ كمُحدد كما في المثال التالي: import csv lines = ['this is "a string"', 'and more "stuff"'] for row in csv.reader(lines, delimiter=" "): print rowوسيكون الناتج: ['this', 'is', 'a string'] ['and', 'more', 'stuff'] المصدر
  25. هنالك عدة طرق لتغيير اسم سلسلة نصية وتحويلها إلى اسم ملف معين، فيمكنك على سبيل المثال استخدام وحدة string ومن ثم استخدام متغيرات ascii_letters و digits والتي تحتوي على الحروف والأرقام والرموز التي يمكن أن يُدعى بها ملف معين ثم وباستخدام حلقة التكرار for سنتأكد من جميع حروف السلسلة النصية وحذف الحروف غير الصحيحة ومن ثم عرض اسم الملف الصحيح كما في المثال التالي: >>> import string >>> valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits) >>> valid_chars '-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' >>> filename = "This Is a (valid) - filename%$&$ .txt" >>> ''.join(c for c in filename if c in valid_chars) 'This Is a (valid) - filename .txt'
×
×
  • أضف...