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

هشام رزق الله

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

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

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

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

    31

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

  1. إن لغة بايثون ديناميكية (حيوية) لذا فأنت لا تحتاج إلى الإعلان عن الأشياء بدون تعيين قيمة لها فهم موجودين بشكل تلقائي عندما تقوم بتعيينهم، لذلك إذا أردت الإعلان عن كتغيرفيمكنك تعيين قيمة لا شيء لذلك المتغير عن طريق كلمة None كما في المثال التالي: var = None هذه الطريقة جيدة لكنك سوف تحصل في النهاية على متغير غير مهيئ. يمكنك أيضا الإعلان عن سلسلة نصية عن طريق السطر التالي: var = "" أو يمكنك الإعلان عن عدد صحيح عن طريق تعيين رقم صفر إلى ذلك المتغير: var = 0
  2. لو افترضنا أنك كتبت التالي في نموذج HTML: <input type="text" name="username"> فإنه هنالك طرق متعددة للحصول على المتغيرات المطلوبة، فلو كنت تستخدم raw cgi يمكنك الحصول على متغير username كالتالي: import cgi form = cgi.FieldStorage() print form["username"] أما لو كنت تستخدم Django أو Pylons أو Flask أو Pyramid فيمكنك الحصول على متغيرات GET و POST عن طريق مكتبة request كما في المثال التالي: print request.GET['username'] # for GET form method print request.POST['username'] # for POST form method وفي حالة استخدامك لـ Turbogears أو Cherrypy فيمكنك استعمال دالة request من مكتبة cherrypy: from cherrypy import request print request.params['username'] وأما في web.py فيكفي أن تكتب السطرين التاليين: form = web.input() print form.username كما ترى فإن هنالك العديد من الطرق لفعل ذلك اعتمادا على الإطار الذي تستخدمه.
  3. من أشهر وأفضل الطرق للحصول على قائمة مرشحة من الملفات الموجودة داخل مجلد معين في بايثون هي عن طريق استخدام دالة glob من مكتبة glob كما في المثال التالي الذي استخدمنا فيه مثال سطر أوامر نظام لينكس: glob.glob('145592*.jpg') وإذا أريدت الحصول على تطابقات أكثر تعقيدا، فيمكنك فعل ذلك عن طريق استخدام القوائم وre.match() كما في المثال التالي: files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)] وفي النهاية يمكنك استخدام هذا المثال الذي يبدو أبسط بكثير (لكنه أطول): import os relevant_path = "[path to folder]" included_extenstions = ['jpg', 'bmp', 'png', 'gif'] file_names = [fn for fn in os.listdir(relevant_path) if any(fn.endswith(ext) for ext in included_extenstions)] المصدر
  4. هنالك العديد من المبتدئين الذي يخطئون بين علامة التعيين = ورمز المساواة في المقارنة == وبين هذا الرمز الذي يستعمل في حالات تعدد القيم فمثلا لو وضعنا مجال للأرقام بين 1 و5 ومن ثم وضعنا النتيجة === 3 فإن ناتج هذه العملية سيكون true لأن 3 هو في المجال بين 1 و5. المزيد من الأمثلة حول استخدام ===: (1..5) === 3 # => true (1..5) === 6 # => false Integer === 42 # => true Integer === 'fourtytwo' # => false /ell/ === 'Hello' # => true /ell/ === 'Foobar' # => falseإن الاستخدام الأصلي للعامل === في التعابير الحالة (case expressions) فمثلا السطور التالية: case foo when bar baz when quux flurb else blarf end يمكنك استبدالهم بهذه: _temp = foo if bar === _temp baz elsif quux === _temp flurb else blarf end
  5. هنالك عدّة طرق لحذف عنصر معين في بايثون في حالة وجوده، فمثلا يمكن كتابة جملة شبه إنجليزية للتأكد من وجود العنصر ومن ثم الحذف كما في المثال التالي: if thing in some_list: some_list.remove(thing) جرّب أيضًا استخدام try except كما في المثال الثاني: try: some_list.remove(thing) except ValueError: pass # or scream: thing not in some_list! except AttributeError: pass # call security, some_list not quacking like a list! كما يمكنك استخدام دوال lambda وfilter للتأكد والحذف كما يبدو ذلك في المثال التالي: is_not_thing = lambda x: x is not thing cleaned_list = filter(is_not_thing, some_list) وأما الطريقة الأخيرة فهي طريقة حسابية وسنستخدم فيها حلقة التكرار for كما في المثال التالي: for item in (x for x in some_list if x is not thing): do_your_thing_with(item) المصدر
  6. يمكنك تقسيم السلسلة النصية حسب الحروف بعدة طرق في لغة بايثون، فيمكنك على سبيل المثال استخدام حلقة التكرار for مع دوال range و len لتقسيم السلسة النصية ووضع كل رقمين معا كعنصر في قائمة، كما في المثال التالي: >>> line = '1234567890' >>> n = 2 >>> [line[i:i+n] for i in range(0, len(line), n)] ['12', '34', '56', '78', '90'] كما يمكنك تقسيم النص عن طريق دالة findall من وحدة Re فيكفي أن تقوم بتمرير عدد الحروف (عن طريق وضع نقاط) ومن ثم السلسلة النصية وستحصل على قائمة من عناصر كل عنصر يحتوي على رقمين: >>> re.findall('..','1234567890') ['12', '34', '56', '78', '90']
  7. نعم هنالك فرق بسيط بين الدالة والإجراء يجب أن يعرفه كل مبرمج، فالفرق بينهم أن الإجراء هو مجموعة من الأسطر البرمجية التي تقوم بعمل شيء معين عند استدعاءها لكنها لن ترجع أي قيمة أو متغير في النهاية أما الدالة فهي أيضا مجموعة من الأسطر البرمجية التي تقوم بعمل شيء معين عند استدعاءها والفرق بينها وبين الإجراء أن الدالة تقوم بإرجاع قيمة أو متغير معين في النهاية. في الوقت الحالي، الكثير من المبرمجين يستخدمون مصطلح دالة لوصف الدالة والإجراء.
  8. هنالك عدّة طرق للتأكد من رابط معين في روبي، على سبيل المثال استخدام وحدة URI الموجودة مع وحدات روبي القياسية وربطها مع جملة شرطية if حتى تتمكن من القيام بأوامر معين عند تحقق الشرط (صحة الرابط) كما في المثال التالي: require 'uri' if url =~ URI::regexp # Correct URL endكما يمكنك استخدام وحدة addressable والتي أجدها أذكى في التعامل مع الروابط عن طريق إنشاء دالة كما في المثال التالي: require 'addressable/uri' SCHEMES = %w(http https) def valid_url?(url) parsed = Addressable::URI.parse(url) or return false SCHEMES.include?(parsed.scheme) rescue Addressable::URI::InvalidURIError false endالمصدر
  9. هنالك عدّة طرق لعرض عدد حقيقي برقمين بعد الفاصلة في ريلز، على سبيل المثال استخدم تابع number_with_precision ومن ثم تمرر له عدد الأرقام التي تريدها بعد الفاصل في معامل :precision => كما في المثال التالي: number_with_precision(1.5, :precision => 2) => 1.50 وسيصبح شكله كالتالي داخل النموذج: <%= f.text_field :cost, :class => 'cost', :value => (number_with_precision(f.object.cost, :precision => 2) || 0) %> حسب المثال الذي وضعته فيبدو أنك تحتاج إلى عرض سعر محدد، وفي هذه الحالة يمكنك استخدام تابع number_to_currency كما في المثال التالي: <% price = 45.9999 %> <price><%= number_to_currency(price)%></price> => <price>$45.99</price> المصدر 1 2
  10. نعم، يملك بايثون العديد من أنظمة إدارة الحزمة لكن أشهرها يدعى Python Package Index أو PyPI ويتم اختصار اسمه إلى pip ويتميز بسهولة استخدامه ويمكنك تثبيته بسهولة على أنظمة لينكس عن باستخدام easy_install عن طريق الأسطر التالية: curl -O http://python-distribute.org/distribute_setup.py python distribute_setup.py easy_install pip ولتثبيت حزمة عن طريق pip يمكنك بسهولة كتابة pip install متبوعا باسم الحزمة كما في المثال التالي: pip install MyProject ولتحديث حزمة مثبتة سابقا على نظامك يكفي أن تضيف خيار –upgrade كما في المثال التالي: pip install --upgrade MyProject ولتثبيت نسخة معينة من حزمة يكفي كتابة السطر التالي: pip install MyProject==1.0 المصدر
  11. هنالك عدّة طرق لمعرفة الفرق بين قاموسين في لغة بايثون، فيمكنك مثلا استخدام عمليات set على المفاتيح لحساب الفرق بينهما كما يظهر في المثال التالي: diff = set(dictb.keys()) - set(dicta.keys()) ويمكنك أيضا معرفة الفرق بين قاموسين عن طريق حلقة تكرار for مع استخدام الجملة الشرطية if لطباعة المفتاح غير موجود في القاموسين كما في المثال التالي: dicta = {"a":1,"b":2,"c":3,"d":4} dictb = {"a":1,"d":2} for key in dicta.keys(): if not key in dictb: print key أيضًا جرّب استخدام الجملة الشرطية if فقط وفي سطر واحد للحصول على العناصر غير موجودة في أحد القاموسين كما في المثال التالي: if any(True for k in dictB if k not in dictA): ...
  12. هنالك عدةّ طرق للطباعة في سطر واحد في لغة بايثون، وبما أنك أردت استخدام print للطباعة فيجب عليك أن تضع فاصلة بعد العنصر الذي تريد طباعته حتى لا يتم الرجوع إلى السطر (تعمل في الإصدار 2.7 من بايثون): print item, أما لو كنت تستخدم إحدى الإصدارات الجديدة من بايثون مثل الإصدار 3 ففي هذه الحال يمكنك تمرير النهاية التي تريدها إلى دالة print بدلا من الرجوع إلى السطر. قمنا في هذا المثال بوضع مسافة: print(item, end=" ")
  13. إن الطريقة الأولى والتي تُستخدم فيها obj.nil? تستدعي تابع #nil? الموروث من صنف والذي سيرجع true فقط في حالة ما كان الكائن فارغ nil، أما الطريقة الثانية وهي طريقة obj == nil فسيتم عمل مقارنة بين الكائن و nil وسيرجع true فقط في حالة ما إذا كان الكائن nil، أي أن الطريقتين تقومان بنفس المهمة وهي التأكد من محتوى كان معين ما إذا كان nil أو لا ولكن بطرق مختلفة. يمكنك استخدام أي طريقة تناسب أثناء برمجتك فلا توجد أسباب محددة لاستخدام أي واحدة منها.
  14. المشكلة أن التواريخ الافتراضية من نوع mm/dd/yy والتي يتم إنشاءها من خلال تابع Date.parse تم حذفها من روبي 1.9 لأن هذه الصيغة للتاريخ تختلف من بلد لآخر، فهي yy/mm/dd في اليابان و mm/dd/yy في الولايات المتحدة الأمريكية و dd/mm/yy في البلدان الأوروبية، لذلك حتى لا تحدث مشاكل وخلط بين التواريخ تم فرض استخدام تابع strptime وذلك لإعطاء صيغة التاريخ إلى جانب التاريخ كما في المثال التالي: ruby-1.9.2-p136 :022 > Date.strptime '03/21/2011', '%m/%d/%Y' => #<Date: 2011-03-21 (4911283/2,0,2299161)>
  15. هنالك عدة طريق للتأكد من سلسلة نصية معينة ما إذا كانت ASCII أو لا في لغة بايثون، فمثلا يمكنك إنشاء دالة للتكرار على جميع الحروف الموجودة في السلسلة النصية واختبار ترتيبها ما إذا كان أقل من 128 أو لا، فإذا كان ترتيب جميع حروفها أقل من 128 فهذا يعني أن السلسلة النصية من نوع ASCII كما في المثال التالي: def is_ascii(s): return all(ord(c) < 128 for c in s) يمكنك أيضا أن تقوم بفك تشفير السلسلة النصية باستخدام دالة decode مع تمرير ASCII لها، فإذا تم التشفير دون مشاكل فهذا يعني أن السلسلة النصية من نوع ASCII كما في المثال التالي: try: mystring.decode('ascii') except UnicodeDecodeError: print "it was not a ascii-encoded unicode string" else: print "It may have been an ascii-encoded unicode string"
  16. إن جملة else تعمل فقط عندما يكون ناتج الجملة الشرطية خاطئا، أي أنه في حالات استخدام break للخروج من حلقة التكرار أو في حالات حدوث أخطاء exception فإن else لن تعمل. البنية العامة للجملة الشرطية if مع else: if condition: handle_true() else: handle_false() مثال لاستخدام else مع حلقة التكرار while: while condition: handle_true() else: # condition is false now, handle and go on with the rest of the program handle_false() يمكنك استخدام else في التطبيقات العادية التي تحتوي على حلقات التكرار حيث ستضعها في نهاية الحلقة للتعامل مع حالات غير متوقعة/ غير عادية، فمثلا، إذا كنت تكرر على عناصر قائمة للبحث عن قيمة معينة فيمكنك استخدام حلقة تكرار for مع else: for value in values: if value == 5: print "Found it!" break else: print "Nowhere to be found. :-("
  17. هنالك طرق متعددة لمعرفة أقرب قيمة لقيمة معينة في مصفوفة في بايثون حسب حالة المصفوفة، فإذا كانت المصفوفة مرتبة وكبيرة للغاية فأسرع حل هو استخدام دالة تأخذ معاملين؛ الأول المصفوفة والثانية القيمة التي تريد البحث عن أقرب رقم لها في المصفوفة: def find_nearest(array,value): idx = np.searchsorted(array, value, side="left") if math.fabs(value - array[idx-1]) < math.fabs(value - array[idx]): return array[idx-1] else: return array[idx] هذه الدالة ستعمل بشكل سريع في المصفوفات الكبيرة ويمكنك بسهولة تغييرها لترتيب المصفوفة إذا كنت غير متأكد من ترتيبها.
  18. هنالك عدة طرق في لغة روبي لتحويل السلاسل النصية التي تحتوي على تاريخ إلى متغير من نوع تاريخ لاستخدمها في تطبيقك، فيمكنك على سبيل المثال استخدام تابع Date.strptime حيث ستمرر لها السلسلة النصية مع صيغة التاريخ للسلسلة النصية كما في المثال التالي: Date.strptime("{ 2009, 4, 15 }", "{ %Y, %m, %d }") ويمكنك أيضا استخدام Date.parse مع تابع gsub للتحويل كما في المثال التالي: s = "{ 2009, 4, 15 }" d = Date.parse( s.gsub(/, */, '-') )
  19. هنالك عدة طرق في بايثون لتمرير خيار حالة الأحرف غير حساسة، فهنالك مثلا دوال لا تحتاج إلى طريقة معينة، فيمكنك تمرير هذا الخيار (خيار حالة الأحرف غير حساسة في بايثون هو re.IGNORECASE ) مباشرة إلى الدالة كما في دالة re.search و re.match واللتان تظهران في المثال التالي مع جعل خيار re.IGNORECASE كخيار ثالث: re.search('test', 'TeSt', re.IGNORECASE) re.match('test', 'TeSt', re.IGNORECASE)أما لو أردت استخدام re.sub فيمكنك في هذه الحالة استخدام شيفرة برمجية مثل هذه: result = re.sub(r'(?i)test', 'OOOO', 'TeSt')المصدر
  20. هنالك فروقات بين القوائم والقواميس، فالقوائم تحافظ على ترتيب العناصر في حين أن القواميس لا تحافظ عليها، لذلك عندما تحتاج في برنامج إلى المحافظة على الترتيب فيجب عليك في هذه حالة استخدام القوائم. أما القواميس فتحتوي على مفاتيح كل واحدة منها مرتبطة بقيمة معينة في حين أن القوائم تحتوي فقط على القيم. فباختصار، إذا أردت تسلسل عناصر مرتبة فاستخدم القوائم، وأما لو أردت قيم مرتبطة بمفاتيح، فاستخدم القواميس.
  21. هنالك طرق متعددة لإنشاء أرشيف zip مضغوط من مجلد معين في لغة بايثون، فيمكنك على سبيل المثال استخدام مكتبة zipfile التي ستسهل عليك العملية. الوثائق الرسمية لهذه المكتبة تُخبرك بالدوال الموجودة ووظيفتها لكنها لا تخبرك بكيفية استخدامها لضغط مجلد كامل، لذلك وجدت أنه من الأفضل شرح ذلك عن طريق الشيفرة البرمجية التالية: #!/usr/bin/env python import os import zipfile def zipdir(path, ziph): # ziph is zipfile handle for root, dirs, files in os.walk(path): for file in files: ziph.write(os.path.join(root, file)) if __name__ == '__main__': zipf = zipfile.ZipFile('Python.zip', 'w') zipdir('tmp/', zipf) zipf.close()ومن الطرق السهلة أيضا هي عن طريق استخدام دالة make_archive من مكتبة shutil والتي تدعم كلا من صيغ zip و tar. مثال على استخدام الدالة: import shutil shutil.make_archive(output_filename, 'zip', dir_name) المصدر
  22. من الأخطاء الشائعة لدي المبدئين في لغة بايثون أنهم يعتقدون أن جميع المتغيرات وبجميع أنواعها يمكن تغيير قيمتها، لكن هذا الأمر غير صحيح لأنه هنالك في بايثون متغيرات لا يمكن تغيير قيمتها ويجب عليك إسناد قيمة جديدة لها، ومن بين هذه المتغيرات السلاسل النصية. وهذا يعني أن السطر X.replace("hello","goodbye") سوف يُرجع نسخة من X من التغييرات التي قمت بها، ولذلك سوف تحتاج إلى إسناد هذه النسخة الجديدة من السلسلة النصية السابقة إلى متغير جديد (استخدمنا نفس المتغير) كما في المثال التالي: X = X.replace("hello", "goodbye")
  23. هناك عدّة طرق لفعل ذلك أسهلها استخدام التابع المدمج split() للفصل بين الحروف من ثم استخدام حلقة التكرار each للتكرار حول هذه الحروف كما يظهر هذا في المثال التالي: "ABCDEFG".split("").each do |i| puts i end ويمكنك تطوير الشيفرة البرمجية السابقة قليلا لتكون تابع داخل صنف كما في المثال التالي: class String def each_char self.split("").each { |i| yield i } end end كما يمكنك استخدام تابع each_byte الموجود في لغة روبي كما في المثال التالي: "ABCDEFG".each_byte do |i| puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end
  24. في العديد من لغات البرمجة (كما في الروبي) هنالك قيم متعددة تساوي true حسب القيم المنطقية boolean، وأما البقية (القليلة) فهي تساوي false. بالنسبة إلى روبي فالشيئين الوحيدين اللذان تكون قيمتهم المنطقية false هي false نفسها و nil وعدا ذلك فهي true. فإذا قمت بنفي (جعله false) أحد القيم أو المتغيرات أو أي شيء آخر فإن قيمته المنطقية ستكون عكس التي كانت في البداية وأما لو قمت بعمل نفي مرتين عن طريق العامل الحسابي !! فإنه سيتم نفيه مرتين وبالتالي سيعود إلى قيمته المنطقية الأولى ولن يتغير.
  25. يمكنك استخدام طرق مُتعدّدة لاختبار قيمة معينة مع متغيرات عديدة، فيمكنك على سبيل المثال وضع 3 شروط على 3 متغيرات مع الفصل بينهم عن طريق العامل الحسابي or فإذا كان أحد هذه المتغيرات يساوي قيمة العدد الصحيح فيمكنك القيام بأوامر محددة كما في المثال التالي: if x == 1 or y == 1 or z == 1:أو يمكنك اختصار السطر السابق باختبار العدد الصحيح فيما إذا كان موجود في أحد هذه المتغيرات كما في المثال التالي: if 1 in (x, y, z): أو يمكن أن يكون الاختصار كالتالي: if 1 in {x, y, z}:
×
×
  • أضف...