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

Ali Haidar Ahmad

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

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

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

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

    43

كل منشورات العضو Ali Haidar Ahmad

  1. يمكنك استرداد الكائنات باستخدام: from datetime import timedelta from django.db.models.functions import Now # Now() للحصول على التاريخ الحالي how_many_hours=24 # Created_at__lte للحصول على المطلوب مع تحديد المدة المطلوبة من خلال الوسيط filter نستدعي الدالة Post.objects.filter(Created_at__lte=Now()-timedelta(hours=how_many_hours)) # المدّة الزمنية المطلوبة timedelta يمثّل كائن
  2. نعم، يمكنك التراجع عن إضافة ملف محدد إلى منطقة الإدراج، من خلال الأمر التالي: git reset <FileName> وفي حال أردت التراجع عن كل الملفات: git reset
  3. يمكنك استخدام الدالة getattr، حيث تعيد الدّالة getattr()‎ قيمة الخاصيّة المُعطاة من الكائن المُعطى، ويتم صياغتها بالشكل التالي: getattr(object, name[, default]) حيث يمثل الوسيط الأول الكائن المراد الحصول على قيمة خاصيّته. أما name فتمثل سلسلة نصيّة تُمثّل اسم الخاصيّة المرغوب الوصول إلى قيمتها. default مُعامل اختياريّ. القيمة الافتراضيّة التي ستُعاد إن لم تكن الخاصيّة موجودة. ولمزيد من التفاصيل عن هذه الدالة يمكنك الانتقال إلى هذا الرابط في موسوعة حسوب. - الآن بالنسبة لمثالك، وعلى فرض أنه لدينا الوحدة mod، والدالة func، فإننا نكتب: # استيراد الوحدة import mod # نمرر اسم الدالة كوسيط ثاني والوحدة كوسيط أول methodToCall = getattr(mod, 'func') result = methodToCall() واختصاراً يمكن كتابة: result = getattr(mod, 'func')()
  4. تحتوي بايوثن على الوحدة PrettyPrint (طباعة جميلة أو مرتبة) المخصصة فقط من أجل هذه الحالات، فكما ذكرت فإنه في حالة القواميس المتداخلة يصعب قراءة ترتيب المفاتيح لأنه عند طباعة القاموس يظهر بشكل غير مُرتب ومن الصعب قراءته (في حالة القواميس الكبيرة). لذا يمكنك استخدام الدالة pprint من هذه الوحدة لعرض القاموس بشكل مرتب ومقروء: from pprint import pprint pprint(yourDict)
  5. نعم، بالشكل التالي: import numpy as np # إنشاء مصفوفتك arr=np.array([[2, -7, 5], [-6, 2, 0] , [1, -4, 2], [-2, 6, 8]]) # طباعة المصفوفة print("initial array", arr) # استبدال القيم السالبة بأصفار # نقوم بالمرور على المصفوفة سطر سطر for row in arr: # من أجل سطر من المصفوفة استبدل كل قيمة أصغر من الصفر بصفر row[row<0] = 0 # طباعة المصفوفة بعد التعديل print("New resulting array: ", arr) النتيجة: initial array: [[ 2 -7 5] [-6 2 0] [ 1 -4 2] [-2 6 8]] New resulting array: [[2 0 5] [0 2 0] [1 0 2] [0 6 8]]
  6. 1. Iloc يعتمد على الرقم أما loc يعتمد على الاسم. 2. يمكن لـ Iloc معرفة كل من الأعمدة والصفوف بينما loc فقط الصفوف. 3. Loc جيد لكل من السلاسل المنطقية وغير المنطقية بينما لا يعمل iloc مع السلاسل المنطقية. لذا عندما تعرف اسم الصف الذي تريد استخراجه، استخدم loc وإذا كنت تعرف الموضع (الرقم) فاستخدم iloc. مثال: ليكن لدينا الإطار التالي. import pandas as pd #You can name it anything dat=pd.DataFrame({'Fruit':['Apple','Peach','Plum'], 'Veggies':['Tomato','Capsicum','Cabbage'], 'Pulses':['Lentil','Pea','ChickPea']},index=['First','Second','Third']) dat.head() """ Fruit Veggies Pulses First Apple Tomato Lentil Second Peach Capsicum Pea Third Plum Cabbage ChickPea """ سنقوم الآن باستخراج بيانات الصف الثالث من خلال الرقم: dat.iloc[2] """ Fruit Plum Veggies Cabbage Pulses ChickPea Name: Third, dtype: object """ dat.loc[2] #أما هذا سيعطي خطأ سنقوم الآن باستخراج بيانات الصف الثالث من خلال الاسم: dat.loc['Second'] dat.iloc[1] # سيعطي نفس النتيجة dat.iloc['Second'] # سيعطي خطأ
  7. - المشكلة في محاولة تعديل قيمة متغير عام، ضمن دالة. أولاً يجب أن تضع في ذهنك أن هناك تصنيفين أساسيين للمتحولات variable هما: 1. المتغيرات المحلية Local Variables. 2. المتغيرات العامة Global variables. المتغيرات العامة هي تلك التي لم يتم الإعلان عنها داخل أي دالة، ويكون نطاقها عام Global، بينما المتغيرات المحلية هي تلك التي يتم الإعلان عنها داخل دالة ونطاقها يكون محصور ضمن الدالة التي عُرّفت ضمنها فقط. بمعنى آخر، يمكننا القول أن المتغيرات المحلية يمكن الوصول إليها فقط داخل الدالة التي تمت تهيئتها من خلالها بينما يمكن الوصول إلى المتغيرات العامة في جميع أنحاء البرنامج وداخل كل دالة. الآن طبقاً للتعريف أعلاه فمن المفترض أن يعمل الكود الخاص بك دون أن تظهر لك مشكلة، لأنك تقوم باستخدام متغير عام (يمكن الوصول له من أي مكان في الكود)، لكن في واقع الأمر هنا يوجد اختلاف بسيط وهو أنك تحاول تعديل قيمته وليس الوصول إليه فقط، ولحل المشكلة يجب أن نقوم باستخدام الكلمة المفتاحية global معه قبل محاولة إجراء أي تعديل على قيمته. def fun(): global x x=x*3 return(x) x=1 fun() وبذلك تكون الأمور سليمة. لمزيد من المعلومات عن المتغيرات والدوال والنطاقات يمكنك مراجعة المقالات التالية: https://wiki.hsoub.com/Python/scopes-and-namespaces
  8. 1. يمكنك القيام بذلك من خلال استخدام الواصفة index (إحدى واصفات إطار البيانات DataFrame): import pandas as pd # تعريف إطار البيانات inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}] df = pd.DataFrame(inp) # المرور على أسطر إطار البيانات for row in df.index: print(str(df["c1"][row])+" "+str(df["c2"][row])) 2. يمكنك أيضاً استخدام الدالة loc: for i in range(len(df)): print(str(df.loc[i,"c1"])+" "+str(df.loc[i,"c2"])) 3. أيضاً يمكنك استخدام iloc بنفس الطريقة. 4. يمكنك استخدام طرق أخرى أيضاً مثل الدالة pandas.DataFrame.iterrows كما في الإجابة السابقة. 5. يمكنك استخدام الدالة pandas.DataFrame.itertuples: for row in df.itertuples(): print(str(row.c1)+" "+str(row.c2))
  9. نعم من خلال الدالة option_context يمكنك أن تجعل dropna تعامل قيم inf وكأنها nan ودون أن تجعل هذا الأمر معمماً في كل الكود (أي فقط ستعامل inf ك nan ضمن المقطع البرمجي): with pd.option_context('mode.use_inf_as_na', True): df = df.dropna(subset=['col1', 'col2'], how='all') أما في حال كتبنا: pd.set_option('use_inf_as_na', True) فهذا سيجعل الأمر معممًا في كل الكود، أي أنه دوماً ستتم معاملة inf ك nan وهو ما لاتريده بقولك "دون ان اضطر ل اعادة ضبط (mode.use_inf_as_null) ".
  10. سأوضح في البداية هذه الدالة، بعد ذلك أجيب عن السؤال الأساسي.. أولاً: تعيد الدالة super()‎ كائناً وسيطاً يُفوّض استدعاءات التوابع إلى صنف أب أو صنف شقيق للصنف الذي استُدعيت منه الدالة، وهذا مفيد للوصول إلى التوابع الموروثة التي أعيدت كتابتها في صنف معين. تعريف آخر؛ ضمن صف فرعي (موروث)، يمكن الإشارة إلى الصف الأب باستخدام الدالة super، هذه الدالة تُرجع كائن مؤقت من الصنف الأب والذي يسمح بالوصول إلى جميع دواله ضمن صنفه الفرعي (الابن). تعريف أبسط؛ هذه الدالة تجعلك قادر على الوصول إلى الدالة المعرفة في الكلاس الأب ( Superclass ) من الكلاس الابن ( Subclass ) سواء كان يوجد تضارب في الأسماء أو لا يوجد و بالتالي يصبح الكلاس الابن قادر على أن يعيد كتابة الدالة التي ورثها من الكلاس الأب و أن يصل للدالة التي ورثها من الكلاس الأب أيضاً. فوائد استخدام الوظيفة الفائقة هي: 1. لا تحتاج إلى ذكر أو تحديد اسم الصف الأب للوصول إلى دواله، ويمكن استخدام هذه الدالة في الوراثة الفردية والمتعددة. 2. وجود هذه الدالة مفيد لعزل التغيرات ولتحقيق مفهوم قابلية إعادة استخدام الكود حيث لا توجد حاجة لإعادة كتابة الدالة بأكملها داخل الصف الابن. 3. تعتبر هذه الدالة دالة ديناميكية في بايثون (بايثون في الأساس لغة ديناميكية). هناك 3 أشياء يجب تحديدها لاستخدام هذه الدالة: 1. الصنف المراد الذي تتم وراثته والذي نريد من الدالة super أن تشير إليه. 2. يجب أن تتطابق معطيات الدالة super والدالة التي يتم استدعاؤها. 3. يجب أن يتضمن كل تكرار للدالة على super بعد استخدامه. هناك حالتان تُستعمل فيهما الدالة super()‎ عادةً: تستعمل للوصول إلى الصنف الأب في شجرة أصناف ذات وراثة وحيدة (class hierarchy with single inheritance) دون الحاجة إلى تسمية الصنف مباشرة، ما يسمح للكود بأن تكون قابلة للتطوير والصيانة بشكل أفضل، وحالة الاستخدام هذه تشابه طريقة استخدام super()‎ في لغات البرمجة الأخرى. المثال التّالي يُوضح حالة الاستخدام هذه: class A: # دالة تُعيد مجموع عددين def add(self, x, y): return x+y # وراثة من الصنف الأب class B(A): # دالة تُضيف العددين وتطبع العمليّة def add_print(self, x, y): # استدعاء تابع يتواجد في الصنف الأب دون تسميّة الصنف الأب بشكل صريح result = super().add(x, y) print(f'{x}+{y}={result}') # إنشاء كائن من الصّنف الوارث adder = B() # استدعاء دالة الإضافة والطّباعة adder.add_print(1, 2) # 1+2=3 adder.add_print(1, 5) # 1+5=6 الحالة الثانية التي تُستخدم فيها هي عند الرغبة في استعمال وراثة متعددة متعاونة (cooperative multiple inheritance) في بيئة تنفيذ ديناميكية (أي أن الصّنف يمكن له أن يرث من أكثر من صنف واحد). هذه الميزة موجودة فقط في لغة بايثون ولا توجد في لغات البرمجة المجمعة (statically compiled languages) أو في لغات البرمجة التي لا تدعم سوى الوراثة الوحيدة (أي أن الصنف لا يُمكن أن يرث إلا من صنف واحد فقط). ما يُمكّن من تطبيق "تخطيطات الماسة (diamond diagrams)" عندما تحتوي أصناف آباء عدة على نفس التابع. يجب على هذا التابع أن يمتلك نفس توقيع الاستدعاء (calling signature) في جميع الحالات (لأن ترتيب الاستدعاءات يحدد في وقت التنفيذ runtime، ولأن الترتيب يتغير حسب تغير شجرة الأصناف، ولأن الترتيب يمكن له أن يشمل أصنافا شقيقة غير معلومة قبل بدء وقت التنفيذ). يكون استدعاء الدالة super()‎ في كلتا الحالتين مشابهًا لما يلي: class C(B): def method(self, arg): # هذا الاستدعاء مُكافئ للاستدعاء أدناه super().method(arg) # super(C, self).method(arg) ثانياً: العودة لسؤالك. الدالة super تم تصميمها بشكل أساسي في بايثون من أجل الوراثة المتعددة، لكن كيف وما الفرق؟ SomeBaseClass.__init__(self) تعني ببساطة استدعاء الدالة __init__ من الصنف الأب، وهذه الطريقة كانت موجودة في بايثون 2، ولم تعد مستخدمة في بايثون 3. في حين أن: super().__init__() means to call a bound __init__ from the parent class that follows SomeBaseClass's child class (the one that defines this method) in the instance's Method Resolution Order (MRO). هي الطريقة المستخدمة في بايثون 3، وتعني استدعاء الدالة __init__ المربوطة بالصف الأب الذي يتبع له الصف الابن الذي تم به استدعاء هذه الدالة، حيث أن الدالة super تُرجع كائن مؤقت من الصنف الأب SomeBaseClass، مما يسمح لنا باستدعاء الدوال والخصائص الموجودة ضمنه. يكمن الفرق بينهما في أنه في حالة الوراثة المتعددة مثلاً: A / \ B C \ / D يكون لدينا أصناف ترث أصناف، ويكون لدينا __init__ تأتي بعد __init__ بناءً على ترتيب MRO. هذا يعني انه بدون super لن تتصل بـ __init__ التالية حسب ترتيب MRO، وبالتالي لن تتمكن من إعادة استخدام الكود فيه.
  11. 1. يمكن القيام بذلك من خلال تمرير قائمة تحتوي الأعمدة بالترتيب الذي تريده وفق الصيغة التالية: df_correct_order = df[[col1, col2, col3, ..., coln]] مثال: import pandas as pd df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]}) df.head() """ A B 0 5 1 1 6 2 2 3 3 3 4 5 """ # لتغيير الترتيب: df_new = df[['B', 'A']] df.head() """ B A 0 1 5 1 2 6 2 3 3 3 5 4 """ 2. يمكن القيام بذلك من خلال .loc بشكل مشابه للطريقة السابقة: df_new = df.loc[:, ['B', 'A']] df.head() """ B A 0 1 5 1 2 6 2 3 3 3 5 4 """ 3. يمكن استخدام .iloc بنفس طريقة استخدام loc.
  12. يمكنك القيام بذلك بعدة طرق: 1. الطريقة الأبسط هي القيام بذلك بشكل مباشر، كما يلي: import itertools foo = (1, 2, 3) bar = (4, 5, 6) print("foo bar") for i in range(len(foo)): print(foo[i]," ",bar[i]) """ foo bar 1 4 2 5 3 6 """ يمكن أضًا استخدام دوال كما سنرى.. 2. من خلال الدالة enumerate: import itertools foo = (1, 2, 3) bar = (4, 5, 6) print("foo bar") for n, f in enumerate( foo ): print(f," ",bar[n] ) """ foo bar 1 4 2 5 3 6 """ 3. من خلال الدالة zip_longest: import itertools foo = (1, 2, 3) bar = (4, 5, 6) print("foo bar") for f, b in itertools.zip_longest(foo,bar): print (f," ", b) """ foo bar 1 4 2 5 3 6 """
  13. سننشئ أولاً إطار البيانات: import pandas as pd df = pd.DataFrame([[1, 2, 'March'], [5, 6, 'Dec'], [3, 4, 'April']], columns=['a','b','m']) df """ a b m 0 1 2 March 1 5 6 Dec 2 3 4 April """ 1. فرز البيانات وفقًا لقيم عمود محدد: باستخدام الدالة df.sort_values، يمكنك فرز نقاط البيانات (الصفوف) بترتيب تصاعدي أو تنازلي، وعندما لا تحدد طريقة الترتيب، فإنه يعتبره افتراضيًا ترتيبًا تصاعديًّا. # الفرز بشكل افتراضي df2 = df.sort_values('m') print(df2) """ a b m 2 3 4 April 1 5 6 Dec 0 1 2 March """ في حالة رغبتك في تحديث إطار البيانات الحالي (أي عدم إنشاء نسخة والتعديل عليها)، استخدم inplace = True. df.sort_values('m', inplace=True) print(df) إذا أردت الفرز بترتيب تنازلي، استخدم ascending=False. يمكنك أيضًا تحديد أوامر فرز مختلفة لكل تسمية label. df2 = df.sort_values('m', ascending=False) print(df2) 2. فرز البيانات وفقًا لعدة أعمدة: تدعم الدالة السابقة أيضًا الفرز اعتمادًا على قيم أعمدة متعددة في وقت واحد، وذلك من خلال تمرير قائمة بأسماء هذه الأعمدة إلى الوسيط by. df2 = df.sort_values(by=['m','b']) print(df2) - قد تحتوي بعض الأعمدة على قيم مفقودة Nan، هذه القيم يتم وضعها في الأسفل عند القيام بعملية الفرز، لكن في حال أردت أن تضعها في بداية إطار البيانات، فاستخدم الوسيط na_position='first'. df2 = df.sort_values(by=['Courses','Fee'], na_position='first') print(df2) - في حالة رغبتك في تطبيق دالة مخصصة أو أي دالة موجودة للفرز، يمكنك استخدام الوسيط key. المثال أدناه يحول الدورات إلى أحرف صغيرة ويقوم بالفرز. مثلاً هنا نقوم بتطبيق دالة تقوم بتحويل كل الأحرف في كل شهر إلى أحرف صغيرة قبل تطبيق عملية الفرز. df2 = df.sort_values(by='m', key=lambda col: col.str.lower()) print(df2) - أخيرًا، يجب أن تعلم أنه بعد كل عملية فرز من خلال الدالة السابقة فإن ترتيب الفهرس سيصبح عشوائي، لذا إن كنت تحتاج إلى قيم فهرس مرتبة لابد لك من إعادة ضبط قيم الفهرس من جديد أو إخبار هذه الدالة بأن تترك قيم عمود الفهرس من دون تغيير من خلال الوسيط ignore_index=True. df2 = df.sort_values(by='m', ignore_index=True)
  14. - عنوان السؤال يشير لسؤال آخر تمامًا، وغير متطابق مع الشرح. ففي حالة أردنا تغيير نوع البيانات في عمود فهذا يعني تحويل صنف (نوع) البيانات في هذا العمود من صنف لآخر؛ كتحويل صنف العمود الأول من بياناتك من int إلى str، ويمكن إجراء ذلك من خلال استخدام الدلة astype: DataFrame.astype(dtype, copy=True, errors=’raise’) dtype: نوع البيانات الذي نريد تطبيقه على إطار البيانات بأكمله. copy: يُنشئ نسخة أخرى من مجموعة البيانات لوضع التغييرات عليها errors: من خلال تعيينها على "رفع" ، نسمح برفع الاستثناءات بواسطة الدالة. إذا لم يكن الأمر كذلك ، فيمكننا تعيينه على "تجاهل". "ignore" مثال: import pandas as pd data = { "Gender":['M','F','F','M','F','F','F'], "NAME":['John','Camili','Rheana','Joseph','Amanti','Alexa','Siri'] } block = pd.DataFrame(data) print("Original Data frame:\n") print(block) block.dtypes الخرج: Original Data frame: Gender NAME 0 M John 1 F Camili 2 F Rheana 3 M Joseph 4 F Amanti 5 F Alexa 6 F Siri Gender object NAME object dtype: object الآن سنطبق الدالة astype على عمود "الجنس" لتغيير نوع البيانات إلى "object". block['Gender'] = block['Gender'].astype('category') block.dtypes الخرج: Gender category NAME object dtype: object - أما حسب شرح السؤال فيبدو أنك تحتاجين إلى إضافة عمود جديد إلى بياناتك لتصنيف نقاط البيانات (الأسطر) إلى فئات، وكما يبدو فإن التصنيف يعتمد على قيم العمود الثاني. يمكنك استخدام الحل الذي قدمه الأستاذ وائل في هذه الحالة لكن مؤخراً تم حذفها من بايثون في الإصدارات الجديدة، لذا يمكنك استخدام categorical codes كما يلي: df = pd.DataFrame({'a' : [1, 2, 3, 4, 5], 'b' : ['yes', 'no', 'yes', 'no', 'absent']}) df['c']=pd.Categorical(df['b']).codes df """ a b c 0 1 yes 2 1 2 no 1 2 3 yes 2 3 4 no 1 4 5 absent 0 """
  15. بدءًا من Django 2.2، يمكنك استخدام request.headers للوصول إلى رؤوس HTTP. حسب الوثائق "كائن يشبه القاموس، ويوفر وصولاً إلى جميع ترويسات HTTP-prefixed بالإضافة إلى طول المحتوى ونوع المحتوى من خلال الطلب request": >>> request.headers {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...} >>> 'User-Agent' in request.headers True >>> 'user-agent' in request.headers True >>> request.headers['User-Agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers['user-agent'] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('User-Agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) >>> request.headers.get('user-agent') Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) وللحصول على جميع الرؤوس، يمكنك استخدام ()request.headers.keys أو ()request.headers.items.
  16. باستخدام المكتبة Graphics في C ++، يمكنك إنشاء أشكال أساسية مثل الخط والدائرة والمستطيل والقطع الناقص والقوس والشريط والشريط ثلاثي الأبعاد وعرض النص والكثير من الأشكال الأخرى، ولاستخدام دوال Graphics، يجب أن نقوم بتضمين الملف الرأسي Graphics.h. أمثلة: 1. لرسم دائرة نستخدم الدالة Circle Function: تأخذ هذه الدالة 3 معطيات تمثل x و y ونصف القطر. #include<stdio.h> #include<graphics.h> #include<conio.h> void main() { int x=100, y=100, r=80 int gd=DETECT, gm; initgraph(&gd, &gm, "d:\\bgi"); cleardevice(); circle(x, y, r); getch(); closegraph(); } مثال آخر لرسم دائرة نصف قطرها 80 بكسل في وسط الشاشة: void main() { int gd=DETECT, gm; int x, y, r=80 initgraph(&gd, &gm, "c:\\turboc3\\bgi"); cleardevice(); x = getmaxx()/2; y = getmaxy()/2; circle(x, y, r); outtextxy(x-100, y-50, "CIRCLE on center of screen"); getch(); closegraph(); } ملاحظات: - الدالة getmaxx تُرجع أكبر قيمة للإحداثيات X، بينما getmaxy تُرجع أكبر قيمة للإحداثيات Y. - الدالة initgraph تستخدم لتهيئة رسومات النظام عن طريق تحميل مشغل رسومات من القرص وبالتالي وضع النظام في وضع الرسوم. تأخذ هذه الدالة 3 معطيات: كشف الرسم ، ووضع الرسوم ، ومسار ملف bgi. - يرمز bgi إلى Borland Graphics Interface، وهو عبارة عن مكتبة رسومية. تقوم هذه المكتبة بتحميل برامج تشغيل الرسوم والخطوط المتجهة (* .CHR). - الدالة closegraph تزيل الذاكرة المخصصة بواسطة رسومات النظام ثم يرجع الشاشة إلى الوضع الذي كانت عليه قبل استدعاء initgraph. 2. لرسم خط نستخدم الدالة Line Function: حيث تأخذ 4 وسطاء هم x1,y1,x2,y2. #include<stdio.h> #include<conio.h> #include<graphics.h> void main() { int gd=DETECT, gm; int x1=100, y1=100, x2=200, y2=200; initgraph(&gd, &gm, "c:\\turboc3\\bgi"); cleardevice(); line(x1,y1,x2,y2); getch(); closegraph(); } 3. رسم حلقة Ellipse Function: ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius) 4. رسم مستطيل Rectangle Function: يأخذ 4 وسطاء تحدد احداثياته. x1(left), y1(top), x2(right), y2(bottom) مثال: void main() { int gd=DETECT, gm; initgraph(&gd, &gm, "c:\\turboc3\\bgi"); cleardevice(); rectangle(100,100,200,200); getch(); closegraph(); } هناك العديد من الخصائص الإضافية مثل تغيير الألوان وأمور أخرى لايسعنا ذكرها، لذا يمكنك الاطلاع على كافة الدوال والخصائص من خلال التوثيق هنا. أما بالنسبة لطباعة الأحرف الإنجليزية فالأمر بسيط، مثال: #include <iostream> #include <conio.h> using namespace std; int main() { char str[100]; int i; // إدخال الأحرف الإنجليزية المراد طباعتها cin>>str; cout<<"Characters of the given Strings!\n"; // طباعتها i=0; while(str[i]!= '\0'){ cout<<"The charecters of "<<" "<<i<<" position : "<<str[i] <<"\n"; i++; } getch(); return 0; }
  17. نعم في الواقع يوجد هناك دالة مضمنة في بايثون بنفس الاسم والمواصفات للقيام بذلك: String.__contains__(another_string) هذه الدالة تأخذ سلسلتين (السلسلة المُستدعية String والسلسلة الممرة كمعطى للدالة another_string)، وترجع هذه الدالة إما True إذا كانت another_string تنتمي إلى السلسلة المستدعية أو False في حال كان لا تنتمي. مثلاً: ret = str_object.contains(another_string) هنا سيتم اختبار فيما إذا كانت str_object تحتوي السلسلة another_string، وسيتم تخزين الناتج في ret. مثال: str_object = "Hello from Python" another_string = "Python" if (str_object.__contains__(another_string)): print("str_object contains another_string!") else: print("str_object does not contain another_string") يمكن أيضاً استخدامها بالشكل التالي: ret = str.__contains__(str_object, another_string) وكحل آخر يمكنك استخدام الدالة search من المكتبة RegEx (re) كما يلي: from re import search str_obj = "StackAbuse" another_string = "tack" if search(another_string, str_obj): print "Found!" else: print "Not found!" هذه الطريقة هي الأفضل خاصة إذا كنت بحاجة إلى دالة مطابقة أكثر دقة، مثل المطابقة غير الحساسة لحالة الأحرف.
  18. أولاً: ما هي yield. yield عبارة عن كلمة مفتاحية في Python تُستخدم للعودة من الدالة بدون تدمير حالة المتغيرات المحلية "local variable" الخاص بها وعندما يتم استدعاء الدالة، يبدأ التنفيذ من حيث توقفت الدالة في المرة الأخيرة عندما صادفت الكلمة المفتاحية yield. أي دالة تحتوي على الكلمة المفتاحية yield تسمى مولد "generator". وبالتالي، فإن yield هو الذي يتم من خلاله صنع المولد. هذه الكلمة المفتاحية قليلة الشهرة في بايثون ومع ذلك لها فائدة أكثر مما قد تتوقعينه. ثانياً:أمثلة لتوضيح عمله. مثال 1: # generator to print even numbers # مولّد لطباعة الأعداد الفردية def printOdd(numbers) : for i in numbers: if i % 2 != 0: yield i # تحديد مجموعة من الأرقام numbers = [1, 2, 5, 4, 9] # طباعة الأعداد الفردية print ("The even numbers in list are : ", end = " ") for j in printOdd(numbers): print (j, end = " ") # الخرج: # The even numbers in list are : 1 5 9 كما ذكرت فإن أي دالة تحتوي على هذه الكلمة المفتاحية يكون اسمها مولّد، وهذا ما يؤكده الاستدعاء التالي: printOdd(numbers) # <generator object printOdd at 0x00000216842B4DC8> لاحظ أيضاً في المثال السابق أن j تقوم بالمرور على عناصر هذا المولد، وفي كل استدعاء له يقوم بالتنفيذ من حيثما توقف بدلاً من العودة للبداية. مثال 2: # برنامج لتوليد مربعات الأعداد من 1 ل 50 # سنعرّف الآن دالة توليد لانهائية تقوم بتوليد مربعات الأعداد بدءاً من 1 def nextSquare(): i = 1 # حلقة لانهائية لتوليد مربعات الأعداد while True: yield i*i i += 1 # الاستدعاء التالي للدالة سيتم فيها بدء التنفيذ من هنا # استدعاء الدالة لتحقيق المطلوب for num in nextSquare(): if num > 50: break print(num) لاحظ أن التنفيذ بعد كل استدعاء يبدأ من التعليمة التي تلي yield، ففي أول استدعاء يبدأ التنفيذ من بداية الدالة، لكن في الاستدعاءات التالي يتم التنفيذ بدءاً من السطر الذي أشرت إليه في الكود.
  19. الطريقة الأولى اتبع الخطوات التالية: - الخطوة 1: تحديث قوائم المستودعات وتحديثها. افتح التيرمنل، وأدخل ما يلي: sudo apt update - الخطوة 2: تثبيت برمجيات الدعم. تمنحك الحزمة المشتركة لخصائص البرامج "software-properties-common package" تحكم أفضل في مدير الحزم الخاص بك عن طريق السماح لك بإضافة مستودعات PPA (أرشيف الحزمة الشخصية). sudo apt install software-properties-common - الخطوة 3: إضافة Deadsnakes PPA. وهو عبارة عن PPA بإصدارات أحدث من مستودعات Ubuntu الافتراضية. sudo add-apt-repository ppa:deadsnakes/ppa سيطالبك النظام بالضغط على Enter للمتابعة. افعل ذلك واتركه حتى ينتهي، ثم قم بتحديث قوائم الحزم مرة أخرى: sudo apt update - الخطوة 4: تثبيت Python 3 يمكنك الآن بدء تثبيت Python 3 من خلال الأمر: sudo apt install python3.8 الطريقة الثانية تثبيته من خلال الشيفرة المصدر باتباع الخطوات التالية: - الخطوة 1: تحديث قوائم المستودعات وتحديثها. افتح التيرمنل، وأدخل ما يلي: sudo apt update - الخطوة 2: تثبيت برمجيات الدعم. ترجمة الحزمة من الشيفرة المصدر تتطلب برمجيات إضافية، لذا قم بتنفيذ الأمر التالي لتثبيتها: sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget - الخطوة 3: تحميل آخر نسخة من الشيفرة المصدر لبايثون Python Source Code. انتقل إلى الدليل tmp/ واستخدم الأمر wget: cd /tmp wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz - الخطوة 4: استخراج الملف المضغوط. من خلال الأمر: tar -xf Python-3.8.3.tgz - الخطوة 5: اختبار النظام وتحسين Python. يُفضل قبل التثبيت، التأكد من اختبار النظام وتحسين Python، حيث أن هذه العملية تؤدي إلى إعداد وتجهيز بايثون للعمل على جهازك، ويؤدي استخدام خيار --optimization إلى تسريع تنفيذ التعليمات البرمجية بنسبة 10-20٪ : cd python-3.8.3 ./configure --enable-optimizations ملاحظة: هذه العملية قد تستغرق حوالي 30 دقيقة. - الخطوة 6: تثبيت مثيل ثانٍ من Python. لإنشاء تثبيت ثانٍ لـ Python ، بالإضافة إلى تثبيت Python الحالي نفذ الأمر: sudo make altinstall
  20. يمكنك أيضاً استخدام الدالة get_random_string: django.utils.crypto.get_random_string() حيث ترجع سلسلة عشوائية تم إنشاؤها بشكل آمن، وهي مناسبة جدًا لكلمات المرور.
  21. يمكنك القيام بذلك أيضاً من خلال الكود التالي (لنسخ جانغو Django >= 2.0)، حيث يقوم هذا الكود بطباعة جميع عناوين URL، وعلى عكس بعض الحلول الأخرى، فإنه سيطبع المسار الكامل وليس فقط العقدة الأخيرة: from django.conf import settings from django.urls import URLPattern, URLResolver urlconf = __import__(settings.ROOT_URLCONF, {}, {}, ['']) def list_urls(lis, acc=None): if acc is None: acc = [] if not lis: return l = lis[0] if isinstance(l, URLPattern): yield acc + [str(l.pattern)] elif isinstance(l, URLResolver): yield from list_urls(l.url_patterns, acc + [str(l.pattern)]) yield from list_urls(lis[1:], acc) for p in list_urls(urlconf.urlpatterns): print(''.join(p)) ويكون الخرج بالشكل: admin/ admin/login/ admin/logout/ admin/password_change/ admin/password_change/done/ admin/jsi18n/ admin/r/<int:content_type_id>/<path:object_id>/ admin/auth/group/ admin/auth/group/add/ admin/auth/group/autocomplete/ admin/auth/group/<path:object_id>/history/ admin/auth/group/<path:object_id>/delete/ admin/auth/group/<path:object_id>/change/ admin/auth/group/<path:object_id>/ admin/auth/user/<id>/password/ admin/auth/user/ ... etc, etc
  22. إضافة إلى الطريقة التي ذكرها مسعود يمكنك القيام بذلك كالتالي، حيث نوجد معرّفات المستخدمين الذين لديهم منتج، ثم نستخدمهم ضمن استعلام exclude (نوع من ال filter لكن بالعكس)، أي تأخذ كل المستخدمين وتستبعد الذي لديهم منتج: user_ids_with_product = [product.user_id for product in Product.objects.all()] Users.objects.exclude(id__in=user_ids_with_product) طبعاً يمكن لل User's model الوصول إلى ال Product's objects، ولذلك يمكننا استخدام exclude و filter.
  23. السؤال غير محدد جيدًا، ولكن سأغطي كل الاحتمالات التي قد تتم مصادفتها أثناء الإدخال. من المعروف في بايثون أننا نستخدم الدالة input لكافة أنواع المدخلات، حيث تستقبل المدخلات مهما كان صنفها على شكل سلسلة String، ثم نحوّلها إلى الصنف المطلوب، فمثلاً لإدخال سلسلة نكتب: s=input() لإدخال عدد صحيح نكتب: s=input() myIntegerNumber=int(s) # أو اختصاراً myIntegerNumber=int(input()) لكن في حال الحاجة إلى أن يكون الدخل من المستخدم على شكل قيم أو مدخلات متعددة أو إدخال في سطر واحد، في لغات مثل السي و السي++ يمكن القيام بذلك من خلال دالة scanf لكن في بايثون يمكن القيام بذلك من خلال إحدى الطرق التالية: من خلال الدالة: input().split(separator, maxsplit) فبما أن الدخل يكون على شكل String، فهذا يعني قدرتنا على استخدام الدالة split على خرج الدالة. مثال: في حالتك، وبما أن المدخلات هما قيمتين دفعة واحدة فيمكننا إدخالهما بالشكل التالي. x, y = input().split() أخذ 3 مدخلات: x, y, z = input().split() أخذ عدة مدخلات دفعة واحدة (أعداد صحيحة)، ووضع المدخلات ضمن قائمة: myList = list(map(int, input().split())) من خلال مفهوم "اشتمال قائمة" list comprehension، حيث يمكننا استخدامه لأخذ مدخلات متعددة كما يلي. إدخال عددين صحيحين: x, y = [int(x) for x in input().split()] أخذ عدة مدخلات دفعة واحدة: myList = [int(x) for x in input().split()]
  24. ربما بإمكانك استخدام التعابير المنتظمة regex للقيام بذلك، مثلاً: from flask import Flask from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter): def __init__(self, url_map, *items): super().__init__(url_map) self.regex = items[0] app = Flask(__name__) app.url_map.converters['regex'] = RegexConverter @app.route('/page<regex("\d+"):page_id>/') def page(page_id): return f"Page ID: {page_id}" if __name__ == '__main__': app.run()
×
×
  • أضف...