[MUSIC PLAYING]
ديفيد مالان: هذه هي دورة CS50، وهذه هي المحاضرة السادسة.
وستذكرون أننا قدّمنا في الأسبوع الماضي برمجة الويب
بطريقة HTML وCSS، أو على الأقل الكتل البنائية
لأننا لا نملك القدرة على البرمجة بعد.
إنها مجرد ترميز، HTML وCSS بتطبيق نمط معين هناك.
ولكن قدّمنا في الأسبوع الماضي هذه الاستعارة لبروتوكول يُسمى TC/IP.
وقمنا بالطبع، بربطه، بالظرف.
وكان على هذا الظرف، بشكل افتراضي، على الجهة الأمامية
جزآن على الأقل من المعلومات.
وإذا كان أي شخص يتذكر ما هما هذان الجزآن
من المعلومات في مجال إلى؟
شخص آخر لم نستمع إليه في الآونة الأخيرة؟
أجل؟
الجمهور: عنوان IP.
ديفيد مالان: أجل.
عنوان IP، عنوان رقمي يُحدّد بشكل فريد جهاز الكمبيوتر الخاص بك
وجهاز الكمبيوتر الخاص بشخص آخر.
وشيء آخر، إذا كنتم تتذكرون.
أوه، هيا.
إنه كما لو كان منذ دقيقتين.
حسنًا.
أجل.
الجمهور: رقم المنفذ.
ديفيد مالان: رقم المنفذ.
إذن رقم آخر، رقم أقصر، هو مجرد رقم مثل 80 أو 443
يشير إلى HTTP أو HTTPS، أو أرقام أخرى،
مثل 25 للبريد الإلكتروني وما شابه ذلك.
إذن تتيح لك هذه العناوين الفريدة معًا إرسال المعلومات
ليس فقط إلى كمبيوتر محدد، ولكن أيضًا خدمة محددة
تعمل على هذا الكمبيوتر.
ومن أجل طلب معلومات بالفعل من ذلك الخادم،
فهناك بروتوكول آخر يُسمى HTTP، بروتوكول نقل النص التشعبي.
هذا هو ما بداخل الظرف.
لذلك عندما يقوم الخادم بفتحه، بشكل مجازي،
يبدو في الداخل، هذا هو الأمر الذي يقرأه ذلك الخادم لكي يقرر
ما هي الطريقة التي يجب أن يستجيب بها بالفعل.
ولذلك فإن هذا الطلب هنا يُخبر الخادم--
والمعروف كـ www.example.com في هذا المثال المُحدّد--
ليقوم بإرسال ما بداخل الظرف الخاص به بالضبط إليّ
وجهاز الكمبيوتر المحمول الخاص بي إذا طلبتُ ذلك؟
الجمهور: صفحة ويب محددة.
ديفيد مالان: صفحة ويب محددة.
وشخص آخر، أي صفحة ويب تحديدًا، بشكل افتراضي؟
الجمهور: الفهرس.
ديفيد مالان: نعم، إذن index.html، الذي تحدثنا عنه الأسبوع الماضي
فقط يميل إلى أن يكون اسم الملف الافتراضي على خادم صفحة الويب
التي تم تحديدها للتو بشكل افتراضي. ولا تتعين تسميتها بهذا،
ولكنه تقليد بشري.
وبقية هذا عبارة عن فعل يقول فقط، حرفيًا، أعطني ذلك الملف.
هذا فقط يخبر الخادم أي إصدار من HTTP
أنا أتحدث به حتى يمكن للبشر تحسينه وترقيته مع مرور الوقت.
ولكن هذا سيخبر الخادم بأن يعيد index.html.
وفي الوقت نفسه، رأينا المزيد من get queries المتطورة
عندما بدأنا التحدث عن Google، وأي موقع ويب
ليس لديه فقط واجهة تطبيق، مثل HTML وCSS، ولكن أيضًا واجهة خلفية.
والواجهة الخلفية هي حيث يوجد المنطق، حيث يوجد الخادم،
والعمل المثير للاهتمام، في نهاية المطاف.
ولذلك يشير هذا الخط المائل search إلى بعض البرامج
التي تعمل على خوادم Google من الأسبوع الماضي
والتي ببساطة تستجيب للطلبات.
وما الذي تفعله أو تمثله علامة الاستفهام q تساوي cats في هذا الإثبات؟
الجمهور: مدخل المستخدم.
ديفيد مالان: نعم، مدخل المستخدم.
إذن تقول علامة الاستفهام فقط، أن هذا كل شيء عن اسم الملف أو عنوان URL.
ها هو مدخل المستخدم.
Q هو حرفيًا معلمة HTTP أو المدخل
الذي قرر لاري وسيرغي، مؤسسا Google،
قبل 20 عامًا أن يمثل مدخل المستخدم، q لـ query.
علامة يساوي تعني فقط أن query التي كتبها البشر كانت قطط.
ولكن لا يتعين على الشخص كتابة هذا.
بمجرد فهمك لبروتوكول HTTP، إذا أردت حقًا أن تكون خبيرًا،
يمكنك الانتقال إلى www.google.com/search؟q=cats وسيحث
البحث من أجلك لأنه في نهاية اليوم،
هذا كل ما يقوم به المتصفح.
عندما تكون لديك أشكال الويب هذه التي لديك القدرة الآن على إنشائها،
فقط تقوم بالتشغيل التلقائي لعملية إنشاء رسائل HTTP هذه.
الآن، آمل أن يستجيب الخادم برسالة لم تروها من قبل بالفعل،
HTTP 200، وهو حرفيًا يعني موافق.
بالطبع، لقد رأى الكثير منا أرقامًا تظهر بخلاف 200، مثل ماذا؟
404، والذي يعني؟
لم يتم العثور على الملف.
الآن، لماذا قرر الأشخاص منذ سنوات إخبار
أشخاص آخرين ما الذي تعنيه التعليمة البرمجية الرقمية هذه، وأعني،
أن هذا تفصيل غير مثير للاهتمام.
لكن العالم، لأي سبب من الأسباب، قد كشف عنه في العديد من مواقع الويب 404.
لكن هذا يعني الأمر نفسه.
كل شيء ليس على ما يرام.
لم يتم العثور على ملف.
قد ترون شيئًا آخر مثل هذا.
لقد رأينا هذا بجامعة هارفارد، في الواقع، بصورة غريبة،
أن هارفارد انتقلت بشكل دائم.
الآن، كانت هافارد تستجيب لطلبات معينة باستخدام HTTP 301
من أجل تحقيق أي ميزة أو تأثير؟
لماذا؟
أجل.
الجمهور: عمليات إعادة التوجيه.
ديفيد مالان: عمليات إعادة التوجيه.
إذن هذه هي طريقة ذات مستوى منخفض لوصف ذلك.
لكن 301، على الرغم من أنه يقول تم النقل بشكل دائم،
وهو تلميح فني أكثر للمتصفح قائلاً،
تم نقل هارفارد ليس إلى أي عنوان URL جئت منه للتو،
ولكن إلى عنوان URL هذا على وجه التحديد.
والآن، ربما كانت جامعة هارفارد على الأرجح، إذا تتذكرون، أعادت توجيهي من أي عنوان URL؟
إذا لم أكن بالفعل في عنوان URL هذا، فأين قد أكون؟
ربما نقطة com، إذا كانت لديهم بالفعل مجالات متعددة وكانوا يعيدون التوجيه.
ربما ينجح هذا.
ماذا أيضًا؟
أجل.
الجمهور: HTTP فقط.
ديفيد مالان: أجل.
ربما قمت للتو بكتابة HTTP، وتريد هارفارد، لأسباب أمنية،
إجبار المتصفح الخاص بي على طلب هذه الصفحة مجددًا عبر HTTPS.
أحيانًا قد يضيف موقع ويب www إذا لم تكتبتوها،
أو يمكن أن تتم إعادة توجيهكم إلى أي مكان.
في الواقع، إذا انتقلتم إلى موقع ويب دورة CS50 عن طريق كتابة CS50.harvard.edu فقط،
شاهدوا عنوان URL.
ستتم إعادة توجيهكم إلى صفحة محددة أكثر، بحسب فترة السنة.
إذن نحن نستخدم هذه الخدع، أيضًا.
قد يبدو 404 غير موجود هكذا، ولكن توجد بشكل
أعمق داخل هذا الظرف المجازي المحتويات الفعلية لصفحة الويب.
إذن تعيدون ليس فقط رؤوس HTTP هذه،
كما تُسمى، في الجزء العلوي من الاستجابة، إذا جاز التعبير،
ولكن يمكنكم أيضًا إعادة HTML، ولغة أخرى تحدثنا عنها،
هذه في الواقع لغة، ولكنها ليست لغة برمجة.
تخبر هذه العلامات المتصفح بالضبط ما سيقوم به وسيقدمه.
لقد قدّمنا علامة النمط هذه، على الرغم من ذلك.
ما الشيء الذي تتيحه لنا هذه للقيام به والذي لا تقوم به HTML بمفردها؟
نعم.
استخدم CSS لتجميل الموقع وجعله أجمل فقط.
HTML، بالنسبة لمعظم الجزء، هو حول البنية
وحول وضع علامات على محتويات صفحة الويب الخاصة بك بطريقة ما
يجدها المتصفح مفيدة.
لكن CSS مخصصة حقًا لمصلحة المستخدم، في نهاية اليوم،
وعينه أو عينها، لأنها تتيح لك بالفعل
التحكم في حجم الخط والموضع والأشياء ذات المستوى المنخفض
التي قد بدأتَ في العبث بها باستخدام أحدث مجموعة مشاكل.
الآن، كنا سنقترح أنه ربما لا يجب أن
تبدأوا كتابة CSS فقط داخل صفحة HTML الخاصة بكم
لأنه من الصعب إلى حد ما الاحتفاظ بها لأن أمثلتكم
تصبح متطورة أكثر.
لذلك قد تستبعدوها.
والاحتمالات التي قمت بها لمجموعة المشاكل
هذه عند إنشاء صفحة رئيسية، إذا كانت لديكم أنماط CSS
نفسها عبر ملفات متعددة، ستكون سخيفة وغير فعّالة لنسخها
ولصقها مرارًا وتكرارًا بينما يمكنكم استبعادها هكذا.
وفي النهاية، نظرنا في JavaScript، آخر مرة،
لغة برمجة أخرى وهي متشابهة للغاية
عند رؤيتها، للوهلة الأولى على الأقل.
لكنها في الواقع تتخلص من الكثير من آلام الصداع ذات المستوى
المنخفض مثل المؤشرات وعناوين الذاكرة والتي
عانينا منها في الأسابيع الأخيرة.
لكن الأهم هو كيف قمنا باستخدامها.
إذن يمكنكم التفكير في صفحة ويب مثل هذه بمجرد تحميلها بواسطة المتصفح الخاص بكم
كبنية شجرة فقط.
فكروا في ما قمنا به في أسابيع مناقشتنا لبنية البيانات
وكل هذه العُقد في الشجرة التي رأيناها في JavaScript التي يمكن معالجتها.
وعبر هذا المبدأ البسيط جدًا، نكتب
التعليمة البرمجية التي تقوم بتعديل هذه الشجرة الموجودة في ذاكرة المتصفح،
وهذا يعني أنه يمكنكم إنشاء أشياء ديناميكية أكثر مثل Gmail وFacebook
وأي عدد من مواقع الويب التي تتغير باستمرار.
لم تقوموا بهذا بعد في مجموعة المشاكل.
لقد قمتم فقط بإنشاء صفحات ويب ثابتة باستخدام HTML وCSS التي تم ترميزها بشكل ثابت.
ولكن سنبدأ في الأسبوع المقبل، وبمجرد أن يتوفر لدينا بفضل هذا الأسبوع، مفردات
python ستبدأون في جعل الأشياء ديناميكية أكثر
ومن ثم إعادة تشغيل JavaScript،
وجمع كل مؤشرات الترابط هذه معًا.
ولكي نقوم بتضمين JavaScript، تذكرون، أننا استخدمنا علامة نص في الأعلى
أو قمنا بطرحها من ملف.
أو في بعض الحالات، إنه لمن الضروري أو المفيد
أن ننقلها إلى أسفل الملف أو نطرحها هكذا،
ولكن المزيد عن هذا لاحقًا.
إذن هل هناك أي أسئلة بشأن الأسبوع الماضي أو على HTTP، أو HTML، أو CSS، أو TCP/IP؟
لا؟
لا شيء على الإطلاق؟
أوه، نعم؟
الجمهور: إذن في أي حالة ستقوم بوضع علامة
النص في أعلى [INAUDIBLE]
ديفيد مالان: سؤال جيد.
إذن في أي الحالات سأضع علامة النص في الأعلى
أم في الأسفل؟
إذا كانت التعليمة البرمجية التي تكتبها في JavaScript تعالج
dOM، الشجرة التي كانت موجودة على الشاشة منذ قليل،
المغزى هو أن هذه الشجرة تحتاج إلى أن تكون موجودة عندما يتم تنفيذ تعليمتك البرمجية.
لذلك، إذا كانت لديك على سبيل المثال، تعليمة JavaScript البرمجية هنا في مقدمة صفحتك،
لكن العُقد في الشجرة، العلامات التي تريد
معالجتها لتغيير الأشياء إلى اللون الأحمر إلى الأخضر إلى الأزرق
مثلما فعلنا في الأسبوع الماضي، أو جعل الأشياء فارغة، وموجودة في أسفل الصفحة هنا،
لا يمكنك كتابة تعليمتك البرمجية هنا وجعلها تغير الأشياء في أسفل الصفحة
هنا لأن الأمر يحدث دون ترتيب.
إذن تبدو متشابهة جوهريًا للغة C حيث يجب أن تحدث الأشياء بالترتيب الصحيح،
إذا أردتم تغيير شيء ما في الأسفل هنا،
تحتاج تعليمتكم البرمجية إلى أن تكون هنا على الأقل،
أو تحتاج إلى استخدام بعض التقنيات الأفضل لقول،
سأقوم بكتابة تعليمتي البرمجية في الأعلى هنا ولكن انتظروا بضع ثوانٍ
قبل تنفيذ ذلك حتى يتم تحميل صفحة الويب بأكملها.
إذن بالنسبة لمعظم الأمثلة التي ألقينا نظرة عليها، لم يكن هذا الأمر يمثل مشكلة.
لكننا سنعود إلى هذا ربما قريبًا.
حسنًا، إذن دعونا الآن نتبع النهج نفسه
الذي قمنا به آخر مرة لتقديم لغة واحدة باستخدام طريقة أخرى.
ستتذكرون، بالطبع، أننا بدأنا الفصل الدراسي بأكمله بسكراتش
وبعد بضعة أسابيع انتقلنا إلى لغة C. وقمنا الأسبوع الماضي
ببعض المقارنات مع JavaScript.
دعونا نفعل الشيء نفسه باختصار مع Python
ولكن بعد ذلك، نقضي وقتًا أطول على لوحة المفاتيح لنقارن بين اللغتين لرؤية
ما هو الاختلاف بينهما في الواقع.
إذن لماذا في لغة أخرى، مع ذلك، أولاً؟
لدينا سكراتش، ولغة C، وJavaScript، وPython، بخلاف HTML وCSS
لأغراض مختلفة.
على سبيل المثال، لماذا لدينا كل هذه اللغات بالفعل؟
لماذا لم يقرر البشر فقط، أن هذا كل شيء، نحن جميعًا نستخدم سكراتش؟
نستخدم جميعًا لغة C أو JavaScript أو Python؟
ما هو الحدس الذي من المحتمل، أن يكون وراء ذلك؟
لماذا يوجد عدد كبير من اللغات اللعينة هناك، بخلاف هذه اللغة؟
أجل؟
الجمهور: [INAUDIBLE]
ديفيد مالان: قُل ذلك مجددًا؟
الجمهور: اللغات المختلفة مفيدة لأشياء مختلفة.
ديفيد مالان: نعم، اللغات المختلفة مفيدة لأشياء مختلفة.
وهذا من المحتمل أن يكون دون القول لشيء مثل سكراتش، أليس كذلك؟
إنه أمر مرئي جدًا.
وبياني ومتحرك جدًا.
يبدو منطقيًا أن قطع اللغز--
أو أن اللغة نفسها مبنية على قطع اللغز
والسحب والإسقاط.
إذن ربما يتم تخصيص اللغات لتطبيقات معينة.
ولكن هل هذا صحيح بالنسبة للغة C، وPython، وJavaScript،
وهي جميعًا لغات قائمة على النص سنراها؟
الجمهور: [INAUDIBLE] على سبيل المثال، هي
مستويات مختلفة من التجريد.
ديفيد مالان: حسنًا.
مستويات مختلفة من التجريد.
الجمهور: لغة C هي [INAUDIBLE] تتعامل بالفعل مع الكثير من الأشياء التي
لا يجب أن تفكر فيها في Python--
ديفيد مالان: جيد.
الجمهور: -- حيث يتم الاعتناء بهذه الأنواع من الأشياء من أجلك،
مثل تخصيصات الذاكرة وهكذا.
ولذا اعتمادًا على أي مستوى تجريد تريد العمل عليه
وأي الأجزاء التي تريد معالجتها.
ديفيد مالان: حسنًا، جيد.
تبدو إعادتها إلى التجريد أمرًا منطقيًا.
لدى لغة C، في الواقع، ذات المستوى المنخفض جدًا، حرفيًا القدرة على معالجة الذاكرة
وعبر المؤشرات وما إلى ذلك.
وهذا أمر عظيم لأنه يمكنك القيام بأي شيء تريده في الكمبيوتر.
لكن يصاحبها خطر كبير وتكلفة كبيرة.
السبب الأول، التكلفة هي وقت الشخص.
والأمر مؤلم فقط لكتابة هذا النوع من التعليمة البرمجية أحيانًا.
والثاني، أنها تُعد أيضًا مخاطرة كبيرة لأنه إذا ارتكبت خطأ ما، حتى لو كان خطأ بسيطًا،
فقد يتعطل الكمبيوتر بأكمله.
ونحن لم نرى أمثلة على ذلك، ولكن قد
تقوموا بإنشاء تعليمتكم البرمجية بحيث تكون عُرضة لمتسلل
إذا كان قادرًا أو كانت قادرة على استغلال خطأ متعلق بالذاكرة بطريقة ما
وقراءة جميع كلمات المرور في برنامجكم، أو شيء من هذا القبيل.
إذن تعد مقولة القوّة الوافرة تصحبها مسؤوليّة كبيرة
شعار لغة C إلى حد ما في الأسفل هنا.
لكن JavaScript التي رأيناها تتيح لنا القيام بأشياء على مستوى أعلى قليلاً.
لم تكن هناك مؤشرات.
لم تكن هناك ذاكرة.
لم نتحدث عن أمور في ذلك المستوى.
تحدثنا عن أشياء في مستوى الشجرة،
dOM في الذاكرة وتغيير الألوان وموضع الأشياء على الشاشة.
وهذا، في الواقع، مستوى أعلى.
الآن، لا ترتكز Python بالضرورة على الويب.
إنها أكثر من لغة متعددة الأغراض.
يستخدم الأشخاص Python لكتابة برامج سطر الأوامر،
مثلما سنفعل قريبًا، على لوحة المفاتيح، كما كنا نفعل باستخدام لغة C.
يمكنكم أيضًا، على الرغم من ذلك، استخدامها، كما سنرى
الأسبوع المقبل، لإنشاء لغات أخرى.
إذن في الأسبوع المقبل سنكتب تعليمة برمجية في Python،
اللغة التي نحن بصدد رؤيتها، لإنشاء لغة أخرى، HTML
وCSS.
ربما لاحظ البعض منكم في الصفحة الرئيسية أن لديكم بعض التكرار.
ربما كانت لديكم علامات متشابهة أو بنية متشابهة،
ربما قائمة متشابهة عبر الصفحات.
ستتيح لنا Python واللغات الأخرى استبعاد
ذلك وإنشاء تلك القواسم المشتركة بسهولة
أكثر، ضمن أشياء أخرى كثيرة.
وكما يمكن القول أنها أسهل وأسرع في الكتابة
لأنها تأتي مع العديد من الميزات، كما سنرى قريبًا.
إذن في الواقع-- أتعرفون ماذا؟
دعوني أقوم بهذا.
دعوني أمضي قُدمًا وأفتح CS50 IDE.
دعوني أمضي قدمًا وأقوم بإنشاء ملف جديد.
وبدافع الفضول، من مجموعات المشاكل
الأخيرة لديكم، ما الذي من المحتمل أن يكون ضمن أكثر البرامج صعوبة التي قمتم بكتابتها؟
الجمهور: الكراك.
ديفيد مالان: حسنًا، كان الكراك فكرة جيدة.
ماذا أيضًا؟
الجمهور: تغيير الحجم.
ديفيد مالان: تغيير الحجم، الاسترداد.
نعم، بالتأكيد التحليلات الجنائية.
ومن المحتمل أن أشخاصًا آخرين قاموا بالاسترداد وتغيير الحجم.
لذلك دعونا نقوم بتغيير الحجم، على سبيل المثال.
إذن دعوني أمضي قدمًا وأكتب برنامجًا في ملف يُسمى resize.py للغة Python،
بدلاً من لغة .C، ونرى إذا كان لا يمكننا قضاء، ماذا، بضع ساعات، يومين،
كما فعلتم على الأرجح في لغة C، تنفيذ تغيير الحجم.
حسنًا، دعوني أمضي قدمًا وأقوم بذلك.
سأمضي قدمًا و--
لنرى.
أولاً سأقوم باستيراد بعض الميزات التي تأتي فقط مع Python.
وسأمضي قدمًا وسأقول من sys قم باستيراد argv.
وسأمضي قدمًا وأقوم أيضًا من pil باستيراد صورة.
لا أعرف بعد ما هي هذه.
سنقوم بتقسيم هذا في غضون لحظات.
لكن بعد ذلك دعوني فقط أجري فحصًا.
إذا كان طول --
بدلاً من ذلك، إذا كان طول argv لا يساوي 4،
سأمضي قدمًا وأخرج من المستخدم وأقول إن استخدام هذا البرنامج
هو Python resize.py وinfile، وoutfile.
إذن على الرغم من أنه يجب أن يبدو بعض هذه مشفرًا في الوقت الحالي،
هناك بعض القواسم المشتركة-- argv، تذكرون، من لغة C،
وسلسلة الاستخدام هذه التي قمنا بطباعتها كلما حدث أي شيء خاطئ.
هذا يبدو مشابهًا جدًا وبشكل جوهري للغة C.
وما الذي فعلناه في تغيير الحجم؟
إذا قمتم بتنفيذ تغيير الحجم، مثل الإصدار الذي اعتدتم عليه بشكل أقل،
لزيادة حجم الأشياء، فمن المحتمل أنكم قد أعلنتم عن متغير مثل n
ويساوي sys--
أو بالأحرى، argv قوس واحد للوصول إليه.
سأمضي قدمًا وأقوم بتحويل ذلك أو صب ذلك إلى int.
من المحتمل أنه كان لديكم متغير infile الذي يمنح الوصول إلى argv 2.
من المحتمل أنه كان لديكم متغير outfile الذي يمنح الوصول إلى argv 3،
وهكذا.
وتبين أنه في Python، أتعرفون ماذا؟
يمكنني بالفعل استخدام مكتبة، التعليمة البرمجية التي كتبها أشخاص آخرون.
دعوني أنتقل إلى متغير يُسمى inimage، مثل infile.
هذا هو inimage الخاص بي.
وسيساوي image.open لأنني
أريد فتح هذا الشيء الذي يُسمى infile.
ومن ثم العرض--
دعوني أحصل على عرض وطول الصورة الموجودة
عن طريق كتابة inimage.size.
ومن ثم دعوني أمضي قدمًا وأقوم بإنشاء صورة جديدة-- سأطلق عليها، outimage--
والتي ستساوي inimage الذي يستدعي دالة تغيير الحجم
والقيام بكتابة العرض ضرب n، والذي يكون الرقم الذي ربما كتبه الشخص،
والطول ضرب n، والذي يكون الرقم الذي كتبه الشخص.
ثم دعوني أمضي قدمًا وأحفظ outfile على النحو التالي.
Outfile، حسنًا.
تم.
مجموعة المشاكل الثالثة.
مفاجأة.
حسنًا، هي مثيرة حقًا أو مثبطة للهمم جدًا، جدًا، ربما.
إذن، وباستخدام اللغة الصحيحة، كما تقولون، هل يمكنكم
حل المشاكل بسهولة أكثر.
الآن، أنا مخادع قليلاً لأنني أيضًا
استفدت مما يُطلق عليها مكتبة.
ووصلنا إلى هذه في لغة C. وبدون شك
يمكننا أن نبحث بشكل أعمق على شبكة الإنترنت
في التعليمة البرمجية الأخرى المتاحة للأشخاص الآخرين ومن المحتمل أن نجد مكتبة لملفات الصورة النقطية.
ولكن لاحظوا أننا لا نتعامل مع الحشو الآن.
لا نتعامل مع المصفوفات.
لا نتعامل مع الذاكرة لأنني استخدم الأداة المناسبة لهذه المهمة.
وإذا كتبتُ هذاه التعليمة البرمجية بشكل صحيح-- ودعوني
أنتقل لأتأكد أنني لم أرتكب أي أخطاء مطبعية.
دعوني أمضي قدمًا هنا وأحصل لنفسي على نسخة
من الوجه المبتسم، الذي أحضرته معي.
إذن تلك كانت الصورة المصغرة من الأسبوع الماضي.
دعوني أمضي قُدمًا وأفتح هذا في IDE.
الوجه المبتسم، فائق الصغر.
فقط بضع وحدات بكسل هناك.
ودعوني أمضي قدمًا الآن وأشغل Python، وسنرى السبب في غضون لحظات،
تغير حجمها.
ودعونا نزيد هذا بعامل 10، ونزيد الوجه المبتسم، ونُسميه out.bmp.
الآن دعوني أمضي قدمًا وأفتح out.bmp و ها هو ذا، يبدو أن الأمر نجح بالفعل.
صحيح، لا توجد ألوان غير تقليدية.
لا توجد أحجام غريبة.
لا يوجد حشو.
لا يوجد حشو لجميع الأشياء.
إنها الآن Python فقط.
لذلك ربما يمكنكم جمع بعض المنطق لما يجري هنا.
لكن بعضها بالتأكيد يجب أن يكون منطقيًا وربما يبدو سحريًا.
لذلك دعونا نستخدم اليوم تقسيم هذا وتقدير ليس فقط
ما يمكنكم القيام به باستخدام لغة أخرى مثل Python،
ولكن كيف هو متشابه ومختلف وكيف تم بناؤه
في الواقع على شيء مثل لغة C. لذلك دعونا نجري بعض المقارنات أولاً
حتى يمكننا أن نرى أنه ليس امتداد كبير لتقديم
لغة أخرى بسرعة حتى الآن.
إذن تذكرون أنه في سكراتش إذا أردنا تعيين متغير، مثل عدّاد،
إلى الصفر، فيمكنكم ببساطة فعل شيء من هذا القبيل،
لتعيينه يساوي صفر على اليسار.
في لغة C، وسنقوم بالشيء نفسه هنا على اليمين.
في JavaScript، بدا هذا مختلفًا بعض الشيء بدلاً من ذلك.
ما الذي قمنا به في JavaScript؟
نعم، استخدمنا يدع بدلاً من ذلك لأننا لم نحدد بشكل واضح النوع.
لكننا بحاجة إلى إخبار الكمبيوتر، دعني أحصل على هذا المتغير الذي يُسمى عدّاد.
في Python، سيكون الأمر كذلك.
إذن لقد تخلصنا من النوع.
لقد تخلصنا من ذكر يدع أو كلمة رئيسية أخرى.
ولقد تخلصنا من-- من المحتمل وبشكل يبعث على الرضى--
اختفت الفاصلات المنقوطة.
لا مزيد من الفاصلات المنقوطة.
ولا مزيد من الأقواس المتعرجة بالطريقة التي رأيتموها حتى الآن.
إذن كانت هذه لغة C، وJavaScript، والآن Python.
إذن ماذا عن شيء كهذا؟
في سكراتش، إذا أردتم زيادة العدّاد بمقدار واحد،
ستستخدمون كتلة مثل هذه.
في لغة C، سنفعل الشىء نفسه على اليمين هنا في التعليمة البرمجية.
في JavaScript، هل تبدو مختلفة على اليمين؟
لا.
لم تسنح لكم فرصة استخدام هذا بعد.
ولكن كانت JavaScript إحدى أنواع عمليات الكشف عن JavaScript أيضًا.
كانت متطابقة.
شيء من هذا القبيل، على الرغم من ذلك، هو Python.
لذا هي نفسها تقريبًا.
لكنني تخلصت من الفاصلة المنقوطة.
لكن المنطق هو نفسه بالضبط--
تعيين العدّاد على اليسار يساوي أيًا كان على اليمين بالإضافة إلى قيمة
إضافية واحدة.
ماذا عن هذا؟
كان لهذا أي تأثير في لغة C؟
زيادة المتغير.
إذن هذا بالضبط الشيء نفسه.
إنه تدوين شديد الاقتضاب جيد لإنشاء عدّاد يساوي
عدّاد زائد 1، وكتابته أمر ممل قليلاً.
كانت لدينا الصيغة نفسها في JavaScript.
وربما يمكنكم التخمين في Python، ما هي الكيفية التي ستبدو عليها؟
الجمهور: الشيء نفسه دون--
ديفيد مالان: الشيء نفسه ناقص الفاصلة المنقوطة.
نمط جميل جدًا حتى الآن.
تصبح اللغات فقط مهذبة ومهذبة، إذا صح التعبير.
في لغة C، تذكرون أنه يمكننا فقط إنشاء زائد زائد،
وهي خدعة أخرى لتشغيل العملية نفسها تلقائيًا.
تتيح صيغة JavaScrip الأمر نفسه.
وإذا كنتم أعجبتكم حقًا تلك الصيغة، فلا يمكنني عرض شريحة Python لكم.
غير موجودة.
لم تعد قادرة على إنشاء زائد زائد.
لذلك نحن ندفع الثمن.
لم يقم مؤلف Python بتضمين ذلك في اللغة.
لكن لا مشكلة.
لدينا على الأقل هذه، وهي ليست مروعة للغاية.
إذن ما الذي ألقينا نظرة عليه أيضًا في المرة الأخيرة؟
وحالة إذا كهذه، لمقارنة إذا كان x أقل من y،
في لغة C تبدو هكذا.
في JavaScript تبدو مثل هذا الشيء نفسه.
في Python، تبدو هكذا.
لذا اختفت الأقواس المتعرجة.
تمت إضافة نقطتين.
وما لم تروه بعد هو أن المسافة البادئة ستكون مهمة.
لذلك أي منكم كان يتعامل مع style50 على نحو سريع وغير دقيق
وكما رأينا في ساعات العمل، جميع تعليماتكم البرمجية،
ومع ذلك فإن العديد من السطور التي قمتم بكتابتها لأي سبب من الأسباب
تتم محاذاتها جميعًا على اليسار ولم تتم إزاحة أي شيء في الواقع.
الآن لن تسمح Python بذلك.
تتطلب Python مسافة بادئة من أجل المنطق.
إذن هذه في الواقع ميزة نمطية للغة.
إنها تجبركم على اعتماد أمور نمطية مرئية جيدة لأن التعليمة البرمجية
لن يتم تشغيلها فقط إذا لم تضع المسافات البادئة بشكل صحيح.
إذن أي شيء سيحدث إذا كان x أقل من y
وتحتاج إلى إزاحته، لنقل، أربع مسافات أسفل تلك النقطتين.
ماذا أيضًا قد رأيناه؟
في لغة C أو في سكراتش كانت لدينا هذه الكتلة لـ if وكتل أخرى.
في لغة C تبدو هكذا.
في JavaScript تبدو هكذا.
في Python، ستبدو هكذا، وإن كانت باستخدام مسافة بادئة
أسفل كل علامات النقطتين تلك.
ماذا عن هذا؟
عندما كان لدينا مفترق طرق ثلاثي الاتجاهات-- ماذا لو أخرى، ماذا لو أخرى--
في لغة C يبدو الأمر هكذا.
بدت JavaScript نفسها.
في Python، تبدو غير تقليدية قليلاً.
ستبدو هكذا--
ولكن ثلاث علامات نقطتين، هذه المرة علامتين.
ماذا أيضًا؟
ألقينا نظرة على التكرارت الحلقية الدائمة في سكراتش، وفي لغة C، وفي JavaScript.
يمكنكم استخدام الصيغة نفسها بالضبط في Python، تقريبا الشيء نفسه.
اختفت الأقواس المتعرجة، وتمت إضافة النقطتين.
والخدعة الطفيفة، إذا لاحظتم ذلك، صحيح وخاطئ
أصبحت الآن أسماء مناسبة جديدة، إذا صح التعبير.
وتعد كتابة حرف T كبير حرف F كبير أمرًا ضروريًا.
ماذا عن التكرار الحلقي؟
إذن في سكراتش، يمكننا القول بسهولة، كرّر هذا 50 مرة.
C وJavaScript دقيقتان قليلاً حيث يتعين
عليكم التهيئة والزيادة والتحقق.
تتخذ C وJavaScript النهج نفسه،
على الرغم من أننا بالطبع نستخدم let في JavaScript بدلاً من int.
Python أكثر إيجازًا قليلاً على الرغم من أنها أقل وضوحًا قليلاً
خطوة بخطوة.
تفعلون هذا فقط.
إن i في نطاق 50 هو طريقة لقول ابدأ التكرار في 0،
احسب على طول الطريق ما يصل إلى ولكن لا يتضمن 50،
وبالتالي يتيح لكم نطاق القيم.
إذن هذه هي الطريقة التي ربما الأكثر غرابة
حتى الآن، ولكنها ما تزال أكثر إيجازًا في الكتابة.
إذن في لغة C، كان لدينا العديد من أنواع البيانات-- bool، char، double، float، int، long،
سلسلة--
آخر هذه الأنواع، بالطبع، من مكتبة CS50.
وهناك أنواع أخرى يمكنكم استخدامها في لغة C،
كما قد تتذكرون، من مجموعة المشاكل 3، ربما.
في Python، سنقوم بتقصير هذه القائمة، على الأقل في البداية،
لأنواع البيانات هذه فقط.
في Python، سيكون لدينا قيم منطقية bools لصحيح وخاطئ، وfloats لأرقام حقيقية،
وints لأعداد صحيحة، ومن ثم strs لسلاسل.
فقط بصورة موجزة أكثر قليلاً، ولكنها موجودة بالفعل. str في Python
شيء حقيقي.
إنها ليست إضافة CS50.
هناك أنواع بيانات أخرى تأتي مع Python.
في الواقع، بهذا تصبح اللغة قوية.
ومَن جاء منكم من خلفية Java أو لغة ++C،
مجموعتكم الفرعية من الأشخاص الذين قاموا بالبرمجة من قبل،
لديكم المزيد من الميزات في Python فقط مثلما تفعلون في تلك اللغات الأخرى
التي لم تكن لدينا في C. في Python، لديكم قواميس أو جداول علامات التجزئة.
لديكم قوائم، وهي عبارة عن مصفوفات، ولكن يمكنكم تغيير حجمها تلقائيًا.
لا يتعين عليكم اتخاذ قرار مسبقًا عن مدى كبر أو صغر حجمها.
النطاق الذي رأيناه للتو، إنه نطاق القيم، مثل 50 منها،
تم تعيينه بالمعنى الرياضي.
إنه مجموعة من الأشياء التي تضمن لك عدم وجود
تكرارات في تلك المجموعة.
ومن ثم الصف وهو مزيج من الأشياء التي تشبه الرياضيات إلى حد ما
عندما يكون لديكم x فاصلة y أو خط الطول فاصلة خط العرض.
في أي وقت لديكم أزواج أو ثلاثيات أو الكثير من الأشياء،
هذه تُسمى بالصفوف.
وهي شائعة في دورات الرياضيات وفصول نظرية CS للمستوى الأعلى،
أيضًا.
ولكننا أعطيناكم، في هذا الأسبوع الأول على الأقل
نظرتنا في Python، وعدد قليل من الدالات من CS50،
من بينها getFloat ،getInt، وgetString، والتي تتصرف بالضبط
مثل نظرائها في C.
وهذا سيتيح لنا فقط البدء
بكتابة تعليمة برمجية بطريقة تذكرنا جدًا بما فعلناه في الأسابيع القليلة الماضية.
ولكن دعونا نفكر في الشيء الذي سيتغير
بينما نحن على وشك البدء بكتابة البرامج الخاصة بنا.
في لغة C، عندما كنت تريدون استخدام مكتبة CS50، وقمتم بالطبع
بتضمين ملف الرأس الخاص بها.
ستغير هذه الصيغة في Python حيث كنتم في هذا الأسبوع الأول
تريدون استخدام مكتبة CS50، ستقولون بدلاً من ذلك
من CS50 قم بالاستيراد ثم قائمة من الدالات مفصولة بفاصلة
تريدون استيرادها أو استخدامها في تعليمتكم البرمجية.
إذن، هذا الأمر دقيق أكثر قليلاً.
لا تقول هذه الصيغة أعطني كل شيء.
أعطني هذا، وهذا، وهذا الشيء الآخر.
وإذا كنتم ترغبون في استخدام قائمة واحدة أو أكثر، فيمكنكم فقط الفصل بينها بفواصل.
وكملاحظة جانبية، وعلى وجه التحديد هؤلاء الذين رأوا Python من قبل،
هناك طرق أخرى للقيام بذلك.
توجد عدة نُهج.
من المحتمل أن هذا هو الشيء الأنسب للمقارنة لأغراضنا اليوم.
ما الذي ستعرفونه أيضًا؟
في لغة C يجب أن تحولوا تعليمتكم البرمجية برمجيًا.
وقمتم بذلك باستخدام clang، هكذا.
ومن ثم قمتم بتشغيل البرنامج باستخدام نقطة خط مائل مرحبًا.
أو بشكل بسيط أكثر، كتبتكم مرحبًا، وبعد ذلك
كنا سنكتشف الأمر من أجلكم في IDE أو sandbox أو lab.
في Python، ستقومون بتخطي خطوة التحويل البرمجي.
عندما تريدون تشغيل برنامج في Python،
ستقومون فقط بما فعلته بسرعة من قبل.
ستقومون فقط بتشغيل الأمر Python ثم اسم الملف
الذي تريدون تشغيله.
والسبب وراء هذا هو على النحو التالي.
في عالم لغة C، تذكرون أنه كان لدينا هذا النوع من العملية المستمرة
حيث لدينا تعليمة المصدر البرمجية الخاصة بنا كمدخل.
ثم أردنا الوصول إلى المغزى من التعليمة البرمجية الآلية، الأصفار والواحدات.
وما الذي كان يحول بين تعليمة المصدر البرمجية والتعليمة البرمجية الآلية،
فقط ليتضح الأمر؟
أي عملية؟
نعم، إذن التحويل البرمجي.
إذن كان لدينا محول برمجي في المنتصف هدفه في الحياة
بحسب التعريف هو ترجمة لغة إلى أخرى.
ويصادف أنه بلغة تشبه اللغة الإنجليزية إلى لغة تشبه الكمبيوتر
ولكن المحول البرمجي هو مصطلح عام فقط يحول شيء واحد إلى آخر.
إذن بدا خط الاتصال هذا للغة C هكذا.
وهذا هو السبب في أنه يجب أن تشغلوا Clang بشكل صريح، أو make.
يجب أن تزيحوا عملية man في المنتصف
لتحويل اللغة إلى شيء يفهمه الكمبيوتر.
لم يتم تحويل Python ولغات أخرى برمجيًا بالطريقة نفسها تمامًا.
يتم قولها بشكل عام ليتم تفسيرها،
حيث لن تقوموا بتحويلها برمجيًا إلى أصفار وواحدات
ومن ثم تشغيل البرنامج.
يمكنكم بدلاً من ذلك تشغيل برنامج كتبه شخص آخر يُسمى Python.
وهذا البرنامج، بحسب تعريفه، هو مترجم.
وهدف هذا المترجم في الحياة، كما تشير
الكلمة، هو قراءة تعليمتك البرمجية من الأعلى إلى الأسفل، من اليسار إلى اليمين،
ويقوم بالضبط بما تمليه عليه لفعله،
خطوة بخطوة بخطوة، دون القيام بعمل مسبق لتحويل الأشياء
إلى أصفار وواحدات.
إذن في عالم البشر، إذا كنت أتحدث اللغة الإنجليزية وهناك شخص ما
يتحدث اللغة الإسبانية وكل منا لا يتحدث لغة الآخر،
قد نضع شخص ثالث بيننا، بالطبع شخص يعمل مترجمًا.
الدور متشابه جدًا.
يستمع المترجم إليّ ثم يترجم
هذا لشيء يفهمه الكمبيوتر.
ولكن لن يصبح أصفار وواحدات.
إنه ينتقل فقط مباشرة من واحد إلى الآخر.
إذن الاختلاف هنا في Python هو أنك ستظل
تكتب تعليمة المصدر البرمجية ، مثلما فعلتُ بسرعة لتغيير الحجم.
وفي نهاية المطاف، نحن فعلاً نريد تحويلها
إلى برنامج يُسمى مترجم.
ولذا تبدو الخطوة المثالية مثل هذه.
ولكن كملاحظة جانبية، Python هي لغة متطورة للغاية.
وعلى الرغم من أن لدينا رفاهية تشغيلها فقط
باستخدام خطوة واحدة بدلاً من هاتين الخطوتين، هناك في الواقع، كملاحظة جانبية،
بعض السحر غير الظاهر.
وبداعي الفضول، هناك في الواقع، لأسباب تتعلق بالأداء،
محول برمجي تم إنشاؤه في Python يقوم بالفعل بتحويلها إلى شيء ما
وسيط يُسمى التعليمة البرمجية المكونة من وحدات البايت.
والتعليمة البرمجية المكونة من وحدات البايت هي ما تم تفسيره بالفعل.
وهذا هو السبب في أن Python، على الرغم من أنها قد تكون أبطأ من لغة C
في بعض المهام لأنكم لن تنتقلوا إلى الأصفار والواحدات ذات المستوى المنخفض،
يمكن استخدمها في الواقع في تطبيقات الأعمال التجارية ومواقع الويب الشائعة
وما شابه ذلك.
وهذا الأمر لم ينجح بشكل جيد.
ولذا يمكن أن تكون ذات أداء عالٍ، أيضًا.
ولكن المزيد حول ذلك بعد قليل.
إذن من هذا المنطلق، إذا كانت هذه هي الاختلافات ليس فقط
من الناحية البنائية ولكن أيضًا من الناحية الآلية، دعونا نمضي قدمًا
ونكتب برنامجًا بالفعل.
لذا دعوني أمضي قُدمًا وأنتقل إلى IDE.
دعوني أغلق الأمثلة السابقة.
ودعونا نبدأ بشكل بسيط أكثر لأن تغيير حجم كان أمرًا صعبًا في كل مرة.
دعوني أمضي قدمًا وأقوم بإنشاء ملف جديد يُسمى hello.py.
وبدلاً من كتابة هذا البرنامج بلغة C،
دعوني أمضي قدمًا وأكتب فقط مرحبًا بالعالم.
لذا دعونا نمضي قُدمًا ونفعل هذا.
اطبع مرحبًا بالعالم.
تم.
هذا هو أول برامجي في Python، وحقًا أول برنامج أقوم به في Python،
ليس شيء حيوي بتغيير الحجم إلى حد ما.
إذن ما هو الشيء غير الموجود في هذا الملف والذي كان في شيء مثل hello.c؟
لا توجد دالة main الضرورية هنا.
ما هو الشيء غير الموجود أيضًا؟
الجمهور: Printf.
ديفيد مالان: لم يذكر printf.
إنها طباعة بدلاً من ذلك، وهي مراعية للشخص بشكل أكبر قليلاً.
الجمهور: المكتبات.
DAVID MALAN: لم تذكر ملفات الرأس أو المكتبات
في الجزء العلوي من الملف.
لقد تعمقتُ فقط بشكل صحيح وانتقلتُ إليه.
نعم؟
الجمهور: لا توجد فاصلات منقوطة.
ديفيد مالان: لا توجد فاصلات منقوطة.
ماذا أيضًا؟
نعم؟
الجمهور: لا يوجد خط مائل عكسي n.
ديفيد مالان: لا يوجد خط مائل عكسي n.
من المحتمل أنني-- لم أقم بتشغيلها بعد، ولكن أعتقد
أنني سأحصل على هذا مجانًا هذه المرة باستخدام Python.
لا يجب أن أكون صريحًا جدًا.
هل كانت هناك يد أخرى مرفوعة هنا؟
الجمهور: لا يوجد حرف f في printf.
ديفيد مالان: لا يوجد حرف f في printf، نعم.
شيء آخر؟
لا توجد مسافة بادئة.
ومع ذلك لكي نكون منصفين، هناك سطر واحد فقط.
لكن لا توجد مسافة بادئة.
هذا عادل.
لا توجد أقواس متعرجة، أيضًا.
لم يذكر int.
لم يذكر void.
أعني، يا إلهي.
لماذا لم نفعل هذا فقط في المرة الأخيرة؟
ولهذا السبب تتطور اللغات.
أدرك الأشخاص منذ سنوات، يا إلهي، لغة C تخدمنا بشكل جيد.
بمجرد أن أفهم المؤشرات والصيغة، حسنًا، لقد فهمت.
لكن يا إلهي، إن كتابة حتى أبسط البرامج أمر ممل
لأنه يجب أن أكتب علامة التجزئة بما في ذلك، standard io.h، int main void، أعني،
كل هذا التجاوز البنائي الذي يحول فقط دون قيامك
بالعمل الذي تهتم به، وهو في أبسط أشكاله
هنا حيث يقوم فقط بطباعة مرحبًا بالعالم.
إذن Python والعديد من اللغات الحديثة-- من بينها،
Ruby وPHP ولغات أخرى--
فقط تتخلص من العديد من هذا التجاوز حتى يمكنكم البدء
بالعمل بسرعة أكبر على الفور.
إذن كيف يمكنني المضي قدمًا وتشغيل هذا؟
في لغة C، تذكروت أنني قمتُ بإنشاء نقطة خط مائل hello.py.
لكننا قلنا للتو منذ لحظة أن هذا ليس هو النهج الصحيح.
كيف يمكنني المضي وتشغيل هذا البرنامج؟
نعم، إذن حرفيًَا أقوم بتشغيل برنامج يُسمى بالصدفة Python نفسها.
هذا هو المترجم.
هذا هو الرجل في المنتصف بيني وبين صديقي الذي يتحدث اللغة الإسبانية
ويجب عليه فقط تحويل hello.py إلى أي جهاز كمبيوتر يفهمه
بنفسه.
إذن لدينا هناك، بالفعل، مرحبًا بالعالم.
وكما تلاحظون، لا يوجد خط مائل عكسي n على تعليمتي البرمجية.
لكنني أحرك المؤشر إلى السطر الجديد.
حيث قررت Python للتو، أتعلمون ماذا؟
إنه لمن الشائع للغاية أن تكون هناك سطورًا جديدة، دعونا فقط نضيف هذه بشكل افتراضي.
تعلمون، سيكون الثمن الذي سندفعه
مزعجًا قليلاً للتخلص منها.
لكننا سنرى ذلك بعد قليل، أيضًا.
إذن إنها مجرد مقايضة.
حسنًا، لنقم بشيء واحد آخر.
وهو أبسط البرامج الممكنة فقط.
دعونا نمضي قدمًا ونقوم، لنقل، بشيء أفضل قليلاً
يتيح لنا أن نفعل شيء أكثر من ذلك.
إذن دعونا نمضي قدمًا، لنقل، ولا نقارن هذا
فقط، ولكن دعونا في الواقع نحصل على بعض مدخلات المستخدم.
إذن بالنسبة لمدخل المستخدم، توجد بعض الطرق للقيام بذلك.
سنقوم بذلك بطريقة CS50 في البداية، لكن هذه هي عجلات التدريب هذا الأسبوع
التي سنستخدمها لأسبوع واحد فقط قبل أن نزيلها،
فقط للانتقال من لغة C إلى Python.
دعوني أمضي قدمًا واستدعي هذه السلسلة zero.py
لأني أتعامل مع السلاسل.
ودعوني أمضي قدمًا وأكتب s ليتم منحي متغير.
Get string.
دعوني أطلب من الشخص اسمه أو اسمها هكذا، ومن ثم دعوني أمضي قدمًا
وأقول مرحبًا.
وكذا وكذا، والآن يجب فقط أن أفكر في كيفية طباعة اسمه.
وفي Python، يمكنني في الواقع القيام بذلك فقط.
لا أحتاج إلى كتابة النسبة المئوية s.
ولا أحتاج إلى وضع واحدة أخرى-- أو، لا أحتاج إلى وضع فاصلة ثانية هنا.
ولكن يمكنني فقط القيام بهذا، وهو أبسط قليلاً.
وهذا غير صحيح.
أنا لا أفعل ما أنصح به.
التخلص من f.
فقط طباعة ما كنتَ تريد طباعته، حقًا.
إذن s، لاحظوا، من الواضح أنه متغير لأنني أقوم بتعيين
قيمة له من اليمين إلى اليسار.
ولكن لاحظوا أنني لم أحدد النوع.
إذن، تحتوي Python على نوع. str التي تحدثنا عنها وهي سلسلة مُعادلة.
لكن لا يجب أن تذكرها.
Python، مثل JavaScript، ستحددها، حتى دون وجود كلمة رئيسية
مثل let.
لكنني أحتاج إلى إضافة شيء واحد.
ما هو؟
الجمهور: تحتاج إلى استيراد getString؟
ديفيد مالان: نعم، getString هي شيء خاص بدورة CS50.
وسنستخدمها فقط لمدة أسبوع، ولكنني أحتاج إلى استيرادها.
والصيغة للقيام بهذا باستخدامها هي لقول، من مكتبة CS50،
قم باستيراد دالة تُسمى getstring.
ولا أحتاج إلى استيراد المزيد مع الفواصل.
هذه تكفي لهذا البرنامج.
أجل.
الجمهور: هل تريد أن--
بدلاً من قول مرحبًا اسمك، هل تريد الحصول أولاً على الاسم الذي يقول
[INAUDIBLE]؟
أنت لا تشير إلى مكان وجود الخطأ [INAUDIBLE]..
ديفيد مالان: بالتأكيد، دعوني أعود مجددًا إلى هذا خلال ثانية واحدة.
دعونا نشغل هذا البرنامج أولاً لإثبات أنه يقوم
بالفعل بما رأينا أنه يقوم به في الأسبوع الماضي.
ودعوني أمضي قدمًا هنا وأكتب هذه المرة Python من سلسلة 0.
دعوني أمضي قدمًا وهي فقط في انتظار اسمي.
إذن سأكتب ديفيد.
مرحبًا، ديفيد.
ولكن كما كنتم تقترحون، ماذا إذا أردت تغيير موضع هذا؟
حسنًا، لنفترض أنني أردت قول اسم الشخص وبعد ذلك
شيء مثل مرحبًا لأنني متحمس بالفعل لرؤيته، بدلاً من ذلك.
دعونا نرى ما يفعله هذا.
دعوني أمضي قدمًا الآن وأشغّل Python من سلسلة 0.
أكتب اسمي.
وأعتقد أنه تقريبًا ما قصدتموه.
لكن هناك خطأ--
خطأ جمالي، على الأقل.
إذن يبدو أنه باستخدام دالة طباعة Python لا
تحتاجون إلى استخدام العنصر النائب مثل النسبة المئوية s.
ولكن يبدو أنه من المفترض أن تضيف مساحة من أجلك بعد كل شيء
تمر به كمدخل لطباعتها.
لذا لاحظوا كم وسيطة تستهلكها الطباعة
وفقًا لهذا الجزء المظلل؟
كم عدد الوسطيات التي يمكن أن تستنتجوها؟
الجمهور: S مسافة ومن ثم الشيء.
ديفيد ج. مالان: وسيطتان؟
نعم، إذن وسيطتان.
وسيطة واحدة هي s، فاصلة، والثانية هي ما تم تظليله باللون الأخضر هنا.
نعم، توجد فاصلة ثانية هناك، ولكنها داخل السلسلة.
إذن مثلما هو الحال في C، وهذا نوع من أنواع جذب الانتباه.
توجد وسيطتان هنا فقط.
ولكن يبدو أن دالة الطباعة-- وستعرفون ذلك
من خلال قراءة هذه الوثائق-- إذا مررتم في وسيطتين أو ثلاث أو أكثر،
إنها تطبعها جميعًا.
لكن تفصل بينها بمسافة واحدة.
إذن هذا ليس صحيحًا تمامًا.
إذن هذا دافع كبير بالفعل لإزالة ذلك.
إذا كنت أريد بالفعل تحسين هذا البرنامج وتنظيمه قليلاً،
دعوني أفعل ذلك في الإصدار الأول هنا.
دعوني أقوم بإنشاء ملف آخر يُطلق عليه، على سبيل المثال، string1.py.
دعوني أبدأ من حيث بدأنا منذ قليل.
ودعوني أستخدم عنصر نائب بالفعل يشبه C. لذا إذا أردتُ كتابة،
على سبيل المثال، مرحبًا ذاك وذاك، يتضح أنه يمكنك بالفعل قول، مرحبًا Python،
ضَع متغيرًا يُسمى s هنا.
ومع ذلك، إذا قمتُ بتشغيلها كما هي، ستصبح خطأ.
لم يتم حلها تمامًا بعد.
ولكن عندما أنقر فوق Enter الآن وأكتب اسمي--
حسنا، هذا يبدو بالفعل أمرًا غبيًا.
لذا يبدو أنني بحاجة إلى إخبار Python بأن هذه السلسلة التي أمر بها،
مرحبًا فاصلة ذاك وذاك، هي سلسلة منسقة.
إنها سلسلة العنصر النائب التي يجب أن تتم بها بعض التغييرات.
وهذا مشفر بشكل غريب بعض الشيء من الناحية البنائية في Python.
لكن الطريقة التي تفعلون بها ذلك في Python هي أن تضعوا حرف f قبل السلسلة نفسها.
لذا معذرة، لقد تخلصنا من f منذ لحظة.
لذا نحن نسميها الطباعة فقط.
نحن الآن نعيد استخدام f مختلفة هنا.
وهذه صيغة تبدو غبية، في الحقيقة.
ولكن هذه تعني فقط، مرحبًا Python، علامات الاقتباس المزدوجة التالية
أو علامات الاقتباس المفردة التي على وشك أن تروها يجب
أن تكون منسقة بطريقة خاصة.
وهي حرفيًا ستنتقل إلى بداية السلسلة
حتى على الرغم من أن ذلك يبدو أمرًا غريبًا في الحقيقة.
لكن إذا أعدت الآن تشغيل سلسلة Python هذه وكتبتُ الآن اسمي،
الآن إنها تقوم بالاستبدال.
إذن يمكنني أن أغيرها بصورة مرنة أكثر وبشكل منطقي الآن
وأقوم بشيء مثل مرحبًا لأنني الآن أمرُ بوسيطة واحدة
ستنسقها الطباعة من أجلي.
إذن عندما أكتب اسمي الآن، لن أحصل على هذه المسافة غير الضرورية.
والآن أنا أتحكم بشكل كامل في تنسيق السلسلة.
إذن تعرفون، خطوتان إلى الأمام إلى حد ما، ربما، خطوة واحدة إلى الخلف من الناحية البنائية.
لكنها تتيح لنا أن نقوم بما نريد القيام به.
يمكننا كتابة البرنامج نفسه باستخدام أعداد صحيحة
وقيم كسرية باستخدام getInt وgetFloat.
ستبدو الأمر نفسه بالضبط.
لا تقلقوا بشأن النسبة المئوية s مقابل النسبة المئوية i مقابل النسبة المئوية f.
أنتم تكتبون فقط اسم المتغير داخل تلك الأقواس المتعرجة.
حسنًا، دعوني أمضي قدمًا وأقوم ببعض العمليات الحسابية بسرعة.
دعوني أمضي قُدمًا وأقوم بذلك.
دعوني أمضي قدمًا وأقوم بإنشاء ملف جديد.
سنسمي هذا ints.py للأعداد الصحيحة.
ودعوني أمضي قدمًا وأحصل على حق الوصول هذا إلى--
ماذا عن دالة أو طريقة getint الخاصة بمكتبة CS50 الموجودة.
بعد ذلك دعوني أمضي قدمًا وأعلن عن متغير
يُسمى X وأحصل على عدد صحيح من المستخدم وأطلب منه أو منها X فقط.
ثم دعوني أمضي قدمًا وأقوم بالشيء نفسه
وأحصل فقط على y منه، أيضًا.
ومن ثم في الأسفل هنا، دعوني أقوم فقط ببعض العمليات الحسابية البسيطة.
وقمنا بهذا في الأسبوع الأول عن طريق الطباعة على النحو التالي.
دعوني أمضي قدمًا وأطبع فقط x زائد y يساوي--
والآن هذا هو الأمر الرائع في ميزة القوس المتعرج هذه.
يمكنك بالفعل استخدام ليس فقط أسماء المتغيرات،
ولكن يمكنك أيضًا القيام بعمليات بسيطة هناك، كذلك.
يمكنني حرفيًا القيام بعملية حسابية داخل تلك الأقواس المتعرجة وطباعة تلك القيمة.
لكن بالطبع، هذا سيقوم فقط حرفيًا بطباعة الأقواس المتعرجة.
ماذا عليّ أن أضيف؟
نعم، لذا إنه يبدو غريبًا بعض الشيء.
لكن هذا الآن سيحل هذه المشكلة.
سيقوم حرفيًا بطباعة x زائد y يساوي أيًا كان المجموع الفعلي.
الجمهور: مجرد متابعة، ما الذي تعنيه f؟
ديفيد ج. مالان: تنسيق.
تنسيق السلسلة التالية من أجلي.
سؤال جيد.
دعونا نقوم قليلاً بالنسخ واللصق ولكن سنغير المُشغل هنا.
إذن x ناقص y، أريد أن أرى كيف يبدو هذا.
X، لنقل-- ماذا فعلنا آخر مرة؟
الضرب في y.
أريد أن أقوم بتلك العملية الحسابية، أيضًا.
يمكنني أن أقسّمها أيضًا.
ومن ثم كان لدينا شيء واحد آخر، وهو نموذجي،
أو عمليات حسابية نموذجية، وهي، تتذكرون، علامة النسبة المئوية.
إذن من الناحية البنائية، إنها متطابقة في الشكل.
نحن فقط نضيف تدوين القوس المتعرج هذا لدالة الطباعة
الآن.
دعوني أمضي قُدمًا وأشغل ذلك.
Python من ints.py.
ودعوني أمضي قدمًا وأقوم بكتابة واحد ولنقل اثنين.
إذن 1 زائد 2 هو 3.
1 ناقص 2 هو -1.
1 ضرب 2 هو 2.
1 مقسوم على 2 هو 0.5.
ومن ثم 1 مقسوم على 2 ونأخذ الباقي 1.
إذن أعتقد أن هذا يتحقق رياضيًا.
لكن يجب أن تكونوا متفاجئين قليلاً من إحدى هذه النتائج.
كررها؟
الجمهور: حصلتَ على قيمة كسرية.
ديفيد ج. مالان: نعم ،حصلتُ على قيمة كسرية.
على سبيل المثال، يبدو أن Python نفسها قد أصلحت خللاً في C نفسها.
ماذا حدث في C عندما قسمتَ 1، عدد صحيح، على 2، عدد صحيح، في C؟
ستحصل على عدد صحيح آخر.
وما هو أقرب عدد صحيح يمكنك تمثيله
ولا توجد فيه علامة عشرية؟
0، لأن C سوف تقتطع كل شيء بعد العلامة العشرية.
وحتى الآن، يبدو أن Python قد أصلحت هذه المشكلة.
وهذه في الواقع ظاهرة حديثة إلى حد ما.
وهذا موضع نقاش كبير وقديم حول ما إذا كان
يجب أن تحتفظ بالتعريف التاريخي للقسمة أم لا، وهو
هي قسمة عامة، إذا جاز التعبير، أو يجب أن نجعلها قسمة حقيقة،
مثلما تعلمنا جميعًا في المدرسة.
اتخذت Python النهج الأخير وجعلت القسمة تعني القسمة، القسمة الحقيقية،
حيث إذا قمتَ بقسمة عددين صحيحين ستظهر لك قيم كسرية.
بالطبع، هذه هي المشكلة إذا أراد الأشخاص
كتابة التعليمة البرمجية التي تفترض أنه سيتم اقتطاعها.
يمكن أن يكون ذلك بمثابة ميزة قوية في الواقع.
إذن يتضح أن، ولن تسنح لك فرص لاستخدام هذا كثيرًا،
لكن التسوية في العالم كانت، حسنًا، إذا كنتم حقًا
تريدون النهج القديم للقسمة في Python، سنعيده لكم.
يجب أن تستخدموا خطين مائلين.
لذا مجددًا، خطوة واحدة أخرى من هاتين الخطوتين إلى الأمام، خطوة واحدة الى الخلف.
لكن إنها هناك، لذا يمكن حل المشاكل بالطريقة نفسها.
وهذا، إذا قمتُ بحفظه وأعدتُ تشغيل التعليمية البرمجية نفسها، 1 و2،
الآن حصلتُ على 0، تماما كما في C، وهو يمكن تطبيقه.
دعونا نطرح الآن مثالاً آخر يحتوي على بعض الأرقام.
ودعوني أمضي قدمًا وأسمي هذا floats.py.
ودعوني أفعل الشيء نفسه، من CS50 قم باستيراد getFloat هذه المرة.
لذا يمكنني التعامل مع قيم كسرية حقيقية.
دعوني أعلن عن متغير × وأحصل على قيمة كسرية
وسنطلب من المستخدم متغير x.
ثم دعونا نمضي قدمًا ونحصل على قيم كسرية أخرى، وكما فعلنا من قبل، نسميها y.
لكن هذه المرة، كلتاهما، في الواقع، قيمة كسرية.
إذن دعوني أمضي قدمًا وأقوم بعملية حسابية، x زائد y يساوي z.
دعوني أعطي نفسي متغير ثالث.
ومن ثم دعوني فقط أمضي قدمًا وأقوم بطباعة رسالة متشابهة--
x مقسوم على y يساوي z.
حسنًا، ودعوني أمضي قدمًا وأقوم بحفظ هذا، وأزيل ما بداخل نافذتي الطرفية،
وأقوم بإنشاء Python من floats.py.
1 مقسوم على 10 هذه المرة.
وأحصل-- اللعنة، خطأ.
كيف أقوم بحل تلك المشكلة؟
حسنًا، إذن مجرد f بسيط.
لنجعلها سلسلة منسقة.
ليس أمرًا صعبًا.
إذن لنعيد تشغيل هذا، 1، 10.
حسنًا، هوو، هوو.
هذا أمر جديد.
ما الذي يحدث هناك؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: لقد حددت z في السطر أعلاه، وما هو تعليقك؟
الجمهور: لقد استخدمتَ x زائد y.
ديفيد ج. مالان: لقد استخدمتُ x زائد y، لكنني أعتقد أنني--
أوه، انتظر، حسنًا.
معذرة.
دعونا-- حسنًا، حتى نتمكن من إصلاح ذلك.
دعونا-- معذرة.
هناك.
حسنًا، إذن 1، 10.
امم، ما زال خطأ.
ملاحظة جيدة، شكرًا لك، على الرغم من ذلك.
لماذا 1 زائد 2 يساوى 11--
أو 1 زائد 10 يساوى 11؟
أجل؟
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: انتظروا، انتظروا، انتظروا.
معذرة.
الجمهور: [INAUDIBLE]
[LAUGHTER]
ديفيد ج. مالان: هذا يعيدني إلى وجهة نظري السابقة وهي كم أنا متعب.
إذن هذا صحيح.
إذن Python تقوم بالعملية الحسابة بشكل صحيح.
لكن-- حسنًا، هذا أمر مروع.
حسنًا، إذن الآن دعونا نقوم بالقسمة ونحاول
نجعل النقطة أعتقد أنني قصدتُ في وقت متأخر من الليلة الماضية حيث إذا قسمتُ 1
على 10، حسنًا، 1 مقسوم على 10، كما هو متوقع، هل ينجح الأمر هنا بالفعل.
إذن 0.1، هذا صحيح.
ولكن تذكرون في C-- دعوني أخرِج نفسي من هذا المأزق--
تذكرون في C ماذا حدث لو تعمقنا أكثر قليلاً
ونظرنا قليلاً في النقطة العشرية الأولى.
إذن كيف أقوم بفعل ذلك في Python؟
الأمر متشابه للغاية في الواقع.
دعوني أمضي قدمًا وليس فقط أعرض بنفسي z لكن أمضى قدمًا
وأطبعه، دعونا نقول، لموضعين عشريين هذه القيمة نفسها.
الصيغة هنا غريبة.
انها مختلفة عن C. لكنكم حرفيًا تأخذون المتغير الذي تريدون تنسيقه،
وتضعون نقطتين ومن ثم نقطة--
لأنكم تريدون ضبط النقطة--
ومن ثم تريدون أن تقولوا شيئًا مثل 2f.
لذا هذا يقول، مرحبًا، Python، قم بتنسيق المتغير
الموجود على يسار النقطتين باستخدام نقطتين عشريتين.
وبالمناسبة، إنها قيمة كسرية حقيقة.
إذن f هذا له معنى مختلف.
هذا هو f كما هو في قيمة كسرية.
f على اليسار منسق.
إذن دعوني أمضي قُدمًا وأشغل هذا.
1 مقسوم على 10.
وحسنًا، ما يزال الأمر جيد جدًا.
إذن دعونا نقوم بذلك ربما ثلاثة مواضع عشرية، ونحفظ ذلك، ونعيد تشغيله.
1 مقسوم على 10.
ما يزال الأمر جيدة جدًا.
دعونا نكون طموحين قليلاً.
دعونا نقوم بها 50 موضع عشري، مقسوم على 10، واللعنة.
لم تقم Python بحل تلك المشكلة الأساسية.
إذن كيف نصف تلك المشكلة؟
ما هي الكلمة الطنانة هنا لشرح أو حل تلك المشكلة؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: هذا هو تجاوز عدد صحيح، مرتبط في جوهره.
يحدث تجاوز العدد الصحيح حرفيًا عندما
تقومون بإضافات كثيرة ويتحول شيء ما من قيمة كبيرة
إلى صغيرة أو حتى سالبة.
متشابه في جوهره.
أجل؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: أجل.
إذا كنتم تريدون كمية غير محدودة من الدقة دائمًا،
فتحتاجون إلى كمية غير محدودة من الذاكرة.
ولا يحتوي Mac أو جهاز الكمبيوتر الشخصي أو الهاتف على كمية غير محدودة من الذاكرة.
في مرحلة ما، يتم رسم خط في الرمل ويمكنكم أن تكونوا دقيقين للغاية فقط.
ولذا كان عدم الدقة هو التناظر في عالم القيم الكسرية
لتجاوز، تذكرون، حيث إذا كان لديكم فقط عدد غير محدود من وحدات البت
يمكنكم القيام به بشكل جيد إلى نقطة ما.
لكن في النهاية، قام جهاز الكمبيوتر بتقييم تلك القيمة من أجلك
لأنه لا يمكنك أن تمثل عدد غير محدود من القيم.
إذن هذا يعني أن Python محدودة فقط، بشكل أساسي،
مثل بعض اللغات الأخرى مثل C. لذا لم نتخلص
من جميع تلك المشاكل.
لكن بصراحة، في عالم علم البيانات والتحليلات،
هي بالتأكيد عمليات حسابية دقيقة ومهمة.
لذا هناك حلول لهذه المشكلة.
لكنها تتطلب مكتبات خاصة، عادة،
استيراد شيء يتيح لكم استخدام أكبر قدر من الذاكرة
لأنكم تحتاجون كمية أكبر من حجم الذاكرة الافتراضي.
لذا ما تزال تلك المشكلة موجودة.
دعوني أمضي قدمًا وأفتح مثالاً آخر هنا.
وفي الحقيقة، في C، ستتذكرون أنه كان لدينا هذا المثال هنا.
في C كان لدينا برنامج يُسمى overflow.c.
ولاحظوا أن تلك التعليمة البرمجية في C منذ بضعة أسابيع
مضروبة فقط i في 2، في 2، في 2.
لذا كانت تتضاعف، إذا جاز التعبير--
1 إلى 2، إلى 4، إلى 8، و16، و32، و64، وهكذا.
ما الذي كان سيحدث إذا انتظرنا مدة كافية وشاهدنا هذا البرنامج
منذ بضعة أسابيع؟
الجمهور: ستحصل على 5 مليار بدلاً من--
ديفيد ج. مالان: نعم، سنحصل على 5 مليار أو 4 مليار تقريبًا--
أو بالأحرى، سنحصل من الناحية الفنية، على ما أعتقد، على 2 مليار، ومن ثم تحوّل.
وحدثت مشكلة نتيجة عن ذلك في الواقع.
إذن دعوني أقوم بذلك بالفعل.
دعوني أمضي قدمًا وأكتب make overflow حتى نتمكن من توضيح النقاط
التي أشرتَ إليها في وقت سابق بشأن تجاوز عدد صحيح، وهي، في الواقع،
هذه النقطة.
دعوني أمضي قُدمًا وأشغّل overflow.
سأقوم بتكبير شاشتي فقط حتى يمكننا جعلها مناسبة أكثر قليلاً على الشاشة.
وبما أن ذلك يعمل--
عذرًا، دعوني أصلح هذا.
ها نحن ذا.
دعوني أمضي قدمًا وأكتب make overflow.
والآن 1، و2، و4، و8، و16، و32، وهكذا.
إنها بطيئة بعض الشيء في البداية، ولكن المضاعفة والمضاعفة
ستجعلنا نصل إلى قيمة كبيرة بسرعة كبيرة.
سيتجاوز هذا فى الواقع بمجرد أن نصل إلى 2 مليار تقريبًا.
لماذا؟
لماذا اثنين مليار، معطاة أو مأخوذة؟
لماذا هذه القيمة في C؟
أجل؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: نعم، هذا هو العدد الذي يمكن أن يقوم عدد صحيح بتخزينه
لأننا نستدعي C. عادة ما يكون العدد الصحيح 32 وحدة بت أو 4 وحدات بايت.
وباستخدام 32 وحدة بت، يمكنك تمثيل القيمة المحتملة بمقدار أربعة مليارات.
وإذا كان نصف هذه القيم إيجابي ونصفها الآخر سلبي،
فمن المنطقي أن يرمز هذا إلى السبب في أن أعلى رقم يمكنك حسابه هو 2 مليار تقريبًا.
وبالفعل، عندما نحاول فقط حساب مضاعفة المليار الواحد، سنقوم بتجاوزه.
إذن بالنسبة إلى وجهة نظرك السابقة، ما يزال التجاوز يعد مشكلة،
لكن في سياق الأعداد الصحيحة.
لكن الآن دعونا نحاول استخدم إصدار Python من هذا.
دعوني أمضي قُدمًا الآن وأشغّل overflow.py،
وهو برنامج كتبتُه مسبقًا.
إنه على موقع الويب الخاص بالدورة، كما هو الحال دائمًا،
إذا كنتم ترغبون في إلقاء نظرة عليه عن كثب.
وإذا انتقلتُ إلى هذا الملف من الأسبوع الأول، overflow.py، فإننا سنرى هذه التعليمة البرمجية.
إذن هي تقريبًا نفسها.
لكن لاحظوا أنني استخدم مكتبة أخرى نحن لم نرها من قبل،
from time import sleep.
إنها لطيفة إلى حد ما.
لذا يتيح لي هذا السكون لمدة ثانية.
سيصبح هذا أمرًا مملاً بسرعة، لكن هذا جيد.
دعونا نقوم بهذا بسرعة.
إذا انتقلتُ إلى دليل المصدر السادس، من الأسبوع الأول،
وقمتُ بتشغيل Python of overflow.py، إنها الدالة نفسها-- أو البرنامج نفسه،
وظيفيًا.
لكن بصراحة، أصبح هذا أمرًا مملاً بعض الشيء.
دعونا نمضي قدمًا ونزيل السكون لمدة ثانية، ونقوم بالحفظ وإعادة التحميل.
دعونا فقط نقم بتشغيل هذا الشيء.
يا للعجب، انظروا إليه.
فقط هناك.
انظروا للأعلى هناك.
ما الذي تقوم به بشكل مختلف؟
إنها تعدُّ أكثر بكثير من 2 مليار.
إذن ما الذي قد تستنتجونه بشأن الأعداد الصحيحة في Python؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: كرري ذلك؟
الجمهور: العدد الصحيح محدد ليكون عددًا كبيرًا من وحدات البت.
ديفيد ج. مالان: حسنًا، العدد الصحيح محدد ليكون عددًا كبيرًا من وحدات البت.
وبالفعل، هذا هو الحال.
Python ليست في الحقيقة بطيئة هكذا.
إن ذلك بسبب أننا نشغّل IDE القائمة على شبكة ويب وشبكة الإنترنت نفسها
بطيئة بعض الشيء.
ولذا ما يحدث هنا فقط هو أن شبكة الإنترنت بطيئة بهذا الشكل.
لكن يكفي أن نقول أن Python تعدّ ما هو أعلى، بكثير مما تعدّه C.
وهذه هي الطاقة التي تحصلون عليها فقط باستخدام أنواع بيانات أكبر.
كان يمكن أن نقوم بذلك في C. ونستخدم longs، على سبيل المثال.
لكن لاحظوا أنه باستخدام Python تحصلون على أشياء أكثر بشكل افتراضي خارج الصندوق.
دعونا نمضي قدمًا ونأخذ استراحة لمدة خمس دقائق.
وعندما نستأنف، سنقدم بعض الصيغ الأخرى
وسنحل بعض المشاكل الأخرى.
حسنًا، إذن دعونا نلقي نظرة على بعض الأمثلة الأخرى،
التي يمكن مقارنتها بما قمنا به في الأسبوع الأول ونلقي نظرة على بعض الأمثلة
من الأسبوع الثاني والثالث ونلقي نظرة بالفعل
ليس فقط على الصيغة، في النهاية، ولكن على بعض ميزات Python.
وبالطبع، نحتاج إلى القدرة على التعبير عن أنفسنا بشكل مشروط
أو منطقي باستخدام التحكم في التدفق.
ولذا دعوني أقترح برنامج سريع هنا
سنسميه conditions.py فقط، ليذكرنا بـ conditions.c
منذ مدة قصيرة.
دعوني أمضي قدمًا وأقوم باستيراد getInt من CS50 هذه المرة
وأحصل لنفسي على x آخر باستخدام getInt x من المستخدم.
ثم دعوني أمضي قدمًا وأطلب منه getInt y من المستخدم.
ومن ثم دعوني أمضي قُدمًا و أقارن بينهما.
وهكذا بحسب المقارنة التي قمنا بها هنا باستخدام Scratch منذ قليل،
يمكنني القول ببساطة إذا كان x أقل من y، ثم أمضي قدمًا
وأطبع، على سبيل المثال، أطبع x أقل من y، تمامًا كما فعلنا منذ أسابيع.
Elif إذا كان x أكبر من y، يمكننا المضي قدمًا
وطباعة x أكبر من y.
ومن ثم ما يزال لدينا الشرط الثالث، else،
تمامًا كما في C، حيث نطبع، على سبيل المثال، الاستنتاج المنطقي.
x يساوي y.
لذا للإشارة فقط إلى بعض الاختلافات،
المسافة البادئة مهمة جدًا الآن.
ويجب أن تكون منسقة.
لا يمكنكم الحصول على أربع مسافات وثلاث.
يجب أن تكون لديكم، على سبيل المثال، أربع مسافات على طول الطريق.
لاحظوا أن لدي النقطتين منسقتين هناك.
لكن لاحظوا أنني لا أحتاج إلى كلا القوسين، بعد الآن.
وباستخدام Python، توجد كلمة طنانة إلى حد ما، Pythonic.
هناك طريقة بايثونية للقيام بالأشياء.
يمكنكم الحصول على قوسين حول x، أقل من y، أو x أكبر من y،
تمامًا كما فى C. لكنها على الأرجح لا تضيف أي شيء بشكل منطقي.
وإذا لم تجعل تعليمتك البرمجية قابلة للقراءة بشكل أكبر،
فلا تجعلها فوضوية باستخدام أحرف إضافية.
ولذا هذه الآن قاعدة ثابتة عامة.
تقوم Python بتشذيب أكبر عندما يتعلق الأمر بالصيغة، فقط
تقدمها عندما تقوم بحل مشكلة بالفعل، وهي في هذه الحالة،
ليست موجودة بالفعل.
أجل؟
الجمهور: سؤال سريع، السطور [INAUDIBLE]،،
هذه مجمعة معًا الآن، واحدًا تلو الآخر، واحدًا تلو الآخر
وواحدًا تلو الآخر.
إذا وضعتَ سطرًا إضافيًا بينهم،
هل سيكسر ذلك التعليمة البرمجية؟
ديفيد ج. مالان: لا، لا على الإطلاق.
يمكنني أن أضع العديد من المسافات بشكل رأسي بقدر ما أريد.
أريد أن أضيف بعض التعليقات، بالطبع، يمكنني القيام بذلك.
ولماذا لا نقوم بذلك، في الحقيقة، لأن صيغة التعليق
للغة Python مختلفة قليلاً.
في C، لقد اعتدنا على وضع خط مائل خط مائل.
Python، إنها بالفعل مختصرة قليلاً.
يمكنكم فقط استخدام علامة تجزئة واحدة.
ويمكنكم قول احصل على x من المستخدم هنا.
يمكنكم قول احصل على y من المستخدم هنا.
ومن ثم يمكنني قول شيء ما مثل قارن x وy.
وإذا أردتُ هذا حقًا، فيمكنني وضع تعليقات هنا.
هذا حقًا رائع للغاية.
لكن سأحتفظ به بشكل مضغوط أكثر باستخدام ذلك المثال المعين.
حسنًا أي أسئلة عن الصيغة المشروطة أو ما قمنا به فقط هنا؟
حسنًا، دعوني أعرض مثالاً آخر،
هذه المرة سأقوم ببعض المقارنات.
هذه المرة، دعوني أقوم بإنشاء ملف يُسمى answer.py،
وهو يذكرنا بالمثال السريع الذى قمنا به منذ أسابيع الذي يُسمى answer.c.
دعوني أمضي قدمًا ومن CS50 أقوم باستيراد getString.
وهذه المرة، دعوني أمضي قدمًا وأعلن عن
متغير، C. ودعوني أمضي قدمًا وأحصل على سلسلة من المستخدم--
عذرًا-- أحصل على سلسلة من المستخدم لإجابته
عن أي سؤال هذا ما نهتم به.
ومن ثم إذا كانت الإجابة بنعم/لا، دعونا نتحقق من ذلك.
إذا كان c يساوي يساوي y أو c يساوي يساوي حرف y صغير،
ثم أمضى قدمًا وأقول، فقط من أجل الإثبات،
نعم، لأنه من المفترض أن يعني الشخص ذلك.
Elif c يساوي يساوي حرف n كبير أو c يساوي يساوي حرف n صغير،
ثم أمضى قدمًا وأطبع، على سبيل المثال، لا.
إذن برنامج قصير، لكن ماذا عن بعض الملاحظات السريعة؟
حسنًا، ما هو المختلف بشكل واضح ضمن تلك السطور، 5 عبر 8، مقابل C،
منذ أسابيع؟
أجل.
الجمهور: بالنسبة إلى أو يجب أن تقوم بـ--
ديفيد ج. مالان: أجل، ليس اي من تلك الأشرطة الرأسية الغبية أو علامة العطف
علامة العطف.
لكن إذا أردتم القيام بشيء ما أو أو وهذا معًا، فقط قولوا و و
أو، مثل سكراتش فى الواقع، منذ بضعة أسابيع.
لاحظوا، أيضًا-- كيف نقارن بين السلاسل؟
يتضح أن Python لا تحتوي على chars، في حد ذاتها.
تحتوي C على chars، أحرف منفردة.
تحتوي Python فقط على سلاسل.
تحتوي على سلاسل، وأعداد صحيحة، وقيم كسرية، وبعض الأشياء الرائعة،
لكن لا تحتوي على chars.
لهذا السبب أنا أستخدم السلسة بشكل متعمد.
لكن عندما نستخدم السلاسل فى C، كيف قمنا بمقارنة سلسلتين؟
Str comp، حسنًا، بسبب مسألة مقارنة المؤشر المزعجة بأكملها.
حسنًا، يتضح الآن في Python إذا كنتم تريدون
مقارنة سلسلتين حرف بحرف بحرف،
سترجع علامتي يساوي يساوي.
وتقوم بما تتوقع أن تقوم به بالضبط، حتى لو كانت كلمة كاملة.
لذلك إذا كنت تحقق بالفعل من، على سبيل المثال، نعم أو نعم من الشخص،
ما يزال بإمكانك استخدام علامتي يساوي يساوي أيضًا، على الرغم من أنه
أكثر من حرف واحد الآن.
إذن هذه ميزة رائعة، أيضًا.
وهذا يجعل التعليمات البرمجية فقط قابلة للقراءة ويمكن كتابتها
بسهولة أكثر ومن دون أي تردد.
حسنًا، تذكرون الآن أننا في C قد أمضينا بعض الوقت،
وكذلك في سكراتش، حيث ألقينا نظرة على بعض الأمثلة الخاصة بالسعال،
من جميع الأشياء.
وفي الواقع، في Python وC--
بدلاً من ذلك، في سكراتش وC--
قمنا بمثال الصفر الذي يبدو إلى حد ما مثل هذا.
إذا كنتم ترغبون في محاكاة فكرة سكراتش سعال القط،
قد تقومون بذلك، بالطبع.
ومن ثم إذا كان سيسعل ثلاث مرات، فقد تقومون بذلك.
وقمنا بتشغيل هذا وظهر فقط سعال، سعال، سعال على الشاشة.
لن أحمل نفسي عناء تشغيله لأنه سيقوم بذلك فقط.
ولكن كان هذا تصميمًا سيئًا زعمنا القيام به منذ أسابيع.
ما هي خلاصة السبب في أن هذا تصميم سيء؟
أعني، إنني حرفيًا قمتُ بنسخه ولصقه.
والاحتمالات هي إذا قمتَ بهذا في CS50 أو في البرمجة
بشكل عام أكثر، فمن المحتمل أنك ستكون كسولاً قليلاً
وهناك طريقة أفضل للقيام بذلك.
وهي طريقة قابلة للصيانة بشكل أكبر للقيام بذلك.
إذن بالطبع، قدّمنا منذ أسابيع، في كل من سكراتش وفي C،
القدرة في cough1، هذه المرة، على القيام بتكرار حلقي.
ويمكنني إجراء تكرار حلقي بشكل مختلف قليلاً في Python وفي C. لكن فيما يخص i
في النطاق 3، امضي قدمًا واطبع سعال.
وبالتالي فإن الصيغة للتكرار الحلقي مختلفة قليلاً.
لكنها مباشرة للغاية، على الرغم من ذلك،
بمجرد أن تتذكروا استخدام for، اسم المتغير، ثم
حرف الجر in، ومن ثم نطاق الكلمة داخل قوسين و--
قوسين والقيمة التي تريدون الاهتمام بها.
لكن سنحت لنا فرصة، تذكرون، تجريد السعال في الواقع.
السعال، في الشكل النصي على الأقل، فقط القيام بطباعة شيء.
إذن قدّمنا في الإصدار الثاني منذ فترة،
النهج التالي في cough2.
وبدلاً من ذلك قمتُ بتعريف دالة تُسمى cough لتقوم بالسعال من أجلي.
ولم نرى هذا حتى الآن في Python.
إذن كيف تقومون بتعريف دالة في Python تُسمى cough؟
وبعبارة أخرى، كيف تقومون بإنشاء قطعة لغز مخصصة خاصة بكم،
مثلما فعلنا في لغة سكراتش؟
حسنًا تقومون بتعريفها باستخدام def.
ومن ثم تجعلونها تقوم بما تريدونه بالضبط
أن تقوم به فقط من خلال وضع مسافة بادئة بين سطور التعليمة البرمجية التي تنتمي إلى تلك الدالة.
لذلك لا توجد قيمة مرتجعة.
لا نحتاج إلى مدخل في هذه اللحظة.
لكن لدينا النقطتين.
ولدينا المسافة البادئة.
لا توجد أقواس متعرجة، ولا شيء آخر.
كيف يُمكنني الآن استخدام هذه الدالة؟
حسنًا، هنا حيث توجد لدينا بضعة خيارات بشكل نمطي في البرنامج.
ستكون أبسط طريقة لاستدعاء هذه الدالة هي بسيطة تمامًا هكذا.
امضي قدمًا واكتب for i في النطاق 3، امضي قدمًا وcough.
ويبدو هذا غريبًا قليلاً.
يبدو، بالفعل، أمرًا سيئًا قليلاً.
لكن دعونا نرى إذا نجح الأمر.
إذن إذا مضيتُ قدمًا وقمتُ بتشغيل Python من coughtwo.py،
تبدو هكذا cough ،cough ،cough.
ولكن أقول هذا أمر غريب قليلاً لأن الشيء الذي
أقوم به مختلف للغاية الآن عن C؟
لا توجد ماذا؟
لا توجد دالة main.
فقط لدي تعليمة برمجية هنا على يسار الشاشة.
ومع ذلك، لدي دالة هنا.
وفي Python، هذا جيد.
لأنكم تستخدمون المترجم وتقرأون الملف
من الأعلى إلى الأسفل، من اليسار إلى اليمين، لا تحتاجون إلى دالة تُسمى main على وجه التحديد.
سيقوم فقط بتفسير جميع تعليمتكم البرمجية.
وعندما يرى تعريف الدالة، حسنًا.
سيقول، حسنًا، فهمت ذلك.
أعرف الآن ما الذي يعنيه الفعل يسعل.
وسأفعل هذا في أي وقت أرى فيه هذا بالأسفل.
لكننا سنواجه مشكلة.
وإذا، اتّبعتُ بالفعل حدسي الأول،
وهو وضع المنطق، الجزء الرئيسي من برنامجي في الأعلى
وأقوم بتعريف cough هنا بالأسفل، دعونا نرى ما يحدث.
دعوني أقوم بالتصغير.
دعوني أمضي قدمًا وأعيد تشغيل coughtwo.py.
والآن نبدأ برؤية أول رسائل الأخطاء.
وستبدو مشفرة فقط كما كانت منذ الوهلة الأولى كما كان clang
وmake.
أكد البقية أنه يمكن أن تساعد help50 برسائل الأخطاء في Python، أيضًا.
لكن دعونا نحاول فقط تحليل ما أفهمه. cough2.py، السطر الثاني
في الوحدة أيًا كان ذلك، خطأ اسم.
الاسم cough غير محدد.
إذن ماذا يقول حدسك هنا؟
ما هذا حقًا--
ما هو توضيح هذا الخطأ؟
لأن السعال محدّد بوضوح--
حرفيًا باستخدام فعل def المُحدّد--
هناك على السطر الرابع الآن.
ماذا--
الجمهور: أنت تستدعي cough قبل أن يتم تحديده.
ديفيد مالان: نعم، أحاول استدعاؤه قبل أن يتم تحديده.
تحاول Python أن تنقلني بشكل حرفي للغاية.
وستقوم بذلك من الأعلى إلى الأسفل، من اليسار إلى اليمين.
وإذا لم ترى شيء حتى الجزء السفلي
الذي من المفترض أن تقوم به في الأعلى، فلن ينجح الأمر فقط.
لذا هناك حل لهذا وأصبح هذا قبيحًا قليلاً.
لكنه حل عام أكثر.
يتضح أنه على الرغم من أن main غير مطلوبة في برنامج Python،
يقوم العديد من المبرمجين بإنشاء واحدة فقط على الرغم من ذلك
لمعالجة هذه المشكلة الخاصة.
وهم على وجه التحديد يفعلون شيئًا كهذا--
def main-- ومن ثم أسفلها يزيحون كل شيء هناك.
ومن ثم يحتاجون إلى ميزة واحدة محددة لحل هذه المشكلة الآن.
لقد حددتُ الآن main وحددتُ cough، وهو من الناحية النظرية
يحل هذه المشكلة فقط كما فعل في C. لا توجد
فكرة النموذج الأولي في Python.
هذا ليس حل نسخ ولصق اسم الدالة أعلاه.
ولكن عندما أقوم بهذا الآن، حرفيًا لا يحدث أي شيء.
لكنني تخلصتُ من الخطأ.
لذا مجرد سبب لهذا، ربما.
خاصة إذا لم تقوموا ببرمجة Python من قبل،
لمَ قد لا يحدث شيء الآن؟
الجمهور: عدم استدعاء main؟
ديفيد مالان: أنا لا أستدعي main، نعم.
لذلك بينما في C--
وبصراحة، في Java، C++، وبعض اللغات الأخرى-- تعد main أمرًا خاصًا.
يتم استدعاؤها بشكل افتراضي. في Python، لا تعد main أمرًا خاصًا.
لقد اخترتُ هذا الاسم main فقط لأن العديد من اللغات الأخرى تستخدمها،
لكن ليست لها أهمية خاصة.
إذا كنت ترغب في استدعاء main، يجب أن تقوم بذلك بنفسك.
ولذا هذا غريب قليلاً، في الحقيقة.
ولكن يمكنك حرفيًا فعل ذلك هنا لأنه سيتم تنفيذ تعليماتك البرمجية من الأعلى
إلى الأسفل، من اليسار إلى اليمين.
مع مرور الوقت يتم الوصول إلى السطر الزمني 10، يتم تحديد كل من main
وcough، مما يعني أنك على ما يرام.
لذا إذا انتقلتُ الآن إلى هنا وقمتُ بتشغيل Python من cough2، الآن نجح الأمر في الواقع.
الآن، كملاحظة جانبية، هذا ليس باثوني، إذا صح التعبير.
سيقوم معظم الأشخاص بذلك بالفعل إذا كان الاسم يساوي يساوي main،
ثم يقوموا بهذا.
هذا للأسباب ذات المستوى المنحفض دعوني لا أتطرق إلى هذا اليوم.
لكن خلاصة القول، إضافة هذا السطر الذي يبدو مشفرًا
يحل المشاكل الأخرى التي لن نتجاوزها
خلال هذا الأسبوع وربما الأسبوع المقبل.
إذن هذه هي الطريقة الشائعة للقيام بذلك.
ولكن إذا تجاهلتُ ذلك فقط، فإن تأثير هذه التعليمة البرمجية التي تبدو مشفرة
هو فقط أن تقوم باستدعاء main بنفسك من أسفل ملفك.
لذا عندما نبدأ بكتابة برامج مثير للاهتمام أكثر،
ستصبح هذه تقليدية أكثر فقط.
إذا كنتَ ترغب في البدء بكتابة دالات الكتابة وما إلى ذلك،
فالاحتمالات هي أنك ستستفيد من خلال كتابة دالة main
ووضع المزيد من التعليمات البرمجية هناك.
لنقم بمثال واحد أخير باستخدام cough الذي يميز الآن بالفعل
التعليمة البرمجية، تمامًا كما فعلنا منذ أسابيع في سكراتش وC. هذا سيكون cough3.py.
دعوني أبدأ كما فعلت فقط منذ قليل.
لكن لنفترض أنني أريد تحقيق هذا التأثير.
أريد الكمبيوتر أن يقم بالسعال ثلاث مرات عن طريق التمرير في مدخل.
أنا الآن أحتاج إلى تعديل سعال ليأخذ مدخل.
إذن في C، قلت شيئًا مثل int n.
ولكن لا يجب أن تحددوا أنواع البيانات في Python،
يجب فقط أن تحددوا اسم المعلمة أو اسم الوسيطة.
لذا هذا لطيف وبسيط.
والآن في الأسفل هنا، في سعال، حيث يجب أن أقول
for i في النطاق 3، قم بهذا.
لكن هذا ليس صحيحًا تمامًا.
ما هو الإصلاح الذي أريد القيام به هنا؟
أجل.
الآن يمكنني فقط التمرير في n.
لذا النطاق هو مجرد دالة تأخذ الوسيطة التي قمتُ
بترميزها بشكل ثابت كثلاثة لسبب ما فقط.
ولكن يمكنك تعميمها باستخدام n، أيضًا.
و لذا الآن، مجددًا، في مناقشتنا للتجريد منذ أسابيع وأسابيع،
هل لدينا إصدار جيد من سعال إلى حد ما،
على الرغم من أنه يبدو مشفرًا أكثر.
ولكن خطوة بخطوة بخطوة وصلنا إلى المغزى من
وجود دالة main التي تأخذ التجريد، سعال.
قم بذلك عدة مرات.
الآن تفاصيل التنفيذ مخبأة في قطع اللغز المخصصة هذه،
إذا صح التعبير.
ويبدأ السطران في الأسفل للتو
بالتنفيذ الكامل للبرنامج.
لكن هذا هو الشيء الوحيد الذي يحدد Python حقًا.
أجل؟
الجمهور: هل يمكننا استخدام دالة سعال على السطر 11 [INAUDIBLE]؟؟
ديفيد مالان: هل يمكن استخدام دالة سعال على السطر 11؟
نعم.
يمكنك بالتأكيد القيام بذلك، على سبيل المثال، والتخلص من main مجددًا.
إنها مجرد تقليد.
بمجرد أن تبدأ بكتابة برامج متطورة أكثر باستخدام دالات،
ربما يجب أن تقدم main فقط لتبقيها مرتبة.
الجمهور: باستخدام [INAUDIBLE].
ديفيد مالان: يمكنك فعل ذلك.
ثم تبدأ في أن تكون غير باثوني.
على سبيل المثال، نعم، يمكنك أن تكتب cough3 ولكن سيطلب منك الأشخاص
لأن ذلك لن يتم بهذه الطريقة.
هذا ما تعنيه كلمة Pythonic.
نعم، أي أسئلة أخرى؟
الجمهور: تحتاج إلى أن يأتي [INAUDIBLE] بعد for i
في نطاق n بحيث يعرف ما هو سعال؟
ديفيد مالان: ليس في هذه الحالة.
لذا فالترتيب الآن مقبول لأن Python الأولى ترى هنا
تعريف main.
حسنا، فهمت.
ثم تقول، ها هو تعريف سعال، حسنًا ، فهمت.
لكنها لا تستدعي في الواقع هذه الدالات حتى الآن.
يتم طرح أخطاء Python فقط في ما يُسمى وقت التشغيل،
وقت تشغيل البرنامج، والذي يعني فقط عندما يتم استدعاء main
تقوم Python فعليًا بتنفيذ السطر 4 ومن ثم ترى،
أوه، أنا أحتاج إلى استدعاء دالة تُسمى سعال.
ولكن هذا جيد لأنها رأتها في وقت سابق عندما قرأت
لأول مرة الملف من الأعلى إلى الأسفل.
لذلك الأمر مهم عندما يتم استدعاء الدالات،
وليس مكان ظهورها، في حد ذاته، في الملف، الترتيب الذي يتم
استدعاؤها به.
أي أسئلة أخرى؟
حسنًا، نعم؟
الجمهور: أنا لا أعرف من أين تقوم [INAUDIBLE].
كيف تحدد n كعدد صحيح؟
ديفيد مالان: كيف أحدد n كعدد صحيح؟
هذا هو الشيء اللطيف بشأن Python.
إذا كنت تريد متغير أو معلمة، فقط
فابدأ في استخدامها دون الإشارة إلى نوع بياناتها.
لذا وضعتُ n بين قوسين في هذه الدالة، ويعني،
مرحبًا، Python، دعي هذه الدالة تأخذ مدخل يُسمى n.
ويمكن أن يكون في الواقع أي نوع للبيانات-- عدد صحيح، أو قيمة كسرية، أو سلسلة،
أو حتى شيء آخر.
الأمر متروك لي لاستخدامها بشكل مسؤول كرقم
ولاستدعائها بشكل مسؤول استخدام رقم.
سؤال جيد.
أجل؟
الجمهور: لذا من الممكن أن يعمل متغير على تغيير نوع؟
ديفيد مالان: نعم، بالفعل، يمكن لمتغير
تغيير نوع، ملاحظة جيدة.
لذا نعم، ليست Python لغة مكتوبة قوية، إذا جاز التعبير.
لغة C مكتوبة قوية حيث إذا قمتُ بكتابة شيء int،
فإنه يبقى int إلى الأبد.
تمت كتابة Python بشكل غير دقيق، حيث يمكن أن يكون x عدد صحيح في البداية.
ولكن إذا كنتَ تريد حقًا تحويلها إلى سلسلة، يمكنك فعل ذلك.
لكن سيكون التقليد هناك، نعم، يمكنك القيام بذلك، لكن لا تقم بذلك.
إذن لدى Python، بصراحة، نوع من التعجرف
كونها لغة للبالغين إلى حد ما.
نعم، يمكنك القيام بذلك، ولكن لا تقم بذلك.
لماذا يجب أن نحميكم من أنفسكم؟
ومن هذا المنطلق، تحتاج إلى أن تكون مسؤولاً أكثر قليلاً بشأنها.
لكن مجددًا، توجد وسيطات بكلا الطريقتين.
وهي تزيح الأخطاء المحتملة التي ستزيلها C من أجلك.
وهذا هو المكان حيث يبدأ البشر في الاختلاف حول المستجدات
والجوانب السلبية للغات، سواء يجب أن تكون اللغة قوية أو غير دقيقة
أو لم تتم كتابتها على الإطلاق.
ملاحظة جيدة.
لذا دعونا نلقي نظرة على نموذج كان شائعًا جدًا في C
عندما أردنا أن نقوم بشيء مرارًا وتكرارًا
لنرى كيف يتم ذلك بالفعل بشكل مختلف قليلاً في Python الآن.
دعوني أمضي قدمًا وأقوم بإنشاء ملف يُسمى positive.py
وأمضي قدمًا وأكتب برنامجًا بشكل سريع قليلاً هنا.
لذا من CS50، دعوني أمضي قدمًا وأقوم باستيراد getInt،
حتى يمكننا الحصول على أعداد صحيحة من المستخدم.
دعوني أمضي قدمًا وأُحدّد دالة main
التي ببساطة ستقوم بكتابة i، والذي سيكون المتغير الخاص بي، وتحصل على positive int،
وتطلب من المستخدم، كما قمنا بذلك منذ أسابيع،
وإذا كنتم تتذكرون، لعدد صحيح موجب.
ومن ثم تمضي قدمًا وتطبعه بشكل ملل جدًا.
هذا كل ما يقوم به هذا البرنامج.
ودعوني أمضي قدمًا وفقط من التذكر--
على الرغم من أن نسخ ولصق هذه السلسلة التي تبدو مشفرة جيد جدًا،
سنكون مهملين فقط إذا لم نوضح لك كيف يقوم معظم الأشخاص بذلك.
لذلك إذا قمت بذلك، هذا برنامج كامل،
باستثناء أن ما هو الشيء غير الموجود حتى الآن؟
من المحتمل أنه لا توجد Get positive int، تمامًا كما لم تكن موجودة في الأسبوع الأول،
لأنه يجب أن نخترعها بأنفسنا.
توجد Get int، ولكن لا توجد Get positive int.
وفقط من أجل إثبات ذلك، لنجرب هذا.
Python من positive.py، لاحظوا أن لدينا خطأ اسم غير محدد في
get positive int.
حسنًا، إذن يمكننا إصلاح ذلك.
يمكننا حرفيًا أن نحددها، أو def it.
لذا get positive int.
سيتطلب الأمر الطلب من المستخدم،
تمامًا كما فعلنا منذ أسابيع، السلسلة التي تريد عرضها له أو لها.
والآن دعوني أمضي قدمًا وأحصل على عدد صحيح موجب.
ما هو نوع بنية البرمجة التي استخدمناها
في C للقيام بشيء مرارًا وتكرارًا؟
الجمهور: التكرار الحلقي.
ديفيد مالان: تكرار حلقي، بالتأكيد، ولكن على وجه التحديد،
للقيام بشيء ما مرة واحدة على الأقل ومن ثم ربما
مرارًا وتكرارًا إذا لم يتعاونوا؟
الجمهور: While.
ديفيد مالان: لنكتب while.
لا نكتب while في Python.
لذا هذه الميزة المفيدة لمدخل المستخدم غير موجودة.
لذا هذا جيد.
نحتاج إلى حل هذا بشكل مختلف فقط.
وبصراحة، في C، يمكنك أن تحل هذه المشكلة بشكل مختلف.
لا تحتاج إلى كتابة while.
كان يمكننا أن نستبعد ذلك من أجلكم.
يمكن أن تستبعد C ذلك.
يمكنكم حل كل المشاكل التي ظهرت في الأسابيع الماضية
باستخدام for loop أو while loop.
كتابة while هي مجرد ميزة مفيدة ورائعة.
لكن يمكننا محاكاة ذلك.
والطريقة البايثونية للقيام بذلك هي على النحو التالي.
بإزاحة تكرار حلقي لا نهائي بشكل متعمد، لأنه من المحتمل
أنكم تريدون القيام بالتكرار الحلقي.
لكن سيكون المنطق هو، أعطني تكرار حلقي لا نهائي
وسأقوم بتقسيمه عندما أكون مستعدًا لتقسيمه.
سيكون هذا هو التقليد.
إذن، في حين أن ما يلي صحيح، قم بذلك.
أمضي قدمًا وأعلن عن متغير يُسمى n.
احصل على int من المستخدم وقم بتمريره في ذلك المُحث نفسه.
إذن get int، كتبنا-- طاقم العمل--
المُحث هو كل ما كتبتُه هنا.
إذن قم فقط بالنسخ واللصق من إصدار C.
ثم تحت أي ظروف تجعلني أريد تقسيم هذا التكرار الحلقي اللا نهائي
إذا تم استدعاء الدالة لكتابة get positive int؟
الجمهور: [INAUDIBLE]
ديفيد مالان: أجل، إذا كان n أكبر من 0،
ثم ما تزال لدي فرصة لتقسيم الكلمة الرئيسية، تمامًا كما فعلنا في C.
يمكنني تقسيم هذا التكرار الحلقي.
ومن ثم بمجرد أن أقوم بذلك، يمكنني المضي قدمًا واسترجاع n فقط.
أو من أجل هذا الأمر، يمكنني تكثيف هذه قليلاً.
يمكنني فقط استرجاع n على الفور وربطه فقط قليلاً.
لذا هناك طرق متعددة للقيام بذلك.
وإلا سيقوم فقط بتكرار حلقي وتكرار حلقي للأبد.
إذن دعوني أمضي قدمًا الآن وأقوم بتشغيل positive.py
من خلال Python، عدد صحيح موجب مثل -1، ربما -2، 0، حسنًا، 1.
والآن هي، في الواقع، تتعاون.
إذن هذا مجرد نموذج شائع.
هذا هو الشيء الذي يحدث عندما تتعلمون لغة جديدة وهي بصراحة
تميل إلى تعطيل الأشخاص في البداية.
تحتاجون إلى تعلم طريقة JavaScript للقيام بالأشياء.
تحتاجون إلى تعلم طريقة Python للقيام بالأشياء.
ولكن بعد ذلك ستبدأون في ملاحظة ما تسمى بأنماط التصميم هذه.
في أي وقت تريدون القيام بشيء في Python مرارًا وتكرارًا،
نعم، تريدون التكرار الحلقي.
ولكن إذا كنتم تريدون القيام بشيء بالتأكيد مرة واحدة وربما مرة أخرى؟
ما زلتم تستخدمون التكرار الحلقي، ولكن بشكل متعمد
تستنتجون، عادة، تكرار حلقي لا نهائي، وتقومون بتقسيمه عندما تكونوا مستعدين.
إذن هو نهج شائع جدًا.
إذن لا يُترجم كل شيء حرفيًا من C ذهابًا وإيابًا.
أي أسئلة على هذا الجزء؟
نعم، في الخلف؟
الجمهور: هذا الشيء الذي فعلته للتو مع while for loop،
هل هذا [INAUDIBLE] يقوم بتهيئة متغير يُسمى [INAUDIBLE]
إلى عدد سالب ومن ثم يجعل عندما يكون n أقل من 0--
ديفيد مالان: سؤال جيد حقًا.
هل يُفضل هذا النهج بدلاً من الإعلان، ربما هنا،
عن متغير يساوي قيمة ما معروفة، مثل صفر أو أي شيء،
ومن ثم يقوم بتحديثه؟
الإجابة المختصرة هي، نعم، لأن نهجكم، في حين أنه صحيح،
فليس مصممًا بشكل جيد، يمكن القول لأنه ليس ضروريًا فقط.
وعلى طريقة Python، وهي حقًا طريقة مصممة بشكل جيد
للقيام بمعظم الأشياء التي ستكون قيد الاستخدام كسطور قليلة
قدر الإمكان طالما أنها ستظل قابلة للقراءة وللفهم،
ويمكنني القول أن ذلك هو ما سيحدث بمجرد أن تعتادوا على الصيغة.
ولكن هذا يثير نقطة شيقة عن موضوع واحد آخر في C. لقد اختفى Scope
من على الشاشة تمامًا، على الأقل كما رأيناه سابقًا.
كان Scope يشير إلى مكان متغير.
وقمنا بتعريفه بشكل أساسي وعرضي بين قوسين متعرجين،
الأقواس المتعرجة المفتوحة الحديثة أكثر.
حسنًا، لم تعد هناك أقواس متعرجة، إذن يتضح أن المتغيرات بشكل افتراضي
لديها دالة scope هنا.
إذن عندما تعلنوا عن n على السطر 9، يمكنكم استخدامه في Python على السطر 10.
وأتعلمون ماذا؟
يمكنكم استخدامه حتى على السطر 12، على الرغم من إعلانه بداخل
التكرار الحلقي هذا بالأعلى.
إذن بمجرد أن تعلنوا عن متغير على هذا السطر،
يمكنكم استخدامه في أي مكان على سطر لاحق ضمن الدالة نفسها.
إذن بشكل منطقي، هذا أمر سيء قليلاً حيث يتاح لكم القيام بهذا.
ولكن من ناحية أخرى، إنه مناسب للغاية
لأنكم لن تضطروا إلى التعامل مع هذه الأشياء
مثل الإعلان عن المتغير بالأعلى هنا فقط لاستخدامه بالأسفل هنا.
إذن، هذا أمر واحد صغير لن تفكروا به.
حسنًا، دعونا نُلقي نظرة على بضعة أمثلة من الأسبوع الثاني
حيث قدّمنا فيه ​​مصفوفات وسلاسل بشكل عام أكثر
لرؤية ما تغير الآن، أيضًا.
ستتذكرون أنه في الأسبوع الثاني، ربما، تناولنا مثالاً حول كتابة الأحرف الكبيرة.
ودعوني أمضي قدمًا وألقي نظرة على الإصدار الثالث من ذلك،
وأقوم بالتكبير أيضًا، ولكن بالتحويل إلى Python.
كان الهدف في الحياة هو أخذ مدخل من المستخدم
وتكبير جميع أحرفه فقط هناك.
إذن إذا كنت أكتب جميع اسمي بأحرف صغيرة،
يجب أن يعود جميعه بأحرف كبيرة.
إذن من مكتبة CS50، دعوني أمضي قدمًا
وأقوم باستيراد getString بحيث يكون لدي بعض المدخلات من المستخدم.
ثم دعوني أمضي قدمًا وأحصل على سلسلة من المستخدم فقط، مثل اسمه.
ومن ثم أريد أن أمضي قدمًا وأكتبه بأحرف كبيرة.
إذن دعوني أمضي قدمًا وأفعل هذا.
وهذه ميزة رائعة.
في C كنت أفعل هذا لـ int i يساوي صفر وi أقل من strlen.
أعني، ربما تتذكرون نموذج التكرار على سلسلة.
لكن Python ممتعة أكثر فقط.
لـc في s--
هذا سينتج تكرار حلقي عبر السلسلة s، مما يتيح لك الوصول إلى جميع الأحرف
في كل مرة، وتسمية ذلك المتغير c.
إذن ما الذي أريد القيام به، فقط كخطوة مبدئية،
خطوة صغيرة، إذا صح التعبير، دعونا فقط نطبع c، فقط لرؤية ما سيحدث.
دعوني أمضي قدمًا بالأسفل هنا وأقوم بكتابة Python بحرفين كبيرين.
دعوني أمضي قدمًا وأكتب اسمي بأحرف صغيرة.
حسنًا، ولماذا يتم عرضه بشكل عمودي
هكذا، حرف واحد في كل سطر؟
نعم، تحصلون على السطر المجاني--
سطر جديد مجاني هذه المرة.
إذن دعونا نرى كيف يمكنكم تعطيل ذلك.
إنه يبدو غبيًا، بصراحة.
لكن يمكنكم كتابة end يساوي علامة اقتباس علامة إنهاء الاقتباس، وبالتالي هذا يكشف عن ميزة جديدة
من Python ولا توجد في C.
يتضح أن Python تحتوي ليس فقط على الوسيطات الموضعية، كما تُسمى،
حيث تقومون فقط بالتمرير في الوسيطات بين الفواصل.
وهذا ما كنا نفعله في C.
لكن Python تحتوي أيضًا على الوسيطات المُسماة، حيث
يمكنكم تحديد اسم الوسيطة،
ثم علامة يساوي، ثم القيمة.
وقوة الوسيطات المُسماة، حتى وإن كان هذا مثال صغير،
تعني أنه يمكنكم أحيانًا التمرير في الوسيطات بأي ترتيب.
لا يجب أن تتذكروا.
لن تكونوا مضطرين لسحب دليل CS50 أو صفحات man
لتتذكروا ما هو ترتيب جميع هذه الوسيطات.
يمكنكم تمريرها في أي ترتيب، ولكن عبر تحديد
اسم الوسيطة، علامة يساوي، وقيمتها.
وفي Python 2، يمكنكم الحصول على وسيطات اختيارية.
من الواضح أنه، في جميع هذه الأمثلة حتى الآن،
لم يسبق لي كتابة كلمة end وعلامة يساوي حتى الآن.
لكن ما تدعمه Python هو القيم الافتراضية للوسيطات.
ولذا إذا نظرتُ في الوثائق الخاصة بلغة Python، فهذا يعادل--
هذا التسلسل الذي يبدو مشفرًا-- هذا يعادل السلوك الافتراضي،
وهو عدم كتابة أيًا من ذلك على الإطلاق.
تشير end إلى، لدالة الطباعة، أنه يجب أن تُنهوا كل سطر
بذلك الحرف الافتراضي.
وبالتالي، إذا كنتم تريدون تجاوزه،
يمكنكم فقط تغييره إلى سلسلة فارغة، علامة اقتباس وعلامة إنهاء الاقتباس.
إذن إذا قمت الآن بتشغيل هذا مجددًا وقمت بتشغيله باستخدام اسمي،
الآن سأحصل عليه هكذا، حرف واحد في كل مرة.
ولكن يمكنكم كتابة أشياء غريبة، مثل ها ها ها ها ها ها--
لن تفعلوا ذلك.
لا أعرف لماذا تماديت في ذلك.
ولكن أعني أنه يقوم بالأمر نفسه بالضبط
لأنكم فقط تقومون بتغيير نهاية السطر.
لذا لا تقوموا بذلك، ولكن قوموا بشيء آخر مثل هذا، بدلًا من ذلك.
إذن لنفترض أنني أريد الآن تكبير الحرف الأول.
يتضح أن السلاسل في Python قوية أكثر من السلاسل
في C. في C، لا توجد أي سلسلة.
كانت هذه كذبة.
إنها مجرد تسلسل من الأحرف كما يُشار إليها من خلال عنوان في الذاكرة.
في Python، السلسلة هي كائن فعلي.
إنها بنية البيانات.
وإذا كنتم تفكرون بشأن C، كانت لدينا بنيات حتى نهاية عرضنا
في C، عُقد وبنيات وبنيات student وما شابه ذلك.
تُشبه السلسلة في Python هذه الحاوية التي بداخلها
في مكان ما جميع هذه الأحرف.
ولكن يوجد في تلك الحاوية أو البنية أيضًا دالات تم إنشاؤها،
وميزات سلسلة يمكنكم فقط استدعاؤها.
إذن في C، قلنا شيئًا مثل toUpper
ومن ثم تمريرها كمدخل إلى دالة تُسمى toUpper
الحرف الذي نهتم به.
لكن تعكس Python المنطق إلى حد ما.
تأتي السلاسل باستخدام دالة تم إنشاؤها
تتيثح لكم العمل على الحرف المُعطى تلقائيًا.
إذن في Python، تعد الصيغة في الواقع هي الحرف نفسه.
استخدام تدوين النقطة لأنه بنية.
ومن ثم يمكنكم حرفيًا--
عذرًا.
يمكنكم حرفيًا كتابة upper.
إذن فهذا يعني، ما تم إنشاؤه في نوع السلسلة في Python
هو مجموعة من الميزات، إحداها دالة تُسمى upper.
والصيغة التي تستدعوها بها هي اسم المتغير
أو اسم السلسلة نقطة ثم اسم الدالة قوس مفتوح، قوس مغلق.
والآن هذا هو النموذج فقط.
لا توجد مكتبة من نوع C.
لا توجد دالة toupper أو tolower.
تم إنشاء هذه الميزات الآن في السلاسل نفسها.
وهذا مثال عن التغليف، أو بشكل
عام أكثر، البرمجة التي تستهدف الكائن، شيء ما
ستكتشفوه إذا حصلتم على دورة مثل CS51 والتي
تُصمِم في أنواع البيانات نفسها جميع الدالات ذات الصلة.
ولا تُحيلها إلى مكتبة أخرى.
لذا إذا قمتُ بتنظيف هذا فقط من خلال تحريك المؤشر إلى السطر التالي،
آمل الآن أن تروا ديفيد مكتوبة كلها بأحرف كبيرة، نفس الفكرة
التي كانت من قبل.
ماذا عن طول هذه السلسلة؟
هذا الأمر بسيط جدًا، ولكن إذا انتقلت إلى هنا،
دعوني أمضي قدمًا وأقوم بإنشاء ملف يُسمى strlen.py.
إذا أردتُ رؤية طول سلسلة ما، من CS50، قم باستيراد getString،
تمامًا كما فعلنا من قبل.
دعوني أمضي قدمًا وأحصل على سلسلة لنفسي، على سبيل المثال اسمي مجددًا.
ومن ثم هنا، إذا أردتُ طباعة طول السلسلة، في Python--
في C، ستقولون strlen.
في Python، الأمر مختلف قليلاً.
في الواقع فقط تقولون len للطول.
إذن إذا مضيتُ قدمًا وقمتُ بتشغيل هذا من خلال strlen--
strlen-- اكتب اسمي.
آمل بالفعل أن أرى خمسة.
ولا توجد فكرة أنكم تحتاجون إلى الاهتمام بالخط المائل العكسي صفر
من أجل إنهاء السلسلة.
أجل؟
الجمهور: إذن upper هذا [INAUDIBLE]
ديفيد مالان: لا، في الواقع.
إذن هذه ملاحظة جيدة حقًا.
دعونا نرجع ونقوم بتحسين هذا في الواقع
بدلًا من مجرد ترجمته من ما كان عليه مثال المقارنة في C. دعوني
أمضي قدمًا هنا وأقول في الواقع، أتعلمون ماذا؟
s يساوي upper s.
ومن ثم دعوني فقط أطبع s، ربما.
دعونا نرى ما سيحدث.
دعوني أرجع إلى هنا وأقوم بتشغيل Python من capitalize2.
Enter David.
وسيعمل على السلسلة بأكملها.
حدس جيد.
وبصراحة، لا أحتاج إلى القيام بذلك.
يمكنني فقط أن أقول upper هنا وأقوم بتشذيب هذا بالأسفل وأكتب
Python من capitalize2، وأكتب اسمي.
ما زال ذلك ينجح.
وإذا أردتُ حقًا أن أكون رائعًا، فأنا لا أحتاج إلى s على الإطلاق.
يمكنني أخذ هذه، والتخلص من ذلك، ووضع هذا هنا، وعلى الفور استدعاء
upper على مدخل المستخدم و أقوم بضم هذا إلى سطر واحد، ثم أكتب david،
وهذا، أيضًا، ينجح.
إذن فقط تحصلون على طرق للتعبير كثيرة جدًا جدًا.
سؤال جيد.
إذن كيف تعرفون حتى أن أشياء كهذه موجودة؟
حسنًا، لمحة سريعة.
سيكون Google حقًا صديقكم في مثل هذه الحالات.
وستريدون أن تعرفوا في هذه المرحلة، أن هناك إصدارات مختلفة من Python.
يُعد العالم إلى حد ما مُتمسكًا وما يزال
يستخدم، الكثير من الأشخاص، الإصدار 2 من Python، وهو قديم منذ عدة سنوات
الآن.
نحن نستخدم الإصدار 3.
وهذا هو الطريق الذي يسير فيه العالم.
وبالفعل، فإن الإصدار Python 2 سيصبح مهجورًا أو موقوفًا تدريجيًا
في غضون عامين، من الناحية النظرية.
إذن عندما تجرون بحثًا في Google، يجب فقط أن تضعوا هذا في الاعتبار
حتي لا تشقوا طريقكم عن طريق الخطأ إلى البرامج التعليمية، والوثائق القديمة
و ما شابه ذلك.
إذن دعوني أمضي قدمًا وأبحث عن Python 3 string، أو str، وupper،
فقط لمعرفة إذا كان يمكنني الوصول إلى الوثائق.
هنا لديكم عدد من البرامج التعليمية.
ولكن إذا ركزنا هنا، ما الذي تريدون البحث عنه بشكل عام،
على الأقل عن الوثائق الرسمية، هو docs.python.org.
ترون في عنوان URL، إنه الإصدار 3، وهذا ما نريد الانتقال إليه.
إذن دعوني أمضي قدمًا وأنقر فوق هذا، مُشغلات السلسلة الشائعة.
وأُريد أن أنفي هذا--
أعتقد، بشكل شخصي، أن وثائق Python
ليست سهلة الاستخدام جدًا بالنسبة إلى المبتدئ.
على سبيل المثال، إنها مكتوبة بشكل غامض إلى حد ما
يجب أن تتعمقوا جيدًا فيها لفهم أمور معينة.
هذا جيد.
ستعتادون عليها مع مرور الوقت.
ولكن إذا كنتم تشعرون بالزخم منها قليلًا،
يا إلهي، كل ما أُريد فقط أن أعرفه هو upper، الجميع يشعرون بهذا أيضًا.
إذن، control F أو Command F هو صديقكم، upper.
دعوني أمضي قدمًا وأبحث عن هذا.
وفي الواقع إنه غير موجود في هذه الصفحة، أليس كذلك؟
سلسلة-- طرق السلسلة.
ها نحن ذا.
طرق السلسلة.
حسنًا، إذن أسفل طرق السلسلة، دعوني أمضي قدمًا وأبحث عن upper.
وبالأسفل هنا، في الواقع، توجد الوثائق.
إذن سيكون التقليد هو اسم نوع البيانات المطلوب--
str للسلسلة--
اسم الدالة هنا.
ستخبرك بين قوسين إذا كانت تأخذ أي وسيطات، لكنها لا تأخذ.
وهكذا تقوم بإرجاع نسخة من السلسلة مع جميع الأحرف المُصغرة
والتي تم تحويلها إلى أحرف كبيرة-- وهذا يعني فقط الأحرف الأبجدية
بشكل أساسي--
ومن ثم بعض الوثائق الإضافية، وما شابه ذلك.
يُصبح الأمر في مستوى منخفض جدًا بسرعة.
تُعد هذه الوثائق معادلة لصفحات man.
ولا يوجد مرجع CS50 للغة Python.
كان ذلك فقط خاص بلغة C. إذن يجب أن تدركوا أنه توجد
هذه الوثائق المتاحة.
وستلاحظون وجود مجموعات من الدالات.
Strip هي في الواقع نوع من أنواع الدالات الشائعة، أو Strip L أو Strip R.
إذا كانت لديكم مسافة في بداية السطر أونهايته
لأن الشخص الموجود لديكم أصبح مهملاً قليلاً أو توجد سطور جديدة في ملف ما،
يمكنكم استدعاء strip على سلسلة والتخلص من المسافة على اليسار
واليمين لتنظيفه إلى حد ما.
وهذا مفيد للغاية لأشياء مثل تطبيقات علوم البيانات
وتحليل البيانات حيث تقومون فقط بتنظيف البيانات الفوضوية إلى حد ما.
إذن تم إنشاء العديد من الدالات مثل هذه من أجلكم.
حسنًا، إذن دعونا نُلقي نظرة على أمثلة أخرى قليلة تُذكرنا بالميزات
التي كانت لدينا في C، مثل هذه هنا.
لنفترض أنني أُريد أن أكتب برنامجًا يأخذ
وسيطات سطر الأوامر، التي تشبه إلى حد كبير تغيير الحجم،
والتي بدأنا بها قصة اليوم.
دعونا لا نستخدم مكتبة CS50.
لنقم بذلك.
إذا كنتم تريدون الوصول إلى argv، تذكرون أنها في C كانت تبدو مثل هذه-- int،
argc، سلسلة، argv.
كانت تبدو مثل هذه في C.
حسنًا، لسوء الحظ، إذا كنتم لا تستخدمون main،
سيكون أمرًا جيدًا إذا كان يمكنكم استخدام وسيطات سطر الأوامر.
ويمكنكم هذا بالفعل، ولكن يجب أن تقوموا باستيرادها.
إنها كمكتبة توفر لكم إمكانية الوصول.
من sys أو مكتبة النظام، يمكنكم استيراد argv في Python.
وهذا يمنحكم الوصول إلى وسيطات سطر الأوامر كميزة.
ثم يمكنكم قول شيء من هذا القبيل.
إذا كان طول argv--
وهي مجرد مصفوفة، تذكرون، في C--
يساوي يساوي 2، ثم امضوا قدمًا وقولوا مرحبًا.
دعوني أمضي قدمًا وأطبع ما قام المستخدم بكتابته أيًا كان، argv 1.
دعونا فقط بشكل افتراضي أيًا نقول مرحبًا بالعالم.
إذن باللغة الإنجليزية، ما الذي يحدث؟
إذا كتب المستخدم وسيطة سطر الأوامر-- لنقل مرحبًا ذاك وذاك.
وأيضًا إذا لم يكتب الشخص وسيطة سطر أوامر واحدة بالضبط،
فقط لنقل، بشكل افتراضي، مرحبًا بالعالم.
لذا دعوني أقوم بحفظ هذا.
وأكتب Python من argv1، أو بالأحرى صفر.
Enter.
حسنًا، لم أكتب كلمة بعد الأمر.
الآن دعونا نفعل ذلك مجددًا وسأكتب اسم براين.
Enter، مرحبًا براين.
دعونا نفعل هذا مجددًا.
فيرونيكا، Enter.
الآن، هناك شيء ليس تمامًا نفسه كما في C. كم عدد الكلمات التي
كتبتُها للتو في المُحث؟
3.
إذن سيقترح ذلك أن هذه هي argv0، وargv1، وargv2.
ومع ذلك، أقوم بطباعة argv1، وليس argv2.
إذن كيف أفكر في هذا؟
التعليمة البرمجية صحيحة، ولكنها مختلفة عن C.
من الناحية الفنية ما الذي تقوم argv بتخزينه عند تشغيل أمر كهذا؟
تذكرون، دعونا نسترجع ذلك.
في C، ما الذي قامت argv0 بتخزينه؟
الجمهور: اسم الملف.
ديفيد مالان: اسم الملف أو اسم البرنامج الذي قمتَ بتشغيله للتو.
لاحظوا، على الرغم من أن البرنامج الذي قمتُ بتشغيله للتو يُسمى Python.
ولذا قد تعتقدون أن argv0 قد تحتوي على Python،
لكنها لا تحتوي على ذلك لأنه لاحظوا إذا قمتُ بطباعة argv1،
قد تعتقدون أنها 0، 1.
قد تعتقدون أنني قلتُ للتو مرحبًا argv0.py، لكنني لم أفعل.
من الواضح أن argv1 تطبع فيرونيكا أو براين.
إذن من المنطقي أن argv0 هي هذه، وهذا
يعني أن هذا، مثل، argv -1.
يتم استبعاد Python من وسيطة vector، كما يُطلق عليها.
لا تتضمن وسيطات سطر الأوامر اسم المُترجم.
ولكن بخلاف ذلك، هي تعمل بالضبط ما كانت تقوم به من قبل.
ولاحظوا، أيضًا، باستخدام علامة التبويب الجديدة هذه للبناء،
لاحظوا ما يمكنكم القيام به كلما أمكنكم الوصول إلى مصفوفة الأشياء.
إذا انتقلتُ إلى argv1.py و قمتُ باستيراد argv مجددًا، دعوني أمضي قدمًا الآن
وأقوم فقط-- أتعلمون ماذا؟
For s في argv، وأمضي قدمًا وأطبع s.
هذا حقًا أمر موجز.
ما الذي سيفعله هذا؟
دعوني أمضي قدمًا وأكتب Python من enter ،argv1.
ويقوم فقط بطباعة اسم الملف.
إذا مضيتُ قدمًا وقلتُ foo، bar ،baz، ثلاث كلمات عشوائية،
إنه يطبع كل تلك الكلمات.
إذن الشيء القوي في Python بصراحة هو هذا التكرار الحلقي.
لا يوجد int i، أقل من، زائد زائد، أي من ذلك.
تقولون فقط، أعطني متغير يُسمى s
وقم بتكرار الشيء بالكامل على اليمين، وهو ما يُفترض أنه،
في هذه الحالة، يكون مصفوفة.
يمكنكم أن تكونوا أقوى بكثير من ذلك.
إذا قمتُ-- كما حدث في C منذ أسابيع--
بالنظر في الأحرف في هذه السلاسل-- دعوني أكتب argv2.py--
لنفترض أن هذا التكرار لكل سلسلة في argv،
ومن ثم هنا التكرار كل حرف في s، يمكنني كتابة for c في s
ومن ثم طباعة الحرف.
إذن الآن عندما أقوم بتشغيل الأمر نفسه ولكن على argv2.py،
لاحظوا ما الذي سيحدث.
دعوني أرفع هذا قليلاً.
Enter.
يطبع كل حرف من كل كلمة واحدة كل مرة.
لكنه فعل ذلك هذه المرة بناء على استخدام هذين التكرارين الحلقيين.
إذن ماذا يعني هذا؟
عندما تكون لديكم مصفوفة، كما أطلقنا عليها،
يمكنكم تكرار كل شيء في المصفوفة.
عندما تكون لديكم سلسلة، يمكنكم تكرار كل حرف في السلسلة.
وهنا حيث تصبح Python مرنة بشكل رائع
للقيام بذلك مرارًا وتكرارًا.
حسنًا، لنُلقي نظرة على--
دعونا نرى-- سلاسل تمت مُقارنتها بالفعل.
قمنا بنسخ سلاسل.
دعونا نمضي قدمًا ونقوم بذلك في Python.
تذكرون أننا واجهنا حد أساسي في C،
ويبدو متعلقًا بالبرمجة، عندما كان لدينا مثال يُسمى تبديل
وno swap مجددًا عندما كنت فقط
أحاول تبديل قيمتين، x وy.
وتذكرون أنني قمتُ ضمنيًا بشيء مثل x هو 1 وy هو 2.
وكان الهدف من كل هذا ببساطة هو أن أقول أولاً، x هو كذا وكذا،
وy هو كذا وكذا.
دعوني أمضي قدمًا وأجعل ذلك سلسلة تنسيق.
ثم أردتُ طباعة هذا مجددًا.
لكن في مكان ما هنا، أردتُ تبديل x وy.
إذن، لنستخلص من استكشافنا لما يمكن أن تقوم به Python،
إذا أردتم تبديل متغيرين، x وy، فلا بأس، فقط افعلوا ذلك.
وهذا مثل لعبة shell السحرية التي تعمل فقط في Python.
الآن، من الناحية الفنية هذه تُسمى صفوف على اليسار.
إنه زوج من x فاصلة y.
إنه خط الطول فاصلة خط العرض.
إذن يوجد فعليًا نموذج عقلي كامن لما يحدث هنا.
ولكن في الواقع، فأنتم حرفيًا تقومون بتبديلها
ولا تحتاجون إلى المتغير المؤقت.
تهتم لغة Python بهذا من أجلكم.
حسنًا، دعونا نُلقي نظرة على ميزة قوية أكثر
ومع ذلك، هذه المرة في الواقع باستخدام ما تُسمى قائمة.
إذن منذ لحظة كنت استخدم argv0 ،1 ،2، كأمثلة.
وكنت أُطلق عليها مصفوفات.
إنها ليست مصفوفات بعد الآن.
لا تحتوي Python على مصفوفات.
تحتوي Python على قوائم.
وتُذكرنا القوائم بالقوائم المرتبطة.
وبالفعل، هي كذلك.
فيPython، لديكم قوائم قابلة لتغيير حجمها.
لا يجب أن تتخذوا قرارًا مسبقًا عن مدى كبر أو صغر حجمها.
ستكبر وتصغر من تلقاء نفسها تمامًا كما ستفعل قائمة مرتبطة،
ولكن لا يجب أن تكتبوا القائمة المرتبطة بأنفسكم.
أجل؟
الجمهور: [INAUDIBLE]
ديفيد مالان: بالتأكيد.
الجمهور: [INAUDIBLE]
ديفيد مالان: أوه، بالتأكيد.
دعوني أفتح هذا الملف في argv1.
هذا هنا؟
الجمهور: لقد كان مثل، [INAUDIBLE].
ديفيد مالان: أوه، هذا هو هنا.
الجمهور: نعم.
[INAUDIBLE] قوس تدوين [INAUDIBLE]..
ديفيد مالان: نعم، يمكنك-- إذن argv، أطلقتُ عليها مصفوفة،
لكن كانت هذه كذبة بيضاء منذ لحظة.
إنها في الواقع قائمة، قائمة مرتبطة.
ولكن بينما لا تتيح أي قائمة مرتبطة في C لكم استخدام الأقواس المربعة،
يجب أن تستخدموا for loop أو while loop
لتكرار الشيء بأكمله للعثور علي ما تبحثون عنه، في Python،
إذا كان هناك شيء في قائمة، فيمكنكم فقط استخدام، حسنًا، الأقواس المربعة
للحصول على هذا العنصر المحدد.
الجمهور: أو أقول أنه يمكنك استخدام f مباشرة قبل--
ديفيد مالان: أوه، كان من الممكن ذلك، نعم.
لم أستخدم F، فقط لأنه بصراحة يصبح قبيحًا في النهاية.
ولكن نعم، يمكنني أيضًا أن أفعل هذا لتحقيق التأثير نفسه بالضبط.
ولكن ستبدو فقط مشفرة.
حسنًا، دعونا نقدم بالفعل قائمة، وهي نفسها نوع بيانات في Python،
وكذلك في لغات مثل ++C وJava،
إذا كان لدى البعض منكم تلك الخلفية أيضًا.
إذن هنا، في list.py، دعوني أمضي قدمًا وأقوم بما يلي.
دعوني أولاً أستورد getInt من مكتبة CS50
بحيث يُمكننا الحصول على بعض الأعداد الصحيحة من المستخدم.
دعوني أعطي نفسي مصفوفة والمعروفة أيضًا بأنها
قائمة في Python الآن.
إذن في C لا يمكنكم حقًا التعبير عن هذه الفكرة تمامًا.
في Python، إذا كنتم تريدون متغير يُسمى أرقام
وتريدون تهيئته إلى قائمة فارغة،
فقط تقومون حرفيًا بفتح قوس، ثم قوس مغلق.
لا يوجد رقم بينهما.
وكما فعلنا من قبل، لاتوجد فاصلة منقوطة.
دعونا الآن نقوم بما يلي للأبد حتى أقوم بتقسيم هذا.
دعوني أمضي قدمًا وأحصل على رقم من المستخدم،
فقط من خلال سؤاله عن رقم.
ثم دعوني أقول، إذا لم يكن رقمًا، وأمضي قدمًا وأقوم بتقسيم هذا.
سيقوم هذا، كملاحظة جانبية، فقط بالسماح لي أن أخرج
من هذا عن طريق الضغط على Control D كما ناقشنا من قبل.
ولكن هذه ميزة واجهة المستخدم فقط.
إذن يُعد ذلك أمرًا رائعًا إلى حد ما.
لنفترض أنني أُريد تنفيذ فكرة التحقق
إذا كان الرقم الذي قد كتبه المستخدم موجودًا في القائمة بالفعل، وإذا كان كذلك،
فلا تضيفوه.
سأمضي قدمًا وأفعل هذا.
لكن أولاً، دعونا نفعل هذا--
numbers.append number.
وهذه ميزة جديدة.
إذن ماذا أريد أن أفعل هنا؟
for number في numbers--
سأوضح هذا خلال ثانية--
دعوني أمضي قدمًا وأطبع number.
إذن ما الذي يتطلع هذا البرنامج لفعله؟
في الأعلى، سأستورد getInt.
في الأعلى أسفل ذلك، سأمنح نفسي فقط مصفوفة فارغة،
والتي تُسمى الآن قائمة، تُسمى أرقام.
ثم أفعل ما يلي للأبد.
أمضي قدمًا وأحصل على الرقم من المستخدم.
إذا لم يقم هو أو هي بالفعل بكتابة رقم، فقط قم بتقسيم هذا.
انتهى البرنامج من عمله.
لكن ها هي الميزة الجديدة.
كما هو الحال باستخدام السلاسل، فهي كائنات، إذا جاز التعبير.
إنها بنيات بيانات تحتوي على دالات مُدمجة.
إذن تحتوي القوائم على دالات مُدمجة.
هناك حرفيًا دالة داخل كل قائمة في Python
وتُسمى append وحرفيًا تقوم بذلك.
تستدعون append ثم تقوم هي بإلحاق أيًا كان مدخلها
إلى القائمة نفسها أيًا كانت.
إذن في C، قد تضطرون إلى استخدام realloc.
قد تضطرون إلى إضافة شيء إلى نهاية القائمة.
لكن لن يحدث أي من هذا بعد الآن.
فقط في مستوى عالٍ، تقولون قومي بإلحاق هذا إلى القائمة
ودعوا اللغة تهتم بهذا من أجلكم.
ثم هنا بالأسفل، تتم المحاذاة إلى اليسار حتي النهاية،
فقط تقول، for number في numbers.
مثلًا، قم بالتكرار على جميع الأرقام في القائمة وطباعة واحد في كل مرة.
إذن دعونا نجرب هذا.
دعوني أنتقل إلى هنا وأقوم بهذا--
python list.py-- ودعوني أمضي قدمًا وأكتب رقمًا مثل 13، و42، و50.
وسأضغط على Control D، والذي يعني أن هذا كل شيء، لقد انتهيت.
وهناك نرى الأرقام الثلاثة.
هذا يبدو غبيًا قليلاً لأنه أتعلمون ماذا؟
أعتقد أنني بحاجة إلى طباعة هنا.
دعونا نُصلح هذا.
دعوني أعيد تشغيل هذا.
13، و42، و50، Control D، ها نحن ذا.
واحد كل سطر.
ولكن بصراحة هذا البرنامج لديه خطأ نوعًا من، احتمالاً.
لنفترض أنني أريد أرقام فريدة، والآن لديّ ثلاثة من الرقم 13.
لكني وبشكل مثالي أريد نسخة واحدة فقط من كل رقم لأيّ سبب من الأسباب.
أريد الطابع الفريد.
حسنًا، لاحظوا مدى سهولة تعبيركم عن ذلك.
إذا كان هدفي هو فقط إضافة رقم إلى قائمة الأرقام بطريق مشروطة
إذا لم يكن هناك بالفعل، كيف يمكنكم القيام بذلك بلغة C؟
لديكم مصفوفة تُسمى الأرقام وتريدون التحقق أولاً
من وجود رقم في هذه المصفوفة.
ماذا كنتم ستفعلون بالإنجليزية؟
الجمهور: تكرار حلقي من النوع for.
ديفيد مالان: تكرار حلقي من النوع for، صحيح؟
على الأرجح ستبدأون من اليسار، ثم تقومون بالتكرار على
المصفوفة بأكملها بحثًا عن الرقم ثم تستنتجون إن كان صحيحًا أم خاطئًا،
إنه هناك.
هذا ليس صعبًا لكنه مزعج قليلاً.
عليكم كتابة المزيد من التعليمات البرمجية، سطرين، أربعة أسطر لتكرار حلقي من النوع for.
في Python، فقط قولوا ما تقصدونه.
If number not in numbers, append it.
ويبدو مشابهًا للغة الإنجليزية بصورة كبيرة.
في نهاية المطاف، كتب شخصًا ما التكرار الحلقي for الذي يقوم بهذه العملية.
لكن يُمكننا نحن، المبرمجين الأكثر حداثة، الآن فقط القول، if number not in numbers،
append it.
إذن من المفترض أن يبدو هذا شبيهًا باللغة الإنجليزية.
إذن دعونا نجرب هذا الآن.
13، و13، و50، تم.
الآن أحصل فقط على نسخة واحدة من الرقم 13 لأنه يقوم بالتحقق من ذلك لأجلي.
حاليًا، لا يزال وقت التشغيل يُمثل مشكلة.
فكروا في هذا، نظريًا، مازلتم
تضيعون بعض الوقت بحثًا عن رقم لأن شخصًا ما كتب
تعليمة برمجية هي على الأرجح بحثًا خطيًا.
وربما تكون بحثًا ثنائيًا إذا تم ترتيبها.
لكن شخصًا ما كتب تلك التعليمة البرمجية.
لكن المغزى هو أنه، مع هذه اللغات عالية المستوى،
هذه اللغات الأكثر حداثة مثل Python، هذه ليست مشكلتنا، بالضرورة.
تُصبح فقط مشكلتنا إذا كان البرنامج
بطيئًا جدًا فقط لسببٍ ما، ونحن حقًا بحاجة للوصول إلى تعقيدات السبب.
حسناً، دعونا ننظر إلى ميزة أخيرة من حيث الصياغة
قبل أن نحاول هذا على مشكلة أعم.
دعوني أمضي قدمًا وأحفظ ملفًا باسم struct0.py،
والذي يُذكرنا بـ struct0.c منذ أسابيع قليلة.
دعوني أمضي قدمًا وأقوم باستيراد getString من مكتبة CS50.
دعوني أمضي قدمًا وأعطي نفسي مصفوفة هذه المرة تُسمى students وتكون فارغة،
أو قائمة تُسمى students.
ثم دعوني فقط أحصل على ثلاثة طلاب من أجل المناقشة.
إذن for i in range 3، مما يعني أنه يتكرر ثلاث مرات،
دعوني أمضي قدمًا وأسأل المستخدمين عن أسمائهم.
إذن getString، اسألهم عن أسمائهم.
ثم دعوني أمضي قدمًا وأسأل عن سكنهم
وأمضي قدمًا وأحصل على سلسلة للسكن.
ثم هذا كاف.
دعوني أمضي قدمًا وأقوم بإلحاق الطالب بقائمتي.
إذن students.append.
ولكن حقًا ليس لديّ بنية student حتى الآن.
الآن، هناك العديد من الطرق لحل هذا، ولكن دعوني
أقترح أبسط حل.
اتّضح أن في Python يُمكنكم إعلان جداول علامات التجزئة بطريقة رائعة وبسيطة.
يُعد جدول علامات التجزئة مجرد مجموعة من أزواج القيم الرئيسية.
ويُمكنني القول عند هذه المرحلة في مثالي أنه لديّ كلمات رئيسية وقيم.
لديّ اسم وهو كلمة رئيسية وقيمته، مثل ديفيد أو أيًّا كان،
كلمة رئيسية أخري تُسمى سكن، ثم قيمة وهي مثلاً Matthews
أو أيًّا كان.
إذن كلمات رئيسية وقيم.
لذلك سيكون لطيفًا نوعًا ما إذا تمكنت من إنشاء جدول علامة تجزئة--
أو حتى حاولت، لهذا الأمر-- والذي يسمح لي بتخزين هذه البيانات.
حسنًا، اتّضح في Python، أنه يُمكنني القيام بذلك بالضبط.
يُمكنني أن أمضي قدمًا وأنشئ كائنًا يُسمى student
باستخدام رمز القوس المتعرج.
ويمكنكم حرفيًا فعل هذا.
سيكون الاسم كلمة رئيسية.
والآن ستأخذ هذه القيمة.
سيكون سكن كلمة رئيسية أخرى وستأخذ هذه القيمة.
إذن يُمكنني أن أُسمي هذا أي شيء أريده-- x وy
وأعطيهم القيم ديفيد وMatthews أو أيًّا كان ما سأقوم بكتابته.
ولكن إذا كنتم ترغبون في بنية بيانات مُعمَّمة للغاية
بحيث لا تكون مجرد قائمة قيم من من اليسار إلى اليمين، ولكن تحتوي على بيانات تعريف--
كلمة رئيسية، أو إذا كنتم تفكرون في جدول بيانات، أو اسم عمود
يُسمى اسمًا وعمود آخر يُسمى سكنًا، وكلاهما لديه قيم--
فقط استخدموا أقواسًا متعرجة.
ثم قوموا بوضع الكلمات الرئيسية بين علامات اقتباس ثم نقطتين.
ثم إذا كان لديكم كلمات رئيسية متعددة، فقوموا فقط بوضع فاصلة.
إذن إنه مشفر قليلاً، لكن يبدو هذا تماماً مثل حاوية، جدول علامة التجزئة،
يحتوي على كلمات وقيم.
الآن، في Python المجموعة الرابعة، عندما قُمتم بتنفيذ المدقق الإملائي،
في الواقع كنتم فقط تقولون نعم أو لا، هل الكلمة موجودة في القاموس؟
لكن بالتأكيد كان بإمكانكم تخزين مزيد من المعلومات
بدلاً من القيم المنطقية فقط.
أنتم لستم بحاجة لفعل هذا كثيرًا.
إذن ما الذي يعنيه هذا لي؟
في هذه المرحلة من الموضوع، لديّ كائن،
كما يُسمى في Python، والذي يُخزن هذه الكلمات الرئيسية وهذه القيم.
إذن إذا أردتُ لاحقًا التكرار عليهم، يُمكنني ذلك.
For student in-- أوه، عليكم إلحاقه--
إذن student.append student.
دعونا نُضيف student إلى القائمة.
إذن for student in students، وهذا كيف
تقومون بالتكرار على جميع الأشياء في هذه القائمة.
دعوني أمضي قدمًا وأقول جملة مثل، أريد أن أقول فلان
في هذا السكن.
كيف يمكن التعبير عن ذلك؟
حسنًا، فلان، أُريد الوصول إلى اسم الطالب.
والطريقة التي يُمكنني فعل هذا بها كما يلي.
يُكنني القول، دعوني أمضي قدمًا وأقول قوس متعرج student قوس
name قوس مُغلق.
ثم هنا، يٌمكنني أن أمضي قدمًا وأقول--
عذرًا، دعوني أضع علامة اقتباس هنا--
ثم هنا يُمكنني أن أقول student قوس ثم بين علامتي اقتباس dorm.
إذن في الحقيقة هذا أكثر مثالاً مُشفرًا قمنا به حتى الآن.
لكن دعونا نُقسّم هذا كسلسلة مُنسقة.
إذن إذا قُمت بتكبير هذا، ما الذي أفعله؟
تعني الأقواس المتعرجة وحرف f تنسيق هذه السلسة فقط.
إذن يُمكنكم تجاهُل الأقواس المتعرجة كجزء من موضوعنا في وقت سابق.
student هو اسم المتغير في التكرار الحلقي for.
إذن هذا هو الطالب الحالي.
لكن الأقواس المربعة جديدة.
في لغة C، المرة الوحيدة التي استخدمنا فيها الأقواس المربعة كانت في أي سياق؟
الجمهور: المصفوفات.
ديفيد ج. مالان: المصفوفات.
ومالذي كُنا نقوم بوضعه دائمًا في تلك الأقواس المربعة؟
رقم.
نعم، إذن 0، و1، و2.
يُمكنكم فهرستها إلى مصفوفة.
الشيء الرائع بشأن الكائن--
أو جدول علامة تجزئة بشكل أعمّ، كما نقوم بتعريفه الآن--
هو أنه يُمكنكم الفهرسة إلى المتغير عبر استخدام كلمات، وليس أرقام.
إذن يُمكنكم التفكير في student كقائمة أو مصفوفة
ذات قيمتين-- name وdorm.
لكن من الجيد أن أكون قادرًا علي الإشارة إليهم ليس كصفر وواحد
أو رقم اعتباطي غبي، لكن ككلمات رئيسية--
name وdorm.
إذن هذه الصيغة هنا، علي الرغم من أنها مُشفرة، تقول امضوا داخل كائن
student واحصلوا علي قيمة الكلمة الرئيسية التي تُسمى name.
وهذا ينطبق أيضًا على dorm.
إذن يسمح لكم الكائن في Python--
أو بشكل أعم جدول علامة التجزئة-- بربط الكلمات الرئيسية بالقيم.
وهذه بكل بساطة الصيغة المستخدمة لذلك.
إذن دعوني أمضي قدمًا وأُشغل هذا.
Struct0.py-- اكتب اسمي.
لنقل ماثيوس.
دعونا نكتب، مثل، فيرونيكا، ويلد.
دعونا نكتب بريان.
بريان، أين كنت تعيش؟
الجمهور: أي سنة؟
ديفيد مالان: طالب فى السنة الأولى.
الجمهور: Pennypacker.
ديفيد مالان: Pennypacker, enter.
لم تكن هذه التفاصيل مهمة حقًا، لكننا الآن قد
عبرنا عن جميع تلك الجمل.
إذن باختصار الآن لم نر هذه تمامًا في لغة C،
لكننا رأينا لمحة عن هذه عندما نفذنا جدول التجزئة
الخاص بنا في لغة C حتى يمكننا في الواقع الوصول إلى الكلمات الأساسية والقيم بشكل اعتباطي.
إذن دعونا نقوم بـ-- في الواقع، دعوني أتوقف هنا لأتلقى أسئلتكم
قبل أن نُعيد لعبة ماريو.
حسنًا.
إذن دعونا الآن نقدم أمثلة ليس فقط من أجل التوضيح،
لكن لنعود بالذاكرة إلى صديقنا القديم الذي رأيناه بضع مرات
وننظر فقط على بعض اللقطات المختلفة.
إذن في لعبة Super Mario Bros، الركض من اليسار إلى اليمين
قد تتذكرون أو قد رأيتم أنه يوجد شيء كهذا في سماء اللعبة.
ويُفترض أن يركض ماريو تحتها ثم يقفز للأعلى
ثم يحصل على قطع نقدية أو أيًا كان بالقفز عاليًا وإصابة علامات الاستفهام تلك.
إذن تُعد هذه في الغالب طريقة مُستنبطة لقول،
لنفترض أننا نريد طباعة أربع علامات
استفهام على الشاشة تمامًا مثل لعبة Super Mario Bros، كيف يمكننا القيام بذلك؟
ستبدو باللون الأبيض والأسود قليلاً، نصية قليلاً،
ولكن كيف يمكنني طباعة أربع علامات استفهام؟
حسنًا، دعوني أنتقل هنا ودعوني أنشئ ملفًا باسم،
لنقل، Mario0.py.
وكيف يمكنني القيام بذلك؟
ما هي الطريقة الأبسط للقيام بذلك، طباعة أربع علامات استفهام؟
حسنًا، سمعت طباعة.
حسنًا، أربع علامات استفهام.
جيد جدًا.
إذن دعونا نمضي قدمًا ونشغل Mario0.
صحيح، هذا صائب.
إذن هذا ليس سيئًا.
إنها سلسلة واحدة، لم يبدُ أن هذا أمر مهم.
دعونا نقوم بفعلها باستخدام تكرار حلقي على الأقل، كما نفعل في كثير من الأحيان،
فقط لكي نُحسن التصميم، رغم أن هذا
يُعد مثالاً صغيرًا للغاية.
إذن Mario1.py، دعونا نمضي قدمًا ونطبع هذا باستخدام تكرار حلقي، على سبيل المثال.
إذن كيف أفعل ذلك؟
كيف أطبع أربع علامات استفهام، ولكن واحدة في كل مرة؟
For i in range four, print, question mark.
حفظ، حسنًا.
إذن Python, Mario.
هل يريد أحد منكم الصراخ لا، لا تفعل هذا؟
حسنًا، شكرًا.
هذا رائع.
حسنًا،لمَ لا تريدون أن أفعل ذلك؟
لأن جميعها عمودية.
إذن كان يمكننا إصلاح هذا الأمر الآن.
كيف أخبر الطباعة، لا تنهي سطورك بالسطر الجديد الافتراضي؟
إذن ويساوي فقط علامة الاقتباس وإنهاء الاقتباس لتجاوز قيمة الخط المائل العكسي n الافتراضية.
إذن الآن يمكنني إعادة تشغيل هذا.
حسنًا، يبدو أمرًا خاطئًا قليلاً.
إذن كيف يمكنني إصلاح ذلك بحيث أضع سطرًا جديدًا فقط بعد آخر سطر؟
الجمهور: [INAUDIBLE]
ديفيد مالان: نعم، بصراحة، أنا لا أطبع أي شيء فقط.
وهذا سيشتمل على تأثير طباعة سطر جديد مجانًا.
إذن دعونا نفعل هذا.
حسنًا.
الآن لدينا مثال جيد هناك.
حسنًا، إذن يتضح أننا طبعنا بالفعل على طول الطريق
مثالاً منفصلاً، بدا مثل هذا، وإن كانت هناك أربع كتل.
إذن لن نفعل-- دعونا نمضي قدمًا ونفعل ذلك بشكل رأسي،
ليس باستخدام علامات الاستفهام، ولكن باستخدام علامات التجزئة مثل الكتل.
إذن إذا أردنا طباعة علامات التجزئة الثلاث تلك،
دعوني أستحضر بعض الإلهام من هذه ودعونا نقول في Mario2.py،
دعوني أمضي قدمًا وأقول فقط for i في النطاق 3،
امضي قدمًا واطبع كتلة واحدة.
وكما كنتم تنصحون، فقط أفعل ذلك--
أو لا، بدلاً من ذلك، دعونا نستخدم الافتراضي لطباعة
شريط عمودي مكون من ثلاث كتل.
إذن هذا هو Mario2.py.
والآن قمنا بشيء يذكرنا بذلك.
لكن الآن تصبح الأمور مثيرة للاهتمام قليلاً إذا انتقلنا إلى الأسفل.
ودعونا نركز على هذا المربع.
إذن ثلاثة بثلاثة، على سبيل المثال، لكننا لم نرى
شيئًا تمامًا كهذا.
إذن في مثالنا الأخير هنا، لنرى.
هل لدينا متطوع شجاع يأتي إلى الأعلى، لربط بعض هذه الأفكار
معًا؟
هل هذه يد مرفوعة في الخلف؟
تعالي إلى هنا.
إذن سيكون هذا Mario3.py، هدفه هو طباعة قالب،
قالب أكبر--
إنه مثل ثلاثة بثلاثة-- مرحبًا مجددًا.
أندريا: مرحبًا.
ديفيد مالان: من أجل الجمهور، ما هو اسمك؟
أندريا: أندريا.
ديفيد ج. مالان: أندريا، سررتُ بلقائك.
أندريا: سررتُ بلقائك.
ديفيد مالان: حسنًا، إذن الهدف المنشود
هو طباعة شبكة ثلاثة بثلاثة فقط من
علامات التجزئة للتذكرنا بهذه الكتل.
حسنًا، أنتِ المسؤولة.
أندريا: حسنًا.
هل يجب أن أقوم، مثلاً، بتكرار حلقي أو شيء من هذا القبيل؟
دايفيد مالان: أيًّا كان ما يؤدي المهمة.
حسنًا، for.
حسنًا، جيد.
حسنًا، هذا أمر مثير للاهتمام.
حسنًا، طباعة، علامة الاقتباس وإنهاء الاقتباس، طباعة، نعم، حسنًا.
أندريا: حسنًا.
أوه، حسنًا.
دايفيد مالان: تفصيل الكلمة الرئيسية.
أندريا: ماذا كانت هذه، علامة تجزئة؟
دايفيد مالان: علامة التجزئة جيدة، نعم.
أندريا: حسنًا.
ديفيد مالان: حسنًا.
وقبل القيام بهذا، هل يُريد الجميع منها أن تقوم بتشغيل هذا البرنامج
على أن يكون صحيحًا؟
الجمهور: لا تقومي بهذا.
ديفيد مالان: لا، لماذا؟
الشخص الذي صرح بالرفض، ماذا؟
ما هو سبب رفضك؟
الجمهور: N يساوي-- سيقوم بهذا [INAUDIBLE]
ديفيد مالان: جيد، حسنًا.
إذن قُمتَ بإصلاح ذلك.
جيد.
أي أسباب أخرى؟
أجل؟
الجمهور: [INAUDIBLE]
ديفيد مالان: حسنًا.
هل سيكون هذا بالأعلى والأسفل؟
حسنًا، دعونا نرى.
هل يُمكنكِ إخبارنا لفظيًا-- هل يجب--
هل يُمكنكِ إخبارنا ما الذي يقوم به البرنامج؟
[LAUGHTER]
أندريا: for i في النطاق 3، إذن هذا سيحدث ثلاث مرات، ثم j
في النطاق 3، سيحدث الشيء التالي أيضًا ثلاث مرات.
إذن نطبع علامة تجزئة.
ثم علامة تجزئة أخرى وهكذا
لأن النهاية هي علامات الاقتباس.
دايفيد مالان: حسنًا.
أندريا: ثم يحدث هذا ثم نقوم بطباعة سطر جديد.
ثم سيقوم بتنفيذ ذلك ثلاث مرات.
ديفيد مالان: حسنًا.
ما هو رأيكم؟
هل أنتم-- اقتنعت البطة.
حسنًا، لمَ لا تمضي قدمًا وتقومي بحفظ الملف.
دعونا نحاول.
لا ضرر في المحاولة، لذا صحيح أم خاطئ، دعونا نرى.
هذا يُدعى Mario3.py، وأعتقد أننا سنصفق لها إذا أمكننا.
عمل رائع للغاية.
حسنًا.
إذن دعونا-- وإذا كنتم تريدون واحدًا آخر.
إذن دعونا نلقي نظرة على مثال واحد أخير،
قادم من دائرة كاملة من حيث بدأنا.
ألقينا نظرة بالطبع على تغيير الحجم.
ودعونا نفتح ذلك، فقط لنرى كيف أكتب التعليمة البرمجية قليلاً
وأقوم بإنجاز هذا العمل بالفعل.
لذا في resize.py، من حيث بدأنا،
لاحظوا أن لدي سطور قليلة والتي آمل أن تكون مألوفة أكثر من ذلك قليلاً
الآن.
لكننا لم نقدم بالضبط كل هذه الميزات بأنفسنا.
لذا يتضح أن في السطر الأول والسطر الثاني لدينا
سطر واحد مألوف وسطر واحد غير مألوف.
يتيح لنا السطر الثاني الوصول إلى وسيطات سطر الأوامر فقط، والتي
نحتاج إليها لتغيير حجم الصورة النقطية.
تأتي القوة من السطر الأول.
يتضح أن هناك مكتبة في Python تُسمى pillow
والتي يمكنكم تثبيتها عن طريق كتابة أمر معين في النافذة الطرفية الخاصة بي.
لا تأتي بالضرورة مع جهاز Mac أو الكمبيوتر الشخصي الخاص بك.
يجب أن تقوم بتنزيلها وتثبيتها باستخدام أمر.
ثم إذا كنتَ تقرأ وثائقها، فستقول
من pil لصورة استيراد pillow.
الآن، هذه ليست صورة محددة.
هذا اسم مكتبة تُسمى مكتبة الصورة
التي تأتي مع هذا البرنامج الذي جعله شخص ما متوفرًا مجانًا.
لذا هي تقول فقط، أمنحني حق الوصول إلى المكتبة المتعلقة بالصورة.
ومما لا شك فيه، يمكن أن توجد أشياء متشابهة في C. لكننا بالطبع
قمنا بأشياء على مستوى منخفض جدًا.
حسنًا، إذا كان طول argv ليس 4، فسيخبر المستخدم بالاستخدام.
وهذا فقط إذا لم يتعاونوا عن طريق الكتابة كما يجب، هذا.
إن الأمر أكثر إطنابًا قليلاً الآن لأن لدينا Python
ولدينا ملحق الملف.
لكن يمكننا تنظيف ذلك من الناحية الفنية إذا أردنا ذلك حقًا.
السطور 7 و8 و9، لا يوجد شيء جديد هناك حقًا.
سأُعلن فقط عن ثلاثة متغيرات مكتوبة ضمنيًا.
لا داعي للقلق حول قول int أو سلسلة.
أصل إلى argv1 و2 و3، وهي 1 و2 و3.
ثم أقوم بشيء واحد السطر 7.
ما هو الشيء الذي يقوم به السطر 7 ويُعد مهمًا؟
الجمهور: [INAUDIBLE]
ديفيد مالان: أقوم بتغيير الوسيطة من الناحية الفنية
سلسلة بشكل افتراضي-- لأنه بالفعل، كتبتُه أيدي الأشخاص
على لوحة المفاتيح-- وتم تحويله إلى رقم.
الآن، كملاحظة جانبية، إذا لم يقدم المستخدم رقمًا مثل 2 أو 10،
قد تنقسم هذه التعليمة البرمجية.
لنكن منصفين، يجب أن أتحقق حقًا من الخطأ
للتأكد إذا كان المستخدم قد كتب مرحبًا وليس 2 أو 10،
أريد العثور على هذا الخطأ.
لذا أنا مهمل قليلاً.
لكن كان من المفترض حقًا إظهار تعليمة برمجية موجزة.
لذا الآن لدينا infile وoutfile محددين بالضبط كما كان من قبل.
لذا لدينا فقط ثلاثة سطور متبقية وهي في الواقع تقوم بتنفيذ معظم السحر.
نعم.
الجمهور: [INAUDIBLE]
ديفيد مالان: انتظر، قل الجزء الأخير مرة أخرى.
الجمهور: [INAUDIBLE]
ديفيد مالان: نعم.
الجمهور: كان هناك تقريبًا [INAUDIBLE]
ديفيد مالان: ملاحظة جيدة.
إذن هذا ليس مجرد تحويل مدخلات المستخدم إلى قيمة ASCII معادلة
لأن هذا ليس ما نريده.
تم تحويل هذا int المُستخدَم هنا بالفعل
كما عبر A2I، وهي دالة ربما كنت تستخدمها منذ بضعة أسابيع،
انها مجرد تسمية موجزة أكثر قليلاً.
هناك دالة تستطيع من خلالها تحويل حرف أو سلسلة
إلى ما يعادلها من ASCII.
لكن ما يحدث هنا ليس هذا.
إنه يحول هذا إلى عدد صحيح بطريقة أكثر بديهية
دون استخدام دالة مسماة بطريقة مشفرة مثل a2i.
لذلك دعونا ننتقل إلى الأسفل أكثر قليلاً إلى هذه الأسطر القليلة الأخيرة
ونرى ما الذي يحدث.
ستعرف كيفية القيام ببعضهم فقط من خلال قراءة
الوثائق كما فعلنا تمامًا.
هذا يقول أعطني متغيرًا يُسمى صورة.
يمكن أن يطلق عليه أي شيء.
أنا أحاول فقط أن أكون متجانس داخل الملف.
هذا يقول، استخدم مكتبة الصور.
استخدم الدالة المفتوحة التي تأتي معها.
إذن الصورة هي نوع من البنية، والتي يوجد في داخلها
بعض الدالات المفيدة المتعلقة بالصور.
لذا أطلق وظيفتها المفتوحة على اسم الملف،
ثم امضِ قدمًا واستخرج ارتفاعه وعرضه.
لذا يتضح أن هذا صفًا آخر، إذا صح التعبير.
تشبه الصفوف، مرة أخرى، x فاصلة y، خط الطول فاصلة خط العرض.
ستعرف فقط أنها صفوف من خلال الوثائق.
لذا عندما أقول ارتفاع فاصلة، فإن هذا يأخذ ما يعد تقنيًا قائمة
من الحجم اثنين-- أو حقًا، صف--
ويستخرج لي فقط العرض والطول.
لكن دعوني لا ألقي بالاً لهذه الصيغة المعينة.
المتبقي من هذا يقول ما يلي.
أعطني متغيرًا جديدًا يُسمى الصورة.
قم باستدعاء دالة تغيير حجم صورة المدخلات، وهي دالة أخرى
مضمنة فيه، تمامًا مثل open، وقم بتغييرها
بهذا الطول وهذا الارتفاع-- العرض الأصلي ضرب n،
الارتفاع الأصلي ضرب n.
لا يوجد تلاعب بالحشو، هذا كله مسئولية المكتبة.
تعامل أشخاص آخرون مع هذا الأمر لنا.
وهذا السطر الأخير، ربما هذا ليس مفاجئًا،
يحفظ صورة المخرج إلى اسم الملف هذا.
إذن في، تقريبًا، 15 سطرًا من التعليمات البرمجية وأقل
إذا تخلصنا من بعض المسافات، يمكنك
تنفيذ تغيير الحجم بالكامل.
لكن لنركز حقًا على منطق المشكلة،
أرغب في أخذ مدخل من المستخدم.
أريد تكبيره باستخدام عامل n.
وأريد حفظ الملف.
هذا ما يهمك.
أنت لا تهتم بالضرورة بالدخول في تعقيدات ما كان يجب عليك
القيام به عندما قمت به في C.
لذا لنقم بمثال واحد أخير هنا.
ستتذكر من مجموعة المشاكل الرابعة أنك قمت بتطبيق مدقق التهجئة الخاص بك.
والاحتمالات هي أنك قمت بتجربة أو جدول علامة تجزئة أو ما شابه ذلك.
ويتضح أن هذا ليس تافهًا، بالتأكيد في C.
وهو غير تافه بالتأكيد لأول مرة في أي لغة.
لكن دعوني أغتنم الفرصة وأقوم بذلك الآن في Python.
اسمحوا لي بالانتقال إلى source 6 حيث لديّ مثال على مدقق إملائي.
ولاحظوا أن في هذا المجلد اليوم أحضرت بعض الملفات معي.
لذا أحضرت نسخة من القواميس
من المجموعة الرابعة p، نسخة من ملفات النص، مثل أرض اللا لاند وما شابه
ذلك في النص.
ثم أحضرت ملفين-- dictionary.py وspeller.py--
ويُعد الأخير تنفيذًا لـ speller.c بلغة Python.
ولن أقوم بسحب ذلك لأننا كتبنا ذلك بالكامل
من أجلكم.
لكن دعوني أمضي قدمًا وأكتب، على سبيل المثال، فقط قاموسي الخاص.
إذن dictionary.py هو التناظر لـ dictionary.c.
ودعونا نمضي قدمًا ونقوم بإعداد هذا.
دعوني أمضي قدمًا وأُنشئ هذا الملف في مجلد منفصل
للوقت الراهن، لذا dictionary.py.
ويوجد القليل من الدالات في dictionary.c
والذي ربما ينبغي علينا تفادي تنفيذه.
ما هي تلك الدالات؟
الجمهور: Load.
ديفيد مالان: كان Load واحدًا، وهو يأخذ
اسم ملف أو قاموس.
لذا دعونا نفعل هذا.
وسأقول فقط to do.
عد إلى ذلك.
ما هي الدالات الأخرى التي كانت موجودة في dictionary.c؟
Check، إذن def check.
وماذا يستغرق check كمدخل؟
كلمة، نعم.
لذلك سنعود إلى هذا وفقط نعود إلى to do هذه.
ما هي الدالات الأخرى؟
الجمهور: Size.
ديفيد مالان: Size كان واحدًا، لذا def size.
هذا لم يأخذ مدخلاً، لكنه أعاد فقط حجم البنية.
إذن سنعود إلى ذلك.
وأخيرًا؟
الجمهور: Unload.
ديفيد مالان: حسنًا، إذن unload.
حسنًا، هذا هو إصدار Python من التعليمات البرمجية الخاص بالتوزيع
للمدقق الإملائي لملف القاموس الخاص بك.
لذا لا يأخذ unload أيضًا وسيطًا.
لذا هذا شيء علينا القيام به، أيضًا.
إذن ما هو مضمون إنشاء مدقق إملائي؟
أنت تقوم بتحميل كلمات في دالة load من ملف القاموس.
والهدف هو تحميل تلك الكلمات بطريقة ما في الذاكرة.
كان لديك قرار تصميم لمجموعة p في C،
حيث يمكنك أن تصنع جدول علامة تجزئة أو محاولة
أو حتى قائمة مرتبطة أو حتى مصفوفة.
لكن الاحتمالات هي أن أول هؤلاء الاثنين هو الأكثر كفاءة.
لذا يتضح أنه في Python، لديك القدرة
لتخزين كلمات بسهولة في أي عدد من بنيات البيانات.
ليس لديك فقط ints وfloats وstrings،
ولكن لديك بوضوح قوائم، كما رأينا.
نحن ندعوها كائنات أو علامات تجزئة، أو جداول علامات التجزئة.
وهناك أشياء غيرها، أيضًا، تُدعى حتى
مجموعات، حيث أن المجموعة هي مجرد مجموعة من الكلمات
والتي ستكون قابلة للبحث بسهولة.
أتعلمون ماذا؟
إذا كنت أريد في النهاية تحميل بعض الكلمات، اسمحوا
لي بإعطاء نفسي متغير عالمي يُدعى كلمات
وتهيئته إلى مجموعة فارغة.
إذن لدي متغير عالمي يُسمى كلمات ولا شيء فيه حتى الآن.
لكنه مجموعة من الكلمات.
كيف يمكنني تحميل كلمات في هذا القاموس؟
حسنًا، دعونا نمضي قدمًا ونقوم بتنفيذ التحميل هنا.
لذا اسمحوا لي بالمضي قدمًا وإعلان متغير يُسمى file وافتح
هذا القاموس في وضع القراءة، تمامًا، كما هو الحال في C.
ثم كيف يمكنني دمج السطور في ملف؟
لم نرَ ذلك.
لكنني أعرف كيفية تكرار السلاسل في مصفوفة
والأرقام في سلسلة.
اسمحوا لي باتباع غريزتي for line in file.
في الواقع، هذا سيفعل بالضبط ما تريده أن يفعل.
ثم اسمحوا لي بالمضي قدمًا وإضافة السطر التالي إلى بنية بيانات الكلمات الخاصة بي.
ثم دعوني أغلق الملف.
ثم اسمحوا لي أن أقول return true لأن كل شيء على ما يرام.
تم.
حسنًا، أنا أختصر بعض الأمور، من الناحية الفنية.
واسمحوا لي باستخدام تلك الدالة التي ألمحت إليها في وقت سابق.
اسمحوا لي بالمضي قدمًا واستدعاء r strip وstrip off
السطر الجديد لأنه في الملف، تقنيًا،
عندما تقرأ في هذه الكلمات، ينتهي كل سطر بخط مائل عكسي صفر.
هذا الآن جزء من الكلمة.
لذا تصحيح طفيف هنا أنني سأتخلص من السطر.
لكن هذا كل شيء بشأن load.
كيف يمكنني الآن معرفة ما إذا كانت كلمة معينة في هذه المجموعة؟
حسنًا، يمكنني فقط القول، if word in words return true.
Else, return false.
تم التحقق.
كيف أعيد حجم بنية البيانات هذه؟
ماذا عن مجرد إعادة طول تلك البنية، والكلمات، ثم
unload--
سحقًا، يقوم Python بكل هذا من أجلي--
تم.
دعوني أُقلص هذا.
وأتعلمون ماذا؟
هذا أكثر إطنابًا قليلاً.
أنا لا أحتاج بالفعل للقيام بـ if else هذه.
يمكنني فقط إعادة كلمة في كلمات وهذا سيعيد تعبيرًا منطقيًا لي.
وبصراحة، إذا كنت أرغب في كتابتها بأحرف صغيرة، هذا سهل.
أستطيع فقط فعل هذا والاعتناء بذلك.
الآن إنه أفضل.
هذة المجموعة الرابعة p.
هل أنتم متحمسون؟
هل تتمنون أننا قمنا بهذا في C؟
إذن ما هو الهدف الأساسي من كل هذا،
لأن الهدف ليس خلق نوعًا من الهموم الثقيلة والتساؤلات الآن.
لكن الهدف الأساسي من تقديم C خلال هذه الأسابيع القليلة الماضية هو،
أولاً، لا شيء من هذا الآن تأخذه على نحو مسلم به.
أعني، قد تتوق إلى تنفيذ هذا في Python.
وربما كان عليك قراءة بعض الوثائق
واكتشاف صيغ مختلفة.
لكن يا إلهي.
لقد قللنا مما يأخذ على الأرجح الكثير من ساعاتك إلى ثوانٍ فقط
بمجرد كونك أكثر اطلاعًا على اللغة.
لكن أيضًا، بالنسبة إلى أول موضوع لدينا اليوم،
بمجرد حصولك على اللغة الصحيحة والأداة المناسبة لهذه المهمة.
الآن، لا يعني هذا أن هذا مثالي، لأنه في الواقع،
دعونا نمضي قدمًا ونقوم ببعض الاختبارات.
دعوني أنتقل إلى النافذة الطرفية الخاصة بي هنا.
وفي الواقع أحضرت الحل الخاص بي في مجلد C الخاص بي هنا.
لنرَ.
لدي التعليمات البرمجية الخاصة بي للمدقق الإملائي الذي تم تنفيذه في C هنا.
ودعوني أمضي قدمًا وأجرى اختبارًا.
دعوني أمضي قدمًا وأشغل المدقق الإملائي على، لنقل، النص شكسبير.
هذا مدخل كبير جدًا.
دعونا نمضي قدمًا وننقر فوق Enter.
وها هو المدقق الإملائي الخاص بي يعمل.
ويتم إخرج كل الكلمات.
وكان الوقت الإجمالي لتشغيل المدقق الإملائي في C، لنقل، 0.9 ثانية.
هذا جيد في الواقع.
في نافذة ثانية، دعوني أذهب لأعلى هنا في نافذة طرفية أخرى.
ودعوني أدخل في التعليمات البرمجية لهذا اليوم وإلى مجلد المدقق الإملائي حيث لدي
إصدار Python سأشغله كالتالي-- speller.py--
دعوني أمضي قدمًا وأقوم بتشغيله على شكسبير.
إذن لم ننظر إلى speller.py.
لكنه في الأساس سطر لسطر، منفذ، ترجمة، من C إلى Python.
لكنه مرحب بك للنظر في ذلك عبر الإنترنت.
وتستخدم ملف dictionary.py الخاص بي.
دعوني أمضي قُدمًا وأشغل ذلك.
إنها تعمل خلال جميع الكلمات.
في الأعلى Python، في الأسفل C. ها نحن ذا.
ها نحن ذا.
الآن، هذا مضلل بعض الشيء لأنه مجددًا، الإنترنت هو الوسيلة.
نستخدام IDE يعتمد على شبكة الإنترنت، وذلك مضحك أنه يظهر مرات عديدة.
وسترى أنها ليست 10، 20 ثانية، مهما كان طول هذا الوقت.
هذا مجرد بطء في الإنترنت.
وكل ما نقوم بتوقيته هو دالاتك في C وPython.
لكن ما هي الفروق بين Python وC؟
المدخلات نفسها.
ماذا ترى؟
أجل؟
الجمهور: كونها أكثر إيجازًا [INAUDIBLE].
ديفيد مالان: نعم، لن أقول الإيجاز.
إنها أكثر جمالية.
إنها أكثر--
الجمهور: [INAUDIBLE] تحديدًا.
ديفيد مالان: حسنًا، ليس حتى هذا، على ما أعتقد.
هذه الإجابات صحيحة.
كلاهما صحيح.
جميع الأرقام الهامة في الأعلى متطابقة.
ولكن ما هو المختلف بطريقة واضحة، على الرغم من ذلك؟
إنها أبطأ.
إذن، تبدو Python أبطأ، صحيح؟
يستغرق الأمر إجماليًا-- إذا نظرنا فقط إلى رقمين--
1.55 ثانية في Python، إذا تجاهلت سرعة الإنترنت
وألقِ نظرة على أداء التعليمات البرمجية، مقابل 0.9.
إذن إنها أبطأ مرتين من C. ما هو الفارق هناك؟
حسنًا، نعم، استغرق الأمر مني، ماذا، 10، 20، 30 ثانية لكتابة التعليمات البرمجية.
لكنها تستغرق مني ضعف الوقت لتشغيلها.
الآن، هذا ليس بالأمر الجلل، بالطبع، عندما نتحدث
عن بضعة ثواني هنا وهناك.
ولكن إذا كانت هذه مجموعة بيانات كبيرة تقوم بتحليلها لبعض المشاريع
أو للعمل أو لأي نوع من مشاريع التحليل والبيانات أكبر بكثير
من هذا-- خاصة في المجال الطبي أو ما شابه--
ربما لا تريد استخدام Python.
بالتأكيد، يمكنك إخراج التعليمات البرمجية في دقائق معدودة، ربما بضع ساعات.
لكن بمجرد تشغيلها، اللعنة، تكون أبطأ من استخدام شيء مثل C.
في حين أنه في C، قد يأخذ الأمر مزيدًا من الوقت مقدمًا.
وقد لا ترتاح مع C بعد الآن
لذا ستستغرق وقتًا أطول لأنك يجب أن تعيد تعلم
اللغة.
لكن عند تشغيلها، رائع، فإنها تعمل مرتين أسرع.
لذا، من المحتمل، أنك تحتاج ذاكرة وصول عشوائي أقل،
أجهزة أقل أو أجهزة أقل تكلفة لأنه يمكنك الوصول إلى المزيد بأجهزة أفضل.
إذن مجددًا، هذا الموضوع الذي نواصل رؤيته في بنيات البيانات والخوارزميات
هو نوع من المقايضات.
مثل، وقت المطور هو مورد ومن الرائع أنني
والآن أنتم سنكون قادرين على كتابة التعليمات البرمجية بسرعة أكبر بكثير.
لكن عليك دفع الثمن بمكان ما.
ومن الواضح أن هناك ثمنًا مع Python.
وليس بسبب أن Python تم تنفيذها بشكل سيئ.
ولكن ما هو الفرق الأساسي بين نموذج
البرمجة في C مقابل Python كما رأيناها اليوم؟
ما هو الفرق؟
أجل؟
الجمهور: [INAUDIBLE] سطر بسطر، بينما C، بشكل أساسي--
[INAUDIBLE] تحسين تشغيله، فإنه سيتم تشغيل [INAUDIBLE]..
ديفيد مالان: بالفعل.
ودعوني أقلبه.
لذا، باستخدام C، تقوم بالتجميع إلى الأصفار والآحاد.
وهذا المجمع ذكي جدًا.
وسيحرك الأمور في الذاكرة.
سيتحدث لغة الكمبيوتر الأصلية من الأصفار والآحاد.
في الواقع، تقرأ Python التعليمات البرمجية الخاصة بك، على النقيض، سطر بسطر، من الأعلى إلى الأسفل،
من اليسار إلى اليمين.
وعلى الرغم من أنه من الناحية التقنية تحت الغطاء يوجد خطوة تجميع،
ومع ذلك هناك بعض التجاوزات المضمنة.
مجرد حقيقة أننا لم نعد نشغّل clang ومن ثم
نحصل على 0 و1 أو نشغّل make ونحصل على أصفار وآحاد، هذا أمر عظيم.
لكن علينا دفع الثمن بمكان ما.
إذن هذا سيكون موضوعيًا.
مثل، ليس هناك كأسًا مقدسة بين اللغات أو الأدوات أو التقنيات.
سيكون هناك مقايضات بين راحتك، أو معرفتك
أو تذكرك للغة، أو مدى سهولة استخدامها،
و مدى سهولة كتابتها، ومدى كفاءتك في
تشغيلها على الشاشة.
ومع C، نأمل الآن-- أننا لن نكتب أي تعليمات برمجية أكثر متعلقة بـ C--
لديكم تقدير في Python عند إنشاء علامة تجزئة--
أو قائمة، بدلاً من ذلك--
أو إذا قمتم بإنشاء مجموعة أو جدول علامة تجزئة أو ما شابه ذلك، ما يمكنك الوصول إليه حقًا
هو تنفيذ شخص آخر للمجموعة
الرابعة p والمجموعة الثالثة p والمجموعة الثانية p والمجموعة الأولى p، في شكل ما،
ولكن الآن يتم عرضهم لك في لغة أكثر قوة وحداثة.
إذن دعونا ننتهي هنا رسميًا اليوم.
وفي الأسبوع المقبل، سنقوم بالشيء ذاته، ولكن في سياق برمجة الويب.