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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك الكثير من الخيارات، فيمكنك على سبيل المثال استخدام قوالب دجانغو من دون استخدام كامل المكتبة لكن قد تحتاج إلى تعريف بعض الإعدادات ليعمل المشروع دون مشاكل. مثال لنموذج بسيط لاستخدام قوالب دجانغو دون كامل الإطار: >>> from django.template import Template, Context >>> from django.conf import settings >>> settings.configure() >>> t = Template('My name is {{ my_name }}.') >>> c = Context({'my_name': 'Daryl Spitzer'}) >>> t.render(c) u'My name is Daryl Spitzer.' ملاحظة: قم بزيارة التوثيق الرسمي للمزيد من المعلومات. يمكنك أيضا استخدام Jinja2 فصياغته تشبه دجانغو مع بعض الاختلافات البسيطة وستحصل على محرك قوالب أقوى وأسرع. ومن محركات القوالب الشهيرة أيضا في بايثون Genshi.
  2. نعم، هنالك مكتبة "للعشوائيات" في لغة بايثون تدعى random وتُستخدم للحصول على الأرقام العشوائية. تمتلك هذه المكتبة العديد من الدوال المفيدة لتوليد أرقام عشوائية والتي من أبرزها وأكثرها انتشارا دالة randrange المُستخدمة في الحصول على أعداد عشوائية في مجال أعداد صحيحة. أما بالنسبة للأرقام الحقيقية فيمكنك استخدام دالة uniform والتي تحتاج أن تمرر لها العدد الأول للمجال والعدد الأخير للمجال ومن ثم ستحصل على عدد عشوائي بين العدد الأول والأخير كما في المثال التالي: >>> random.uniform(1.5, 1.9) 1.8733202628557872 المصدر
  3. في العادة يتم استخدام eval لتحويل سلسلة نصية إلى شيفرة برمجية لكن بما أنه يمكن أن تكون السلسلة النصية من مدخلات المستخدم لذلك سنستخدم طرق غيرها لأسباب أمنية. إذا كنت تستخدم الإصدار 2.6 من بايثون فما فوق يمكنك في هذه الحالة استعمال ast بدلا من eval كما في المثال التالي: import ast l = ast.literal_eval('[ "A","B","C" , " D"]') l = [i.strip() for i in l] وهنالك طريقة أخرى باستخدام وحدة numpy والتي ستُرجع قائمة بدون تعديلات (بدون حذف الفراغات الزائدة): x = u'[ "A","B","C" , " D"]' list_string = str(x) import numpy as np print np.array(list_string) والنتيجة: >>> [ "A","B","C" , " D"] المصدر
  4. هنالك العديد من الطرق لإضافة عدد من الأيام إلى تاريخ في بايثون، لكن بما أنك استخدمت دالة datetime فسأشرح طريق الإضافة بواسطتها. المشكلة في الشيفرة البرمجية السابقة شائعة لدى المبتدئين والمتوسطين في بايثون وتحدث بسبب استدعاء دالة واحدة من وحدة معينة ومن بعد ذلك تستخدم دالة أخرى من نفس الوحدة ناسيا أنك لم تستدعي كامل الوحدة، لذلك لإصلاح شيفرتك البرمجية السابقة تحتاج إلى إضافة هذا السطر فقط: from datetime import timedelta
  5. هنالك عدّة طرق في روبي لإنشاء مثيل صنف من اسمه على شكل سلسلة نصية، فإذا كنت تستخدم ريلز على سبيل المثال، استعمل الدالة constantize وهي أسهل وأقصر الطرق كما تبدو في المثال التالي: clazz = 'ExampleClass'.constantize لو لم ترد استخدام ريلز فيمكنك استعمال دالة const_get في روبي كما في المثال التالي: clazz = Object.const_get('ExampleClass') أما في حالة وجود وحدات كما في المثال التالي: module Foo class Bar end end فيمكنك استخدام هذه الطريقة: > clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c} => Foo::Bar > clazz.new => #<Foo::Bar:0x0000010110a4f8>
  6. هنالك الكثير من الطرق التي تُمكنك من دمج السلاسل النصية في بايثون، وأسهل هذه الطرق هي عن طريق دمجها باستخدام العامل الحسابي + كما في المثال التالي: Section = 'Sec_' + Section ويمكنك أيضا دمجها عن طريق تنسيق السلسلة النصية باستخدام s% كما تظهر في المثال التالي: section = "C_type" new_section = "Sec_%s" % section وهذه الطريق تسمح لك إلى جانب الإضافة إمكانية وضع السلسلة النصية الثانية في أي موقع من السلسلة النصية الأولى كما في المثال التالي: section = "C_type" new_section = "Sec_%s_blah" % section طريقة أخرى: >>> a='a' >>> b='b' >>> print '%s and %s' %(a,b) a and b كما يمكنك استخدام الدالة join() لكنها أصعب في القراءة: >>> Section = 'C_type' >>> new_str = ''.join(['Sec_', Section]) # inserting a list of strings >>> print new_str >>> 'Sec_C_type' المصدر
  7. هنالك عدّة طرق للحصول على قائمة من التكرار من قائمة معينة في بايثون، فإذا افترضنا أنك لا تريد تكرار الأعداد مرة أخرى في القائمة الثانية (قائمة التكرارات) أي أن كل عدد متكرر سيتم وضعه في القائمة مرة واحدة فيمكنك فعل ذلك عن طريق كتابة سطر واحد فقط باستخدام حلقة التكرار for والجملة الشرطية ودالة Counter() من وحدة collections كما في المثال التالي: a = [1,2,3,2,1,5,6,5,5,5] import collections print [item for item, count in collections.Counter(a).items() if count > 1] ## [1, 2, 5]كما يمكنك فعل ذلك أيضا عن طريق استخدام set والذي سيكون في هذه الحالة أفضل من استعمال Counter: seen = set() uniq = [] for x in a: if x not in seen: uniq.append(x) seen.add(x) أو بشكل مختصر أكثر: seen = set() uniq = [x for x in a if x not in seen and not seen.add(x)]
  8. يمكنك الحصول على مواقع عناصر معينة في قائمة بالشروط التي تريدها وذلك عن طريق كتابة سطر واحد ومن ثم ستحصل على القائمة والتي يمكنك طباعتها فيما بعد. سنستخدم حلقة التكرار for مع دالة enumerate() والجملة الشرطية التي تريدها، مثلا وضعنا في مثالنا التالي الشرط هو أن تكون قيمة العنصر 1 ليتم وضع رقم موقعها في قائمة كما في المثال التالي: [i for i,x in enumerate(testlist) if x == 1] تجربة بسيطة حول استخدام المثال السابق: >>> testlist [1, 2, 3, 5, 3, 1, 2, 1, 6] >>> [i for i,x in enumerate(testlist) if x == 1] [0, 5, 7] وإذا لم تكن ترغب في الحصول على قائمة يمكنك طباعة الناتجة مباشرة كما في المثال التالي: >>> for i in [i for i,x in enumerate(testlist) if x == 1]: ... print i ... 0 5 7
  9. هنالك طرق مختلفة للحصول على الأرقام الموجود داخل سلسلة نصية في لغة بايثون، فيمكنك على سبيل المثال فصل السلسلة النصية حسب الفراغات ومن ثم التأكد من كل جزء ما إذا كان عدد صحيح موجب أم لا وذلك عن طريق استخدام دوال int و split وisdigit بالإضافة إلى حلقة التكرار والجملة الشرطية كما في المثال التالي: >>> str = "h3110 23 cat 444.4 rabbit 11 2 dog" >>> [int(s) for s in str.split() if s.isdigit()] [23, 11, 2] وإذا أردت طريقة أسرع فيمكنك استخدام التعابير النمطية فهذه الطريقة تدعم حتى الأرقام الموجودة داخل الكلمات وغير مفصولة بفراغات كما في المثال التالي: >>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30') ['42', '32', '30']
  10. هنالك عدة طرق لفرز قائمة اعتمادا على عنصر معين داخل tuples، فيمكنك استخدام كلمة key مع lambda داخل دالة sorted كما في المثال التالي: sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1]) سوف تكون key في المثال السابق دالة تُعرف كيفية استرجاع العناصر القابلة للمقارنة من بنية البيانات الخاصة بالقائمة والتي ستكون في حالتنا هذه العنصر الثاني من tuple لذلك سوف نصل إليها عن طريق [1]. يمكنك استخدام طريقة أخرى أسرع وأفضل وهي عن طريق استخدام دالة itemgetter من وحدة operator كما في المثال التالي: >>> from operator import itemgetter >>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)] >>> sorted(data,key=itemgetter(1)) [('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]
  11. هنالك عدة طرق لتنظيف السلسلة النصية وإزالة المسافات الزائدة ورموز الأسطر الجديدة في لغة روبي، فيمكنك على سبيل المثال استخدام دالتي squeeze وgsub لحذف الرموز الزائدة والفراغات كما في المثال التالي: string.gsub("\n", ' ').squeeze(' ') وأبسط طريقة لحذف الفراغات داخل السلسلة النصية هي عن طريق استخدام دوال split و join معا كما في المثال التالي: s = "Hello, my\n name is Michael." s.split.join(' ') #=> "Hello, my name is Michael." ويمكنك أيضا استخدام دالة squish في حالة كنت تستخدم ريلز والتي ستحذف جميع الرموز الزائدة والفراغات. المصدر
  12. الفرق هو أن حلقة each تنفذ الكتلة المُقدمة لكل عنصر من المصفوفة ومن ثم ترجع المصفوفة نفسها. أما map فهي تنفذ الكتلة المُقدمة لكل عنصر من المصفوفة أيضًا لكنها ترجع مصفوفة جديدة بالقيم الجديدة التي تم إرجاعها بعد تنفيذ الكتلة (block). فعلى سبيل المثال لنفترض أن لدينا المصفوفة التالي: arr = ["tokyo", "london", "rio"] عندما ننفذ عليها حلقة each ستكون النتيجة كالتالي: arr.each { |element| element.capitalize } # => ["tokyo", "london", "rio"] نلاحظ أن النتيجة هي نفس المصفوفة على الرغم من تنفيذ الشيفرة البرمجية الموجود داخل كتلة each لكن القيم التي تغيرت لم يتم إرجاعها. لاحظ أنه عندما نعمل نفس الشيء مع map فسيتم إرجاع مصفوفة بالتغييرات التي أردناها: arr.map { |element| element.capitalize } # => ["Tokyo", "London", "Rio"]
  13. هنالك عدة طرق للحصول على اسم نظام التشغيل الذي يعمل به سكربت روبي، فيمكنك على سبيل المثال استخدام ثابت RUBY_PLATFORM ووضعه داخل وحدة لتسهيل عملية الحصول على الاسم كما في المثال التالي: module OS def OS.windows? (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil end def OS.mac? (/darwin/ =~ RUBY_PLATFORM) != nil end def OS.unix? !OS.windows? end def OS.linux? OS.unix? and not OS.mac? end endأو يمكنك استخدام وحدة rbconfig للحصول على اسم نظام التشغيل كما في المثال التالي: irb(main):002:0> require 'rbconfig' => true irb(main):003:0> Config::CONFIG["arch"] => "i686-linux" أو يمكنك استخدام جيم (gem) launchy والذي سيعطيك اسم نظام التشغيل بسهولة كبيرة وبدون كتابة الكثير من الأسطر كما في المثال التالي: require 'launchy' Launchy::Application.new.host_os_family # => :windows, :darwin, :nix, or :cygwin
  14. يرمز هذا الرمز في لغة روبي بالنطاق العام بدلا من المحلي، أي سيُمكنّك هذا الرمز من الوصول إلى دوال وأصناف ووحدات داخل وحدات أخرى. في حالة وجود تابع أو وحدة تبحث عنها داخل وحدات أخرى فيجب عليك إذا استدعائها بكتابة أسماء هذه الوحدات ومن ثم افصل بينها باستخدام هذا الرمز ليصبح كمسار لهذا التابع/الوحدة. لتفهم هذا الرمز بشكل أفضل انظر إلى المثال التالي والذي يشرح الوحدات الداخلية والعامة: module A def self.method; "Outer"; end end module B module A def self.method; "Inner"; end end A.method # => "Inner" ::A.method # => "Outer" end
  15. إن جميع الأعداد الصحيحة في بايثون يمكن أن يتم تمثيلها كأرقام حقيقية لديها نفس التمثيل (نفس القيمة)، لذلك إذا أردت الحصول على عدد صحيح من عدد حقيقي عن طريق حذف الأرقام بعد الفاصلة فيمكنك في هذه الحالة استخدام دالة int() بتمرير العدد الحقيقي الذي تريد تحويله كما في المثال التالي: print int(2.3) # "2" print int(math.sqrt(5)) # "2" كما يمكنك استخدام دالة round() في حالة ما أردت الحصول على أقرب عدد صحيح للعدد الحقيقي بدلا من حذف الأعداد بعد الفاصلة فقط تنفيذ ما يلي: >>> round(2.99999999999) 3 >>> round(2.6) 3 >>> round(2.5) 3 >>> round(2.4) 2
  16. المثال الذي وضعته حول فرز عناصر قوائم القائمة حسب الطول (tall/short) باستخدام sorted جيد للغاية ويمكنك تطويره بسهولة بدون إضافة أسطر إضافية ليدعم الفرز قوائم القائمة عن طريق شيئين وهما الطول واللون. للقيام بذلك سنضع في معامل key دالة lambda بداخلها tuple بها موقع الأطوال والألوان في القوائم ليتم الفرز حسب الإثنين وبشكل متزامن كما في المثال التالي: s = sorted(s, key = lambda x: (x[1], x[2])) كما يمكنك فعل نفس الشيء عن طريق استخدام دالة itemgetter من وحدة operator بدلا من lambda كما في المثال التالي: import operator s = sorted(s, key = operator.itemgetter(1, 2))
  17. هنالك فرق بين استدعاء الملفات عن طريق from … import وبين استدعائها عن طريق استخدام import فالطريقة الأولى تُستخدم لاستدعاء صنف أو دالة معينة فقط من المكتبة أو الوحدة وأما الطريقة الثانية فهي تستدعي جميع أصناف ودوال المكتبة/الوحدة المطلوبة. لذلك فإن اختيارك لاستعمال إحدى الطريقتين يعتمد على كيف تريد الوصول إلى الدوال والأصناف التي قمت باستدعائها عندما تشير إليه. لفهم الفرق بشكل أفضل أنصحك بالنظر إلى هذا المثال البسيط الذي قمنا فيه باستدعاء صنف معين بطريقتين: from urllib import request # access request directly. mine = request() import urllib.request # used as urllib.request mine = urllib.request()
  18. يمكنك استخدام طرق أخرى أقصر لفعل ذلك في روبي، فإذا كنت تستخدم الإصدار 1.9.2 فسيكون استعمال require_relative الطريقة الأفضل لاستدعاء الملفات. في الإصدارات الأخيرة للروبي تم التعديل على require حتى لا تضم المجلدات المخفية (مجلدات التي تبدأ بـ .) لأسباب أمنية، لذلك تمت إضافة require_relative لتوفير ملف محلي للوحدات المرتبطة بمسار استدعاء السكربت. كما يمكنك استعمال Kernel#__dir__ في حالة استخدامك للإصدار الثاني من روبي.
  19. يبدو للمبتدئين أنه لا يوجد فرق بين to_s و to_str إلا أنه يوجد بعض الفروق البسيطة بينهم حيث لا يوجد تابعين لهما نفس الوظيفة في أي لغة لأن هذا يعتبر مضيعة للوقت. يجب عليك أن لا تستخدم to_str إلا إذا كان الكائن يعمل كسلسلة نصية بدلا من كونه قابل للتمثيل أنه سلسلة نصية فقط. أمثلة حول الاستخدام to_s و to_str: 1.to_s # returns "1" Object.new.to_s # returns "#<Object:0x4932990>" 1.to_str # raises NoMethodError Object.new.to_str # raises NoMethodError كما ترى فإن to_s يُحوّل أي كائن إلى سلسلة نصية في حين أن to_str يُصدر خطأ عندما يكون معامله لا يبدو كسلسلة نصية.
  20. يمكنك استخدام دالة int() في بايثون 2 لتحويل وطباعة عدد ثنائي (binary) إلى عدد صحيح طبيعي، فيكفي أن تمرر لها السلسلة النصية التي تحتوي على العدد الثنائي بالإضافة إلى نظام العد الذي تستخدمه في السلسلة النصية والذي سيكون 2 لأنه يرمز إلى الأعداد الثنائية، مثال لعملية التحويل والطباعة: >>> print int('11111111', 2) 255 أما لو كنت تستخدم الإصدار الجديد (الإصدار الثالث) من بايثون فإنه يمكنك استخدام نفس الدالة للتحويل واستخدام دالة print للطباعة كما في المثال التالي: >>> print(int('11111111', 2)) 255 الفرق هو دالة الطباعة فقط. المصدر
  21. يمكنك استخدام ملف DLL في بايثون بسهولة عن طريق مكتبة ctypes، وهذه المكتبة تعتبر من المكتبات المتقدمة لكنني سأحاول شرحها بمثال بسيط وغير معقد، لذلك سأستخدم مثال لملف DLL يحتوي على دالتين وهما add و sub وكل دالة تأخذ معاملين. add(a, b) ترجع جمع العددين معا.sub(a, b) ترجع عملية طرح العددين.وسيكون اسم ملف DLL هو demo.dll وسنستخدم هذا الملف للقيام بعمليات جمع وطرح بسيطة في مثالنا التالي: from ctypes import* # give location of dll mydll = cdll.LoadLibrary("C:\\demo.dll") result1= mydll.add(10,1) result2= mydll.sub(10,1) print "Addition value:-"+result1 print "Substraction:-"+result2 وسيكون ناتج تنفيذ السطور السابقة هو التالي: Addition value:-11 Substraction:-9المصدر
  22. إن السطور التي كتبتها سليمة تماما وليس بها أي مشكلة أو خطأ برمجي ومن المفترض أن يعمل برنامجك بدون أية مشاكل، لذلك أعتقد أنك تستخدم الإصدار 2.6 من بايثون بالخطأ بدلا من الإصدار 3.2 وهذه المشكلة تحدث كثيرا لأنه في الغالب يوجد إصدارين من بايثون في توزيعات لينكس. والميزة التي استخدمتها في السطور التي نقلتها من الدرس تعمل فقط على الإصدار 3.1 من بايثون فما فوق (للنسخة الثالثة من بايثون) أو الإصدار 2.7 من بايثون فما فوق (للنسخة الثانية من بايثون).
  23. هنالك عدّة طرق للحصول على المعلومات التي تحتاجها من except في بايثون، فيمكنك على سبيل المثال استخدام وحدات sys وos وبعد ذلك الحصول على المعلومات التي تحتاجها من دالة exc_info() وعلى الملف الذي تريده من دالة path ومن ثم من أول عنصر من exc_tb.tb_frame.f_code.co_filename كما في المثال التالي: import sys, os try: raise NotImplementedError("No error") except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] print(exc_type, fname, exc_tb.tb_lineno)يوجد حل آخر أقصر من الأول وهو استخدام مكتبات traceback وos.path لطباعة المعلومات التي تريدها كالتالي: try: bla except Exception as e: import traceback, os.path top = traceback.extract_stack()[-1] print ', '.join([type(e).__name__, os.path.basename(top[0]), str(top[1])])
  24. في لغة روبي، إن كلمة fail مرادفة لكلمة raise، فهي تابع لوحدة Kernel والتي يتم تضمينها من قبل الصنف. تابع fail يُصدر خطأ من نوع "خطأ عند وقت التشغيل" (RuntimeError) كما تقوم كلمة raise، ويملك بعض الخصائص التي تميزه عن raise مثل التالية: إن تابع fail يُصدر خطأ من نوع "خطأ عند وقت التشغيل" بدون رسالة خطأ.أما fail(string) فتصدر خطأ من نوع "خطأ عند وقت التشغيل" مع رسالة الخطأ التي تم تمريرها كمعامل إلى fail.المصدر
  25. هنالك عدة طرق لتهيئة مصفوفة في خطوة واحد في روبي اعتمادا على ما تحتويه هذه المصفوفة، فيمكنك مثلا إنشاء مصفوفة عن طريق استخدام طريقة الحرفية كما في المثال التالي: array = [ '1', '2', '3' ] أما لو كان لديك مجال لعناصر المصفوفة، مثلا الأعداد من 1 إلى 3 فيمكنك استخدام طريقة المجال كما في المثال التالي: array = ('1'..'3').to_a # parentheses are required # or array = *('1'..'3') # parentheses not required, but included for clarity كما يمكن استخدام طريقة الفراغات لتهيئة المصفوفة بالعناصر المطلوبة كما في المثال التالي: array = %w[ 1 2 3 ] ومن الطرق المتقدمة تمرير كتلة (block) إلى Array.new واستخدامها لتحديد ما هي القيم التي تريد وضعها في المصفوفة: array = Array.new(3){ |i| (i+1).to_s }
×
×
  • أضف...