عمل رائع وسرعة ممتازة يا كمال في انجاز المهام
شكرا استاذ ياسر ^^
from flask import Flask
app = Flask(__name__)
@app.route('/say-hello/<name>')
def say_hello(name):
return ('Hello ' + name)
app.run()
لدي سؤال
كيف تم الربط بين الراوت say-hello والداله say_hello بالرغم من اختلاف كتابتهم والنتيجة تظهر صحيحة على المتصفح ؟
نعم يا أحمد، السطر التالي
@app.route('/say-hello/<name>')
هو من يقوم بالربط بين دالة بايثون وبين الـ route، ولا يشترط أن يكون يحتوي على نفس الكلمة
يعني ممكن تستعمل أي كلمة أخرى لعمل الـ route، مثل:
@app.route('/alalaf/<name>')
بهذا السطر يمكنك الدخول على المتصفح وفتح الرابط http://127.0.0.1/alalaf/ahmed
وستظهر لك النتيجة Hello ahmed
هل داله route تقوم بتنفيذ الداله التي اسفل منها مباشرة وبهذا يكون الربط ؟
نعم لأنها تعتبر decorator (زخرفة للدالة)
في بايثون لو تريد عمل decorator تستعمل الـ @
اعتبرها دالة تأكل دالة أخرى، هذه تفاصيل حولها:
from flask import Flask
app = Flask(__name__)
@app.route('/say_hello/<x>')
def say_hello(x):
return 'hello' + x
app.run()
عمل رائع
from flask import Flask
app = Flask(__name__)
@app.route('/say-hello/<name>')
def say_hello(name):
return ('Hello ' + name)
app.run()
عمل ممتاز، أريج
مشكور أستاذ
from flask import Flask
app = Flask(__name__)
@app.route('/say-hello/<x>')
def hello(x):
return 'Hello %s' %x
app.run()
كالعادة عمل رائع يا ابرار
السؤال هنا لماذا علينا كتابة’ +’ ليضهر المدخل X
from flask import Flask
app = Flask(__name__)
@app.route('/sayhello/<x>')
def sayhello(x):
return ('hello: ' , x)
app.run()
from flask import Flask
app = Flask(__name__)
@app.route("/manaa")
def home ():
return "hi"
@app.route("/ahmed")
def we ():
return "how are you"
app.run ()
ببساطة x هو مجرد متغير يستقبله فلاسك حينما تقوم بفتح الرابط /sayhello/bassam
يعني ممكن تكتب name أو أي شيء آخر بدل x
عمل جيد يا محمود
لكن المطلوب أن تقوم بجعل التطبيق يستقبل أي اسم يكتب في الرابط، مثلا لو أكتب الرابط
http://localhost/sayhello/yaser
يطلع hello yaser
ولو أكتب
http://localhost/sayhello/mohammed
يطلع heloo mohammed
وهكذا
شكراً استاذ يا سر ولاكن ليس هذا هو المقصود
انا ابديت استغرابي ان كان هنلك فرق بين ’ + ’ و ’ , 'التي طالما تعودنا استخدام الثانية
حياك ي بسام @BassamMsmar، مثل ما تعرف انه عندنا في لغات البرمجة functions او ما نطلق عليها الدوال وهذه الدوال بإمكاننا تمرير لها ما يسمى بالـ Parameters و بإمكاننا الإطلاق عليها المعاملات
فمثلاً عندما نقوم بإنشاء دالة تطبع إسم الشخص نقوم بالتالي:
def print_name(name):
print (name)
return
ومن ثم نقوم بإستدعاء الدالة بالشكل التالي مع تمرير إسم الشخص المطلوب طباعته:
print_name('Bassam')
النتيجة سيتم طباعة الإسم Bassam كما تعرف
جميل إلى هنا متفقين
الأن لنفترض أنك تريد أن تقوم بإعطاء الدالة لقبك أيضاً لتقوم بطباعته، طبعاً تستطيع كتابة إسمك الكامل هكذا
print_name('Bassam Msmar')
لكننا لا نريد أن نقوم بذلك ونريد أن نقوم بإضافة اللقب بشكل منفصل، لذا قد تقول لنقم بإضافه اللقب بعلامة +
بالشكل التالي:
print_name('Bassam' + 'Msmar')
جميل، ستجد أن هذه هي النتيجة:
اها تم قبول علامة +
وطباعة الإسمين لكن ماذا عن إضافة اللقب بإستخدام الفاصلة ,
بدلاً من الـ +
ماذا ستكون النتيجة؟
طيب لنجرب كتابة هذا الكود:
print_name('Bassam', 'Msmar')
النتيجة:
أوووبس لدينا مشكلة:
تقول لنا المشكلة بأن الدالة print_name
تأخذ argument واحد لكنها وجدت اننا أعطيناها 2!
أولاً ما الفرق بين الـ argument و الـ parameter؟
الـ parameter هو المتغير الذي تقوم بتعريفة في الدالة عند إنشاءها مثلاً في الكود ادناة المتغير name الذي بداخل القوسين هو الـ parameter في الدالة
def print_name(name):
بينما الـ argument هي الـ data التي نقوم بتمريرها في الدالة عند إستدعائها فمثلاً في الكود أدناة إسمك هو الـ argument
print_name('Bassam')
اوكي لنعود لمشكلتنا
يقول لنا الـ compiler بأنه هناك خطأ وبأننا قمنا بتمرير إثنين arguments
للدالة print_name
، وهذا ليس شئ متوقع حسب تعريفنا للدالة في بدأية البرنامج، فقد قمنا بتعريفها بـ parameter واحد والذي هو name
def print_name(name):
لذا يجب علينا إما ان نتقيد بهذا الشئ وتمرير argument واحد عند إستدعاء الدالة هكذا
print_name('Bassam')
أو نقوم بتعديل الدالة وإضافة parameter أخر للقب في تعريف الدالة حتى نستطيع تمرير الإثنين الـ arguments، لنقم بذلك بالشكل التالي:
def print_name(name, surname):
print (name + surname)
return
print_name('Bassam', 'Msmar')
لاحظ أضفت أثنين parameters الي هم (name, surname) وبعدين مررت إثنين arguments الي هم (‘Bassam’, 'Msmar)
لنقم الأن بتجربة البرنامج بالتعديلات الجديدة ونشوف اذا بتظهر لنا نفس المشكلة
النتيجة
ممتاز كما تلاحظ الأن البرنامج إشتغل بشكل طبيعي وقبل تمرير الأثنين الـ arguments.
الفرق بين علامة + وبين الفاصلة ,
مثل ما شفت خلال الذي مررنا به اعلاة بأنه عندنا إستخدمنا علامة + لم تظهر لنا مشكلة بانه قمنا بإستخدام أكثر من argument واحد بينما عندما قمنا بإستخدام الفاصلة ظهرت المشكلة.
أي كان علامة + تقوم فقط بربط النصوص أو دمجها وإعتبارها كنص واحد (أي عنصر واحد او argument واحد)
print_name('Bassam' + 'Msmar')
بينما الفاصلة تقوم بإعتبار كل نص منفصل بحد ذاته وإعتبارة كـ argument يجب أن يقابله parameter في الدالة المعرفة مسبقاً.
print_name('Bassam', 'Msmar')
ليش كل الكلام الذي فوق؟
ممكن أكون طولت عليك بس أحببت أن تكون الأمور واضحة بخصوص الدوال وما يتم تمريره لها حتى تكون ملم عن الموضوع بشكل كامل.
الـ print هي دالة
الكود الذي نستخدمة لطباعة النصوص في بايثون هو عبارة عن دالة نقوم فيها بتمرير النص الذي نريد طباعته كـ argument وهي بدورها تقوم بتنفيذ اللازم لكتابة النص في الشاشة.
لنقم بتجربة الـ + والفاصلة , في هذه الدالة:
تجربة الـ +
print('Bassam' + 'Msmar')
النتيجة
جميل تم طباعة الإسم واللقب ولم نواجة مشكلة.
تجربة الفاصلة ,
print('Bassam' , 'Msmar')
النتيجة:
جميل تم طباعة الإسم واللقب ولم نواجة مشكلة.
لكن هناك فرق بين النتيجتين، هل لاحظته؟
تلاحظ عند إستخدامنا للفاصلة بأنه تم وضع مسافة بين الإسم واللقب بينما عند إستخدامنا للـ + جاء اللقب ملتصق بالإسم.
ماهو السبب؟
السبب هو لأن علامة + قامت بأخذ النص الأول وربطته بالنص الثاني وتم تمرير النص كـ argument واحد للدالة print وبدورها قامت بطباعته كعنصر واحد.
بينما في الحالة الثانية قامت الفاصلة بفصل الإسمين وإرسالهما للدالة كإثنين arguments وليس واحد وقامت الدالة بمنطق معين بدمج هذين النصين وفصلهما بمسافة وطباعتهما.
الأن أصبحت تعرف الفرق بين الـ + والفاصلة وطريقة تعامل الدالة print مع النصوص بوجود أحد هاذين العنصرين، لنعود للكود الخاص بك
from flask import Flask
app = Flask(__name__)
@app.route('/sayhello/<x>')
def sayhello(x):
return ('hello: ' , x)
app.run()
في الدالة التي كتبتها قمت بعمل فاصلة عند إرجاع القيمة
return ('hello: ' , x)
والوضع الأن غير مختلف مع طريقة تعامل الـ return مع ما تقوم بتمريرة بداخلها سوا بال + او بالفاصلة.
عشان تحدد أي منهما تستخدم جاوب عن الأسئلة التالية:
السؤال الأول:
هل تريد أن تقوم بدمج الإسم بجوار كلمة hello:
وإرجاعة كقيمة واحدة؟
إذا نعم فعليك إستخدام علامة + بالشكل التالي:
return ('hello: ' + x)
الأن خلاصة الدالة sayhello
وما سيتم إرجاعة منها هو hello: mohammed في حال ما إن إستدعيناها بالشكل التالي:
sayhello('mohammed')
السؤال الثاني:
هل تريد إرجاع عنصرين بشكل منفصل؟
إذا نعم فعليك إستخدام علامة الفاصلة بالشكل التالي:
return ('hello: ' , x)
الأن خلاصة الدالة sayhello
وما سيتم إرجاعة منها هو قيمتين، القيمة الأولى hello: والقيمة الثانية هي القيمة المخزنة بداخل المتغير x لنقل mohammed في حال ما إستدعيت الدالة بالشكل التالي:
sayhello('mohammed')
الخلاصة:
علامة الفاصلة:
تقوم بتحديد الـ arguments التي يتم تمريرها للدالة وفي حالة دالة print
تقوم بأخذ هذه القيم المنفصلة وتحويلها إلى نصوص وطباعتها وعمل مسافة بين كل قيمة وأخرى.
علامة +:
تقوم بعمل concatenate (ربط أو دمج) للنصوص وتمريرها كـ argument واحد وفي حالة دالة print
تقوم بطباعة ذلك النص كيف ما كان بدون أي تدخل بإدراج أي مسافة.
هذا هو الموضوع بإختصار اتمنى ان يكون واضح واذا عندك اي إستفسار او شئ غير واضح ضعة في أي وقت
ياخي انت ايش يسموك
مبدع …!!
قليل في حقك
انتم رواد التعليم في اليمن القادم اذ الم يكن في الوطن العربي كله
فهمتها ومن اول مرة
ولا أضن اني بانساها ماحييت
الشكر كل الشكر لك استاذ/ محمد الأستاذ / ياسر
وكل القائمين على الموقع