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

هشام رزق الله

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

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

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

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

    31

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

  1. يستخدم هذا الرمز في العادة مع السلاسل النصية في لغة بايثون خاصة عند تقسيم السلسلة النصية حيث يعني "لا تقم بأي شيء للمعامل الأول، ولا تقم بأي شيئ للمعامل الثاني وانقل مباشرة إلى المعامل الثالث" والمعامل الثالث عند تقسيم السلسلة النصية هو الذي يحدد الخطوات أي أن معنى الرمز الذي وضعته هو كل ثالث عنصر من السلسلة النصية. بالنسبة للعاملات السلسلة النصية فهي على الشكل التالي a[start:end:step] وتعني موقع البداية وموقع النهاية والخطوة. المصدر
  2. هنالك عدّة طرق لدمج المصفوفات مع بعض لتشكيل أزواج كما في دالة zip في بايثون، فلو افترضنا أنك تريد كتابة دالة وأن جميع المصفوفات متساوية في الحجم – كما يفترض أن تكون – بالإضافة إلى أنك ستمرر قائمة من القوائم المعاملات (على عكس النسخة الموجودة في بايثون حيث تكون قائمة المعاملات متغيرة) فيمكنك كتابة سطور مشابه لهذه: function zip(arrays) { return arrays[0].map(function(_,i){ return arrays.map(function(array){return array[i]}) }); } // > zip([[1,2],[11,22],[111,222]]) // [[1,11,111],[2,22,222]]] // If you believe the following is a valid return value: // > zip([]) // [] // then you can special-case it, or just do // return arrays.length==0 ? [] : arrays[0].map(...)أما في حالات عدم تساوي حجم المصفوفات فيمكنك في هذه الحالة استخدام هذه الطريقة التي ستحذف (ستدّعي عدم وجودها) قائمة العناصر التي لا تحتوي على جميع العناصر: function zip() { var args = [].slice.call(arguments); var shortest = args.length==0 ? [] : args.reduce(function(a,b){ return a.length<b.length ? a : b }); return shortest.map(function(_,i){ return args.map(function(array){return array[i]}) }); } // > zip([1,2],[11,22],[111,222,333]) // [[1,11,111],[2,22,222]]] // > zip() // []
  3. هنالك عدّة طرق في لغة روبي لفرز أحرف سلسلة نصية بترتيب أبحدي فيمكنك على سبيل المثال استخدام توابع chars و sort و join للترتيب كما في المثال التالي: str.chars.sort.join #=> "Sginrt" أما في حالة ما أردت فرز السلسلة النصية دون الاهتمام بحالة الأحرف (كما في مثالك)، فيمكنك استخدام هذه الطريقة للفرز: str.chars.sort { |a, b| a.casecmp(b) } .join #=> "ginrSt" ومن الطرق المفيدة أيضا يمكنك استخدام هذه الطريقة كما في المثال التالي: str = "String" str.chars.sort_by(&:downcase).join #=> "ginrSt" المصدر
  4. أعتقد أن أسهل حل لهذه المشكلة هي تعريف ما هي الحروف الصحيحة وحذف جميع الرموز غيرها، أما إذا كنت بحاجة إلى الأحرف الإنجليزية الكبيرة والصغيرة بالإضافة إلى الأرقام وتريد حذف كل الرموز المتبقية فيمكنك في هذه الحالة استخدام سطر مثل التالي عن طريق تابع gsub: input = input.gsub(/[^0-9A-Za-z]/, '') أما إذا أردت الحصول على أحرف آسكي ASCII فقط فيمكنك في هذه الحالة حذف جميع الحروف التي تملك ترتيب أكبر من 127 في جدول آسكي كما في المثال التالي: original = "aøbauhrhræoeuacå" cleaned = "" original.each_byte { |x| cleaned << x unless x > 127 } cleaned # => "abauhrhroeuac"
  5. لدي مصفوفات NumPy تابع tolist() لتحويل مصفوفة NumPy إلى قائمة في لغة بايثون، هذا هو تعريفها من التوثيق الرسمي: وكمثال بسيط على استخدام هذا التابع لنستعمله في تحويل المثال الذي ذكرته في سؤالك كما في المثال التالي: import numpy as np >>> np.array([[1,2,3],[4,5,6]]).tolist() [[1, 2, 3], [4, 5, 6]] لاحظ أننا حوّلنا إلى مصفوفة Numpy ومن ثم حولناه إلى قائمة.
  6. بما أنك تتعامل مع المنافذ فسأفترض أنك تستخدم مكتبة socket ، وفي هذه الحالة إذا أردت الحصول على منفذ فارغ فلا تربط التطبيق إلى منفذ محدد، أو اربطه بمنفذ رقم 0 كما في هذا المثال: sock.bind(('', 0)) بعد ذلك سيختار نظام التشغيل منفذ فارغ متاح لك، وإذا أردت الحصول على رقم هذا المنفذ فيمكنك استخدام هذا السطر: sock.getsockname()[1] بالمناسبة، في العادة تكون منافذ ما بين 1024 و65535 لتطبيقات المستخدم لذلك يمكنك أن تختار أي منفذ تريده من بين هذه المنافذ.
  7. يمكنك فرز قائمة بالاعتماد على قيم من قائمة أخرى بعدّة طرق في لغة بايثون، فيمكنك على سبيل المثال دمج القائمتين معًا ومن ثم فرزها واستخدام حلقة for للحصول على النتيجة المطلوبة كما في المثال التالي: >>> yx = zip(Y, X) >>> yx [(0, 'a'), (1, 'b'), (1, 'c'), (0, 'd'), (1, 'e'), (2, 'f'), (2, 'g'), (0, 'h'), (1, 'i')] >>> yx.sort() >>> yx [(0, 'a'), (0, 'd'), (0, 'h'), (1, 'b'), (1, 'c'), (1, 'e'), (1, 'i'), (2, 'f'), (2, 'g')] >>> x_sorted = [x for y, x in yx] >>> x_sorted ['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g'] يمكنك دمج السطور السابقة لتحصل على التعليمة التالية: [x for y, x in sorted(zip(Y, X))] ومن الطرق السهلة أيضا تحويل القائمتين إلى قاموس ومن ثم فرز القائمة الأولى بالاعتماد على مفاتيح القاموس كما في المثال التالي: >>> X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] >>> Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1] >>> keydict = dict(zip(X, Y)) >>> X.sort(key=keydict.get) >>> X ['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g'] >>> X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] >>> Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1] >>> keydict = dict(zip(X, Y)) >>> X.sort(key=keydict.get) >>> X ['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g'] ويمكنك تحويل الأسطر السابقة إلى سطر واحد بسيط كما في المثال التالي: >>> X.sort(key=dict(zip(X, Y)).get)
  8. هنالك عدة طرق للحصول على عنوان IP للزائر باستخدام بايثون وإطار flask، فعلى سبيل المثال يمكنك استخدام سمة remote_addr من دالة request من مكتبة إطار flask بالإضافة إلى دالة jsonify من نفس المكتبة. مثال لاستخدام الدالتين السابقتين: from flask import request from flask import jsonify @app.route("/get_my_ip", methods=["GET"]) def get_my_ip(): return jsonify({'ip': request.remote_addr}), 200أو يمكنك فعل ذلك عن طريق استخدام الطريقة التالية: request.environ['REMOTE_ADDR'] ملاحظة: قد يتسبب استخدام برامج البروكسي بعض الأخطاء عند محاولة الحصول على عنوان IP، وفي هذه الحالة قد لا تحصل على العنوان الصحيح. المصدر
  9. نعم هنالك عدة طرق في بايثون للتحكم بمؤشر الفأرة (تحريك المؤشر والضغط …)، لكن بما أنك ذكرت أنك تريد التحكم بمؤشر الفأرة على نظام ويندوز فيمكنك في هذه الحالة استخدام مكتبتي win32api و win32con حيث يمكنك إنشاء دالة للتحريك والضغط في موقع معين تقوم بتمريره لهذه الدالة كما في المثال التالي: import win32api, win32con def click(x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) click(10,10) أو يمكنك استخدام نفس المثال لكن بمكتبة ctypes حيث سنستخدم فيها ملفات dll الخاصة بنظام ويدوز كما في المثال التالي: import ctypes # see http://msdn.microsoft.com/en-us/library/ms646260(VS.85).aspx for details ctypes.windll.user32.SetCursorPos(100, 20) ctypes.windll.user32.mouse_event(2, 0, 0, 0,0) # left down ctypes.windll.user32.mouse_event(4, 0, 0, 0,0) # left up
  10. في هذه الحالة، يقومان بنفس الوظيفة، لكن هنالك فرق بينهم، لأن is تُستخدم لاختبار ما إذا كان الكائن هو نفس الكائن في حين أن == تُستخدم لمقارنة القيم ما إذا كانت متساوية أما لا كما في المثال التالي: p = [1] q = [1] p is q # False because they are not the same actual object p == q # True because they are equivalent وبما أنه هنالك None واحدة، فسيتم إرجاع true في هذه الحالة كما في المثال التالي: p = None q = None p is q # True because they are both pointing to the same "None" يُنصح باستخدام is None بشكل عام كقاعدة على الرغم من أن هذه المقارنة نادرة نوعا ما في بايثون. المصدر
  11. هنالك عدة طرق في روبي وفي ريلز للتحقق من وجود عدد معين داخل مدى معين بسطر واحد، فيمكنك على سبيل المثال استخدام تابع include? وتمرير الرقم إليه ليرجع لك هل الرقم ينتمي إلى المجال أم لا كما في المثال التالي: (1..10).include?(number) أما في ريلز فيمكنك استخدام توابع مكتبة ActiveModel::Validations حيث ستمرر لها الرقم والمدى فترجع لك true أو false حسب انتماء الرقم للمدى: validates_inclusion_of :number, :in => 1..10 أما في ريلز 3 فسيكون السطر السابق كالتالي: validates :number, :inclusion => 1..10 المصدر
  12. هنالك عدة طرق لفتح المتصفح الافتراضي في لغة روبي، فإذا أردت أن يعمل برنامجك على جميع الأنظمة فيمكنك في هذه الحالة تثبيت gem يدعى launchy عن طريق السطر التالي: $ gem install launchy ومن ثم تستخدم تابع open وتمرر لها الرابط الذي تريد فتحه في المتصفح كما في المثال التالي: require 'launchy' Launchy.open("http://stackoverflow.com")إذا كنت تريد فتح المتصفح في أنظمة ماك فقط فيمكنك في هذه الحالة استخدام السطر التالي: system("open", "http://stackoverflow.com/") أو السطر التالي: `open http://stackoverflow.com/` وفي نظام ويندوز يمكنك استخدام السطر التالي: `start http://www.example.com` أما في لينكس فهذا أبسط حل: system("xdg-open", "http://stackoverflow.com/") المصدر
  13. توجد أكثر من طريقة في لغة بايثون لتوليد السلاسل النصية العشوائية وأسهلها استخدام دالة urandom من مكتبة os حيث ستمرر لها طول السلسلة النصية المطلوبة (عدد حروفها) وسترجع لك سلسلة نصية عشوائية بالطول الذي طلبته كما في المثال التالي: import os random_string = os.urandom(string_length) هنالك من يستخدم دالة uuid4 من مكتبة uuid حيث سترجع لنا حروف عشوائية كما في المثال التالي: from uuid import uuid4 random_string = str(uuid4())وإذا أردت الحصول على طول معين وبدون رموز (-)، يمكنك استخدام الطريقة التالية: random_string_length = 16 str(uuid4()).replace('-', '')[:random_string_length]
  14. هنالك عدة طرق في بايثون للحصول على عناصر عشوائية من متغير معين (set، قائمة...)، وأغلب هذه الطرق تعتمد على المكتبة المدمجة random والتي تعمل على توليد أرقام عشوائية لاستخدامها في وظائف متنوعة مثل برامج التشفير... الشيفرة البرمجية التالية سوف تعمل على استخراج عنصرين عشوائيين من set وتعمل أيضا في حالة أن set لا يحتوي على أي عنصر أو أنه يحتوي على عنصر واحد فقط: import random random.sample(set([1, 2, 3, 4, 5, 6]), 2) استخدمنا في المثال السابق دالة sample من مكتبة random والتي مررنا فيها set وعدد العناصر التي نريد استخراجها. المصدر
  15. هنالك عدة طرق لمعرفة ما إذا كان الملف فارغا أم لا في لغة بايثون، فالملف الفارغ هو الملف الذي يكون حجمه مساويا لصفر، لذلك نحتاج إلى معرفة حجم الملف لنعرف ما إذا كان فارغا أم لا. ولمعرفة حجم الملفات يمكنك استخدام دوال stat و st_size من مكتبة os كما في المثال التالي: >>> import os >>> os.stat("file").st_size == 0 True أو يمكنك استخدام دوال path و getsize من نفس المكتبة حيث ستمرر لها المسار الكامل للملف كما في المثال التالي: import os os.path.getsize(fullpathhere) > 0
  16. هنالك عدة طرق لحساب عدد تكرارات عناصر مصفوفة في لغة روبي، وبما أنك قد كتبت أن المصفوف مرتبة فهذا الأمر سيسهل من عملية الحساب كثيرا. الطريقة التالية سوف تطبع لك كل عنصر وعدد مرات تكراراته، يمكنك تغيير طريقة الطباعة كما تشاء (مثلا تحولها إلى hash كما في مثالك): # sample array a=["aa","bb","cc","bb","bb","cc"] # make the hash default to 0 so that += will work correctly b = Hash.new(0) # iterate over the array, counting duplicate entries a.each do |v| b[v] += 1 end b.each do |k, v| puts "#{k} appears #{v} times" endأو يمكنك الحصول على عدد التكرارات عن طريق كتابة سطر واحد باستخدام تابع inject كما في المثال التالي: a = ['FATAL <error title="Request timed out.">', 'FATAL <error title="Request timed out.">', 'FATAL <error title="There is insufficient ...">'] b = a.inject(Hash.new(0)) {|h,i| h[i] += 1; h } b.to_a.each {|error,count| puts "#{count}: #{error}" }وسيكون الناتج كما في المثال التالي: 1: FATAL <error title="There is insufficient ..."> 2: FATAL <error title="Request timed out."> المصدر
  17. إن الطريقة الرسمية للتحويل بين تشفيرات السلاسل النصية المختلفة في لغة روبي 1.9 هي عن طريق استخدام تابع encode، ولحذف الحروف غير آسكي من السلسلة النصية يمكنك استعمال هذه الخيارات للتابع حتى يقوم بالمهمة كما في المثال التالي: # See String#encode encoding_options = { :invalid => :replace, # Replace invalid byte sequences :undef => :replace, # Replace anything not defined in ASCII :replace => '', # Use a blank for those replacements :universal_newline => true # Always break lines with \n } non_ascii_string.encode(Encoding.find('ASCII'), encoding_options) أو يمكنك على سبيل المثال إنشاء تابع لحذف حروف غير آسكي عن طريق استبدالها بلا شيء بواسطة تابع gsub كما يظهر في المثال التالي: class String def remove_non_ascii(replacement="") self.gsub(/[\x80-\xff]/,replacement) end end وهنالك طريقة أخرى لفعل ذلك وهي عن طريق استخدام Iconv كما في المثال التالي: class String def remove_non_ascii require 'iconv' Iconv.conv('ASCII//IGNORE', 'UTF8', self) end end
  18. هنالك طرق متعددة للتأكد من قيمة مفتاح في قاموس في لغة بايثون، والطريقة التي ذكرتها جيدة لكن يمكنك تحسينها وتسريعها، فأنت لا تحتاج إلى استدعاء المفاتيح عن طريق دالة dict.keys() بل يمكنك الاستغناء عنها كما في المثال التالي: if 'key1' in dict: print "blah" else: print "boo" وهنالك طريقة أخرى يمكنك استخدامها لكن تم الاستغناء عنها في الإصدار الجديد من بايثون (الإصدار الثالث) وهي عن طريق استخدام دالة dict.has_key(key) لمعرفة هل أن المفتاح موجود أم لا. المصدر
  19. هنالك طرق مختلفة تُمكنك من الحصول على المفتاح الذي يحتوي على اقل قيمة من قاموس معين، وأسهل هذه الطرق وأكثرها استخداما هي عن طريق استعمال دالة min() ومن ثم تمرير القاموس لها وصيغة المفتاح كما في المثال التالي: >>> d = {320:1, 321:0, 322:3} >>> d.items() [(320, 1), (321, 0), (322, 3)] >>> # find the minimum by comparing the second element of each tuple >>> min(d.items(), key=lambda x: x[1]) (321, 0) ملاحظة: في حالة كان القاموس كبيرا فيمكنك استخدام d.iteritems() فهي تعمل بشكل أفضل مع القواميس الكبيرة. كما يمكنك اختصار سطر min(d.items(), key=lambda x: x[1]) إلى السطر التالي: min(d, key=d.get) فيمكنك تحويل جزء lambda بـ get كما رأينا في المثال السابق.
  20. هنالك عدة طرق يمكنك استخدامها لطباعة رسائل الخطأ في لغة بايثون، وأسهل هذه الطرق وأبسطها هي عن طريق تحويل رسالة الخطأ إلى متغير ومن ثم طباعتها أي كتابة Exception as e ليصبح الخطأ في متغير e وبعد ذلك نطبعه كما في المثال التالي: except Exception as e: print(e) في الإصدارات القديمة للبايثون (قبل الإصدار 3) يمكن استخدام هذه الطريقة: except Exception, e: print e ومن الطرق الأخرى لطباعة رسالة الخطأ يمكنك استخدام وحدة traceback التي توفر لك توابع لتهيئة وطباعة الاستثناءات exceptions وtracebacks الخاصة بهم كما في المثال التالي: except: traceback.print_exc() المصدر
  21. المشكلة أنك تقوم بعملية الدمج بطريقة خاطئة، فالروبي تدعم العديد من طرق الدمج لكن الطريقة التي استخدمتها ليست واحدة منهم. للدمج يمكنك استخدام عدة طرق فمثلا يمكنك إضافة العدد الحقيقي إلى السلسلة النصية عن طريق رمز #{} وتضع بداخله المتغير الذي يحتوي على الرقم كما في المثال التالي: puts " Total Revenue of East Cost: #{total_revenue_of_east_cost}" أو يمكنك تحويل العدد الحقيقي إلى سلسلة نصية عن طريق تابع to_s ومن ثم دمج السلسلتين معا بشكل عادي عن طريق الرمز + كما في المثال التالي: puts " Total Revenue of East Cost: " + total_revenue_of_east_cost.to_s
  22. في لغة روبي عدة خيارات للحصول على مسار مجلد المنزل، فمثلا لو كنت على أنظمة يونكس فيمكنك استخدام تابع File.expand_pat مع رمز ~ الذي يشير إلى مسار مجلد المنزل للمستخدم الحالي وفي حالة استخدامه مع اسم مستخدم مثلا ~foo فإنه يشير إلى مسار مجلد المنزل لذاك المستخدم: File.expand_path('~') أعتقد أن هذه الطريقة هي أفضل طريقة يمكنك استخدامها. ومن الطرق الأخرى، يمكنك استخدام الثوابت ENV["HOME"] و ENV["HOMEPATH"] لتحديد مجلد المنزل كما في المثال التالي: homes = ["HOME", "HOMEPATH"] realHome = homes.detect {|h| ENV[h] != nil} if not realHome puts "Could not find home directory" end
  23. نعم هنالك طريقة معينة للحصول على جميع الأصناف الفرعية من صنف معين (مثل الصنف الرئيسي)، فجميع الأصناف لديها تابع __subclasses__ والذي يقوم بإرجاع جميع الأصناف الفرعية منها، فلنفترض أن لدينا الأصناف التالية: class Foo(object): pass class Bab(Foo): pass class Baz(Foo): pass class Bing(Bar): pass يمكنك الحصول على قائمة من أسماء الأصناف الفرعية (من الصنف Foo) عن طريق السطر التالي: print([cls.__name__ for cls in vars()['Foo'].__subclasses__()]) # ['Bab', 'Baz'] وأما في حالة ما أردت الحصول على الأصناف الفرعية بالإضافة إلى الأصناف المتفرعة منها فيمكنك في هذه الحالة استخدام هذه الطريقة: def all_subclasses(cls): return cls.__subclasses__() + [g for s in cls.__subclasses__() for g in all_subclasses(s)] print(all_subclasses(vars()['Foo'])) # [<class '__main__.Bab'>, <class '__main__.Baz'>, <class '__main__.Bing'>]
  24. نعم يمكنك استخدام else في "تفهيم القائمة" في لغة بايثون، فصياغة a if b else c هي عامل ثلاثي يفسره بايثون بأن a هو الشرط وb إذا كان الشرط صحيحا وخلافا لذلك فإنه سيتم تنفيذ c، وهذه هي طريقة استخدامها في "تفهيم القائمة”: >>> [a if a else 2 for a in [0,1,0,3]] [2, 1, 2, 3] إذا قمنا بتطبيقه على مثالك فسوف تكون النتيجة كالتالي: table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15)) وهذا سيكون حسب علمي أقصر وأفضل حل يمكنك إيجاده لمثالك.
  25. هنالك عدة طرق يمكنك استخدامها لمعرفة حجم الاستهلاك في لغة بايثون، وتعتمد هذه الطرق على نوع نظام التشغيل الذي تستخدمه، فلو كنت تستخدم نظام ويندوز فيمكنك في هذه الحالة استخدام وحدة WMI التي تحتوي على عدة دوال يمكنك أن تساعدك كما في المثال التالي: def memory(): import os from wmi import WMI w = WMI('.') result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid()) return int(result[0]['WorkingSet']) أما في نظام لينكس فيمكنك استخدام دوال مكتبة os بالإضافة إلى ذلك سوف نعتمد على ملف status من proc لمعرفة حجم الاستهلاك كما في المثال التالي: import os _proc_status = '/proc/%d/status' % os.getpid() _scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0} def _VmB(VmKey): '''Private. ''' global _proc_status, _scale # get pseudo file /proc/<pid>/status try: t = open(_proc_status) v = t.read() t.close() except: return 0.0 # non-Linux? # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' i = v.index(VmKey) v = v[i:].split(None, 3) # whitespace if len(v) < 3: return 0.0 # invalid format? # convert Vm value to bytes return float(v[1]) * _scale[v[2]] def memory(since=0.0): '''Return memory usage in bytes. ''' return _VmB('VmSize:') - since def resident(since=0.0): '''Return resident memory usage in bytes. ''' return _VmB('VmRSS:') - since def stacksize(since=0.0): '''Return stack size in bytes. ''' return _VmB('VmStk:') - sinceالمصدر
×
×
  • أضف...