
Arabic: 
[MUSIC PLAYING]
ديفيد مالان: هذه هي دورة CS50،
وهذه هي المحاضرة السادسة.
وستذكرون أننا قدّمنا في الأسبوع 
الماضي برمجة الويب
بطريقة HTML وCSS، أو
على الأقل الكتل البنائية

English: 
[MUSIC PLAYING]
DAVID MALAN: This is CS50
and this is lecture 6.
And you'll recall that last week
we introduced web programming
by way of HTML and CSS, or
at least the building blocks

Arabic: 
لأننا لا نملك القدرة على البرمجة بعد.
إنها مجرد ترميز، HTML وCSS
بتطبيق نمط معين هناك.
ولكن قدّمنا في الأسبوع الماضي هذه الاستعارة
لبروتوكول يُسمى TC/IP.
وقمنا بالطبع،
بربطه، بالظرف.
وكان على هذا الظرف،
بشكل افتراضي، على الجهة الأمامية
جزآن على الأقل من المعلومات.
وإذا كان أي شخص يتذكر
ما هما هذان الجزآن
من المعلومات في مجال إلى؟
شخص آخر لم نستمع
إليه في الآونة الأخيرة؟
أجل؟
الجمهور: عنوان IP.
ديفيد مالان: أجل.
عنوان IP، عنوان رقمي يُحدّد
بشكل فريد جهاز الكمبيوتر الخاص بك
وجهاز الكمبيوتر الخاص بشخص آخر.
وشيء آخر، إذا كنتم تتذكرون.
أوه، هيا.
إنه كما لو كان منذ دقيقتين.
حسنًا.
أجل.
الجمهور: رقم المنفذ.
ديفيد مالان: رقم المنفذ.
إذن رقم آخر، رقم أقصر،
هو مجرد رقم مثل 80 أو 443
يشير إلى HTTP أو
HTTPS، أو أرقام أخرى،
مثل 25 للبريد الإلكتروني وما شابه ذلك.
إذن تتيح لك هذه العناوين
الفريدة معًا إرسال المعلومات
ليس فقط إلى كمبيوتر
محدد، ولكن أيضًا خدمة محددة
تعمل على هذا الكمبيوتر.
ومن أجل طلب معلومات
بالفعل من ذلك الخادم،

English: 
because we don't actually have
the ability to program yet.
It's just markup, HTML and
CSS with stylization thereof.
But we introduced this metaphor last
week of a protocol called TCP/IP.
And we related it to,
of course, an envelope.
And on this envelope,
virtually, on the front
was at least two pieces of information.
And if anyone remembers
what were those two
pieces of information in the to field?
Someone else who we
didn't hear from recently?
Yeah?
AUDIENCE: An IP address.
DAVID MALAN: Yeah.
An IP address, a numeric address that
uniquely identifies your computer
and someone else's computer.
And one other thing, if you remember.
Oh, come on.
It was like two minutes ago.
OK.
Yeah.
AUDIENCE: A port number.
DAVID MALAN: A port number.
So another number, shorter number,
that's just a number like 80 or 443
referring to HTTP or
HTTPS, or other numbers,
like 25 for email and the like.
And so together these unique addresses
allow you to send information
to not only a specific
computer, but a specific service
running on that computer.
And in order to actually request
information from that server,

Arabic: 
فهناك بروتوكول آخر يُسمى
HTTP، بروتوكول نقل النص التشعبي.
هذا هو ما بداخل الظرف.
لذلك عندما يقوم الخادم
بفتحه، بشكل مجازي،
يبدو في الداخل، هذا هو الأمر الذي يقرأه
ذلك الخادم لكي يقرر
ما هي الطريقة التي يجب أن يستجيب بها بالفعل.
ولذلك فإن هذا الطلب هنا
يُخبر الخادم--
والمعروف كـ www.example.com
في هذا المثال المُحدّد--
ليقوم بإرسال ما بداخل
الظرف الخاص به بالضبط إليّ
وجهاز الكمبيوتر المحمول الخاص بي إذا طلبتُ ذلك؟
الجمهور: صفحة ويب محددة.
ديفيد مالان: صفحة ويب محددة.
وشخص آخر، أي صفحة ويب تحديدًا، بشكل افتراضي؟
الجمهور: الفهرس.
ديفيد مالان: نعم، إذن index.html،
الذي تحدثنا عنه الأسبوع الماضي
فقط يميل إلى أن يكون اسم الملف
الافتراضي على خادم صفحة الويب
التي تم تحديدها للتو بشكل افتراضي.
ولا تتعين تسميتها بهذا،
ولكنه تقليد بشري.
وبقية هذا عبارة عن فعل
يقول فقط، حرفيًا، أعطني ذلك الملف.
هذا فقط يخبر الخادم
أي إصدار من HTTP
أنا أتحدث به حتى يمكن للبشر تحسينه
وترقيته مع مرور الوقت.
ولكن هذا سيخبر الخادم
بأن يعيد index.html.

English: 
there's this other protocol called
HTTP, Hypertext Transfer Protocol.
This is what's inside of the envelope.
So when the server opens
it up, metaphorically,
looks inside, this is the command that
that server reads in order to decide
what it should actually respond with.
And so this request here
is telling the server--
otherwise known as www.example.com
in this particular example--
to send back what exactly
in its own envelope to me
and my laptop if I were to request this?
AUDIENCE: A specific web page.
DAVID MALAN: A specific web page.
And someone else, which web
page specifically, presumably?
AUDIENCE: Index.
DAVID MALAN: Yeah, so index.html,
which we said last week
just tends to be the default file
name on a server for a web page
that's just selected by default. And
it doesn't have to be called this,
but it's a human convention.
And the rest of this is just a verb
saying, literally, get me that file.
This is just telling the
server what version of HTTP
I speak so that humans can improve
it and upgrade it over time.
But this would tell the
server to return index.html.

Arabic: 
وفي الوقت نفسه، رأينا المزيد
من get queries المتطورة
عندما بدأنا التحدث عن
Google، وأي موقع ويب
ليس لديه فقط واجهة تطبيق، مثل
HTML وCSS، ولكن أيضًا واجهة خلفية.
والواجهة الخلفية هي حيث
يوجد المنطق، حيث يوجد الخادم،
والعمل المثير للاهتمام، في نهاية المطاف.
ولذلك يشير هذا الخط
المائل search إلى بعض البرامج
التي تعمل على خوادم
Google من الأسبوع الماضي
والتي ببساطة تستجيب للطلبات.
وما الذي تفعله أو تمثله علامة الاستفهام q
تساوي cats في هذا الإثبات؟
الجمهور: مدخل المستخدم.
ديفيد مالان: نعم، مدخل المستخدم.
إذن تقول علامة الاستفهام فقط، أن هذا كل
شيء عن اسم الملف أو عنوان URL.
ها هو مدخل المستخدم.
Q هو حرفيًا معلمة
HTTP أو المدخل
الذي قرر لاري وسيرغي،
مؤسسا Google،
قبل 20 عامًا أن يمثل
مدخل المستخدم، q لـ query.
علامة يساوي تعني فقط أن query
التي كتبها البشر كانت قطط.
ولكن لا يتعين على
الشخص كتابة هذا.
بمجرد فهمك لبروتوكول HTTP، إذا أردت
حقًا أن تكون خبيرًا،
يمكنك الانتقال إلى
www.google.com/search؟q=cats وسيحث

English: 
Meanwhile, we saw more
sophisticated get queries
when we started talking about
Google, and any website that
has not just a front end, like
HTML and CSS, but also a back end.
And a back end is where the
logic is, where the server is,
and the interesting work, ultimately.
And so this slash search
indicates some kind
of software running on Google
servers as of last week
that's simply responds to requests.
And what did question mark q equals cats
do or represent in that demonstration?
AUDIENCE: User input.
DAVID MALAN: Yeah, user input.
So the question mark just says, that's
it for the file name or the URL.
Here comes the user's input.
Q is just literally the
HTTP parameter or input
that Larry and Sergey,
founders of Google,
20 years ago decided would represent
the user's input, q for query.
Equal just means that query that
the human typed in was cats.
But the human doesn't
even have to type this in.
Once you understand HTTP, if you
really wanted to be kind of a nerd,
you could go to
www.google.com/search?q=cats and it

Arabic: 
البحث من أجلك
لأنه في نهاية اليوم،
هذا كل ما يقوم به المتصفح.
عندما تكون لديك أشكال الويب هذه
التي لديك القدرة الآن على إنشائها،
فقط تقوم بالتشغيل التلقائي لعملية
إنشاء رسائل HTTP هذه.
الآن، آمل أن يستجيب الخادم
برسالة لم تروها من قبل بالفعل،
HTTP 200، وهو حرفيًا يعني موافق.
بالطبع، لقد رأى الكثير منا أرقامًا
تظهر بخلاف 200، مثل ماذا؟
404، والذي يعني؟
لم يتم العثور على الملف.
الآن، لماذا قرر الأشخاص
منذ سنوات إخبار
أشخاص آخرين ما الذي تعنيه
التعليمة البرمجية الرقمية هذه، وأعني،
أن هذا تفصيل غير مثير للاهتمام.
لكن العالم، لأي سبب من الأسباب،
قد كشف عنه في العديد من مواقع الويب 404.
لكن هذا يعني الأمر نفسه.
كل شيء ليس على ما يرام.
لم يتم العثور على ملف.
قد ترون شيئًا آخر مثل هذا.
لقد رأينا هذا بجامعة هارفارد،
في الواقع، بصورة غريبة،
أن هارفارد انتقلت بشكل دائم.
الآن، كانت هافارد تستجيب لطلبات
معينة باستخدام HTTP 301
من أجل تحقيق
أي ميزة أو تأثير؟
لماذا؟
أجل.
الجمهور: عمليات إعادة التوجيه.
ديفيد مالان: عمليات إعادة التوجيه.

English: 
would induce the search for you
because at the end of the day,
that's all the browser is doing.
When you have these web forms that
you now have the ability to create,
it's just automating the process
of generating these HTTP messages.
Now, the server hopefully responds with
a message you never, ever actually see,
HTTP 200, which literally means OK.
Of course, many of us have seen numbers
other than 200 appear, like what?
404, which means?
File not found.
Now, why the humans
decided years ago to tell
other humans what that
numeric code is, I mean,
that is an uninteresting detail.
But the world, for whatever reason,
has revealed in many web sites 404.
But it just means the same thing.
Everything is not OK.
A file was not found.
You might see something else like this.
We saw this with Harvard,
in fact, curiously,
that Harvard had moved permanently.
Now, Harvard was responding to
certain queries with HTTP 301s
in order to achieve
what feature or effect?
Why?
Yeah.
AUDIENCE: Redirections.
DAVID MALAN: Redirections.

Arabic: 
إذن هذه هي طريقة
ذات مستوى منخفض لوصف ذلك.
لكن 301، على الرغم من أنه 
يقول تم النقل بشكل دائم،
وهو تلميح فني أكثر
للمتصفح قائلاً،
تم نقل هارفارد ليس إلى
أي عنوان URL جئت منه للتو،
ولكن إلى عنوان URL هذا على وجه التحديد.
والآن، ربما كانت جامعة هارفارد على الأرجح، إذا
تتذكرون، أعادت توجيهي من أي عنوان URL؟
إذا لم أكن بالفعل في عنوان
URL هذا، فأين قد أكون؟
ربما نقطة com، إذا كانت لديهم بالفعل
مجالات متعددة وكانوا يعيدون التوجيه.
ربما ينجح هذا.
ماذا أيضًا؟
أجل.
الجمهور: HTTP فقط.
ديفيد مالان: أجل.
ربما قمت للتو بكتابة HTTP، 
وتريد هارفارد، لأسباب أمنية،
إجبار المتصفح الخاص بي على
طلب هذه الصفحة مجددًا عبر HTTPS.
أحيانًا قد يضيف موقع ويب
www إذا لم تكتبتوها،
أو يمكن أن تتم إعادة توجيهكم إلى أي مكان.
في الواقع، إذا انتقلتم إلى موقع ويب
دورة CS50 عن طريق كتابة CS50.harvard.edu فقط،
شاهدوا عنوان URL.
ستتم إعادة توجيهكم إلى صفحة
محددة أكثر، بحسب فترة السنة.
إذن نحن نستخدم هذه الخدع، أيضًا.
قد يبدو 404 غير موجود 
هكذا، ولكن توجد بشكل

English: 
So this is kind of a low-level
way of describing it.
But 301, even though it
says moved permanently,
that's a more technical
hint to the browser saying,
Harvard moved not to whatever
URL you just came from,
but to this URL specifically.
And now Harvard was probably, if you
recall, redirecting me from what URL?
If I wasn't already at that
URL, where might I have been?
Maybe dot com, if they actually own
multiple domains and were redirecting.
That could work.
What else?
Yeah.
AUDIENCE: Just HTTP.
DAVID MALAN: Yeah.
Maybe I just typed in HTTP, and
Harvard, in the interest of security,
wants to force my browser to
request this page again via HTTPS.
Sometimes a website might prepend
the www if you haven't typed it in,
or you can be redirected most anywhere.
In fact, if you go to CS50's own
website by just typing CS50.harvard.edu,
watch the URL.
You'll be redirected to a more specific
page, depending on the time of year.
So we use these tricks, as well.
404 not found might look
like this, but inside deeper

English: 
of that metaphorical envelope is
the actual contents of the web page.
So you get back not
only these HTTP headers,
as they're called, in the top
of the response, so to speak,
but you also get back HTML, yet
another language we looked at,
this one actually a language,
but not a programming language.
These tags tell the browser
exactly what to do and to render.
We introduced this style tag, though.
What did that allow us to
do that HTML alone did not?
Yeah.
Use CSS to beautify the
site and just make it nicer.
HTML, for the most
part, is about structure
and about tagging the contents
of your web page in a way
that the browser finds helpful.
But CSS is really for the user's
benefit, at the end of the day,
and his or her eyes,
because it really lets
you control font size and
positioning and lower-level stuff
that you might have started tinkering
with with the most recent problem set.
Now, we'd proposed that
you probably shouldn't just
start typing CSS inside
of your HTML page
because it's just a little harder
to maintain as your examples get
more sophisticated.
So you might factor it out.

Arabic: 
أعمق داخل هذا الظرف المجازي 
المحتويات الفعلية لصفحة الويب.
إذن تعيدون ليس
فقط رؤوس HTTP هذه،
كما تُسمى، في الجزء العلوي
من الاستجابة، إذا جاز التعبير،
ولكن يمكنكم أيضًا إعادة HTML، ولغة
أخرى تحدثنا عنها،
هذه في الواقع لغة،
ولكنها ليست لغة برمجة.
تخبر هذه العلامات المتصفح
بالضبط ما سيقوم به وسيقدمه.
لقد قدّمنا علامة النمط هذه، على الرغم من ذلك.
ما الشيء الذي تتيحه لنا هذه
للقيام به والذي لا تقوم به HTML بمفردها؟
نعم.
استخدم CSS لتجميل 
الموقع وجعله أجمل فقط.
HTML، بالنسبة لمعظم
الجزء، هو حول البنية
وحول وضع علامات على محتويات
صفحة الويب الخاصة بك بطريقة ما
يجدها المتصفح مفيدة.
لكن CSS مخصصة حقًا لمصلحة 
المستخدم، في نهاية اليوم،
وعينه أو عينها،
لأنها تتيح لك بالفعل
التحكم في حجم الخط والموضع
والأشياء ذات المستوى المنخفض
التي قد بدأتَ في العبث بها
باستخدام أحدث مجموعة مشاكل.
الآن، كنا سنقترح
أنه ربما لا يجب أن
تبدأوا كتابة CSS فقط داخل
صفحة HTML الخاصة بكم
لأنه من الصعب إلى حد ما 
الاحتفاظ بها لأن أمثلتكم
تصبح متطورة أكثر.
لذلك قد تستبعدوها.

Arabic: 
والاحتمالات التي قمت بها
لمجموعة المشاكل
هذه عند إنشاء صفحة
رئيسية، إذا كانت لديكم أنماط CSS
نفسها عبر ملفات متعددة، ستكون
سخيفة وغير فعّالة لنسخها
ولصقها مرارًا وتكرارًا
بينما يمكنكم استبعادها هكذا.
وفي النهاية، نظرنا في
JavaScript، آخر مرة،
لغة برمجة أخرى
وهي متشابهة للغاية
عند رؤيتها، للوهلة الأولى على الأقل.
لكنها في الواقع تتخلص من
الكثير من آلام الصداع ذات المستوى
المنخفض مثل المؤشرات 
وعناوين الذاكرة والتي
عانينا منها
في الأسابيع الأخيرة.
لكن الأهم هو كيف قمنا باستخدامها.
إذن يمكنكم التفكير في صفحة ويب مثل
هذه بمجرد تحميلها بواسطة المتصفح الخاص بكم
كبنية شجرة فقط.
فكروا في ما قمنا به في أسابيع
مناقشتنا لبنية البيانات
وكل هذه العُقد في الشجرة التي
رأيناها في JavaScript التي يمكن معالجتها.
وعبر هذا المبدأ 
البسيط جدًا، نكتب
التعليمة البرمجية التي تقوم بتعديل هذه الشجرة
الموجودة في ذاكرة المتصفح،
وهذا يعني أنه يمكنكم إنشاء أشياء
ديناميكية أكثر مثل Gmail وFacebook
وأي عدد من مواقع الويب
التي تتغير باستمرار.
لم تقوموا بهذا بعد
في مجموعة المشاكل.
لقد قمتم فقط بإنشاء صفحات ويب 
ثابتة باستخدام HTML وCSS التي تم ترميزها بشكل ثابت.

English: 
And odds are you did
this for the problem
set because when making a home
page, if you have the same CSS
styles across multiple files, it would
be pretty silly and inefficient to copy
and paste them again and again when
you can factor them out like this.
Lastly, we looked at
JavaScript, last time,
another programming language
that's super similar
to see, at least at first glance.
But it actually gets rid
of a lot of the lower level
headaches like pointers and
memory addresses and that
that we've struggled
with in recent weeks.
But most important was how we used it.
So you can consider a web page like
this as once it's loaded by your browser
as just being a tree structure.
Thinking back a couple of weeks to
our discussion of data structures
and each of these nodes in the tree we
saw in JavaScript can be manipulated.
And via that very simple
principle, writing
code that modifies this existing
tree in the browser's memory,
means you can make much more dynamic
things like Gmail and Facebook
and any number of websites
that are constantly changing.
You did not do this yet
for the problems set.
You made static web pages just
by hard coding HTML and CSS.

English: 
But starting next week, once we have,
thanks to this week, the vocabulary
of Python will you start
to make things more dynamic
and then even bring back
into play JavaScript,
bringing all of these
various threads together.
And to include the JavaScript, recall,
we used either a script tag at the top
or refactored it out to a file.
Or in some cases, it's
necessary or beneficial
to move it down to the bottom of
the file or factor it out like that,
but more on that down the road.
So any questions on last week or
on HTTP, HTML, CSS, or TCP/IP?
No?
Anything at all?
Oh, yeah?
AUDIENCE: So in what case
would you put the script
tag up at the top [INAUDIBLE]
DAVID MALAN: Good question.
So in what cases would you put
the script tag up at the top
versus at the bottom?
If the code you're writing
in JavaScript manipulates
the DOM, the tree that I had on
the screen just a moment ago,
the catch is that that tree needs
to exist when your code is executed.

Arabic: 
ولكن سنبدأ في الأسبوع المقبل، وبمجرد أن يتوفر
لدينا بفضل هذا الأسبوع، مفردات
python ستبدأون
في جعل الأشياء ديناميكية أكثر
ومن ثم إعادة
تشغيل JavaScript،
وجمع كل مؤشرات
الترابط هذه معًا.
ولكي نقوم بتضمين JavaScript، تذكرون،
أننا استخدمنا علامة نص في الأعلى
أو قمنا بطرحها من ملف.
أو في بعض الحالات، إنه
لمن الضروري أو المفيد
أن ننقلها إلى أسفل
الملف أو نطرحها هكذا،
ولكن المزيد عن هذا لاحقًا.
إذن هل هناك أي أسئلة بشأن الأسبوع الماضي أو
على HTTP، أو HTML، أو CSS، أو TCP/IP؟
لا؟
لا شيء على الإطلاق؟
أوه، نعم؟
الجمهور: إذن في أي حالة 
ستقوم بوضع علامة
النص في أعلى [INAUDIBLE]
ديفيد مالان: سؤال جيد.
إذن في أي الحالات سأضع
علامة النص في الأعلى
أم في الأسفل؟
إذا كانت التعليمة البرمجية التي
تكتبها في JavaScript تعالج
dOM، الشجرة التي كانت موجودة على
الشاشة منذ قليل،
المغزى هو أن هذه الشجرة تحتاج إلى
أن تكون موجودة عندما يتم تنفيذ تعليمتك البرمجية.

English: 
So if you, for instance, have JavaScript
code up here in the head of your page,
but the nodes in the
tree, the tags that you
want to manipulate in changing
things to red to green to blue
like we did last week, or making things
blank, are down here in the page,
you can't write your code up here
and have it change things in the page
down here because it's
happening out of order.
So similar in spirit to C where things
have to happen in the right order,
if you want to change
something down here,
your code needs to at
least be down here,
or you need to use some
fancier techniques to say,
I'm going to write my code up
here but wait a few seconds
before executing it until
the whole webpage is loaded.
So for most of the examples we
looked at, this was not an issue.
But we'll come back to
this perhaps before long.
All right, so let's now
take the same approach
that we did last time of introducing
one language by way of another.
You'll recall, of course, that we
started the whole semester with Scratch
and then we transitioned a few
weeks back now to C. Last week
we made some comparisons
with JavaScript.
Let's do the same thing
briefly with Python
but then spend more time at the
keyboard comparing the two to see

Arabic: 
لذلك، إذا كانت لديك على سبيل المثال، تعليمة
JavaScript البرمجية هنا في مقدمة صفحتك،
لكن العُقد في 
الشجرة، العلامات التي تريد
معالجتها لتغيير
الأشياء إلى اللون الأحمر إلى الأخضر إلى الأزرق
مثلما فعلنا في الأسبوع الماضي، أو جعل الأشياء
فارغة، وموجودة في أسفل الصفحة هنا،
لا يمكنك كتابة تعليمتك البرمجية هنا
وجعلها تغير الأشياء في أسفل الصفحة
هنا لأن الأمر
يحدث دون ترتيب.
إذن تبدو متشابهة جوهريًا للغة C حيث يجب أن تحدث 
الأشياء بالترتيب الصحيح،
إذا أردتم تغيير
شيء ما في الأسفل هنا،
تحتاج تعليمتكم البرمجية إلى
أن تكون هنا على الأقل،
أو تحتاج إلى استخدام بعض
التقنيات الأفضل لقول،
سأقوم بكتابة تعليمتي البرمجية في الأعلى
هنا ولكن انتظروا بضع ثوانٍ
قبل تنفيذ ذلك حتى
يتم تحميل صفحة الويب بأكملها.
إذن بالنسبة لمعظم الأمثلة التي
ألقينا نظرة عليها، لم يكن هذا الأمر يمثل مشكلة.
لكننا سنعود إلى
هذا ربما قريبًا.
حسنًا، إذن دعونا الآن
نتبع النهج نفسه
الذي قمنا به آخر مرة لتقديم
لغة واحدة باستخدام طريقة أخرى.
ستتذكرون، بالطبع، أننا
بدأنا الفصل الدراسي بأكمله بسكراتش
وبعد بضعة أسابيع
انتقلنا إلى لغة C. وقمنا الأسبوع الماضي
ببعض المقارنات
مع JavaScript.
دعونا نفعل الشيء نفسه
باختصار مع Python
ولكن بعد ذلك، نقضي وقتًا أطول على
لوحة المفاتيح لنقارن بين اللغتين لرؤية

Arabic: 
ما هو الاختلاف بينهما في الواقع.
إذن لماذا في لغة
أخرى، مع ذلك، أولاً؟
لدينا سكراتش، ولغة C، وJavaScript،
وPython، بخلاف HTML وCSS
لأغراض مختلفة.
على سبيل المثال، لماذا لدينا كل
هذه اللغات بالفعل؟
لماذا لم يقرر البشر فقط، أن هذا كل
شيء، نحن جميعًا نستخدم سكراتش؟
نستخدم جميعًا لغة C أو
JavaScript أو Python؟
ما هو الحدس
الذي من المحتمل، أن يكون وراء ذلك؟
لماذا يوجد عدد كبير من اللغات اللعينة هناك،
بخلاف هذه اللغة؟
أجل؟
الجمهور: [INAUDIBLE]
ديفيد مالان: قُل ذلك مجددًا؟
الجمهور: اللغات المختلفة
مفيدة لأشياء مختلفة.
ديفيد مالان: نعم، اللغات المختلفة
مفيدة لأشياء مختلفة.
وهذا من المحتمل أن يكون دون القول
لشيء مثل سكراتش، أليس كذلك؟
إنه أمر مرئي جدًا.
وبياني ومتحرك جدًا.
يبدو منطقيًا أن قطع اللغز--
أو أن اللغة نفسها
مبنية على قطع اللغز
والسحب والإسقاط.
إذن ربما يتم تخصيص اللغات
لتطبيقات معينة.
ولكن هل هذا صحيح بالنسبة للغة C،
وPython، وJavaScript،
وهي جميعًا لغات قائمة على النص سنراها؟
الجمهور: [INAUDIBLE]
على سبيل المثال، هي
مستويات مختلفة من التجريد.
ديفيد مالان: حسنًا.

English: 
what actually is different about these.
So why in another
language, though, first?
We have Scratch, C, JavaScript,
Python, not to mention HTML and CSS
for different purposes.
Like, why do we have all of
these darn languages already?
Why didn't humans just decide,
that's it, we're all using Scratch?
We're all using C or
JavaScript or Python?
What's, perhaps, the
intuition behind that?
Why are there so many damn languages,
not to mention in this one course?
Yeah?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Say once more?
AUDIENCE: Different ones are
good for different things.
DAVID MALAN: Yeah, different ones
are good for different things.
And this probably goes without saying
for something like Scratch, right?
It's so visual.
It's so graphical and animated.
It makes sense that the puzzle pieces--
or that the language itself
is based on puzzle pieces
and dragging and dropping.
So maybe languages are tailored
to certain applications.
But is that true for C,
Python, and JavaScript, which
are all text-based languages we'll see?
AUDIENCE: [INAUDIBLE]
for example, they're
different levels of abstraction.
DAVID MALAN: OK.

Arabic: 
مستويات مختلفة من التجريد.
الجمهور: لغة C هي [INAUDIBLE]
تتعامل بالفعل مع الكثير من الأشياء التي
لا يجب أن تفكر فيها في Python--
ديفيد مالان: جيد.
الجمهور: -- حيث يتم الاعتناء بهذه الأنواع
من الأشياء من أجلك،
مثل تخصيصات الذاكرة وهكذا.
ولذا اعتمادًا على أي مستوى
تجريد تريد العمل عليه
وأي الأجزاء التي تريد معالجتها.
ديفيد مالان: حسنًا، جيد.
تبدو إعادتها إلى
التجريد أمرًا منطقيًا.
لدى لغة C، في الواقع، ذات المستوى المنخفض جدًا، حرفيًا
القدرة على معالجة الذاكرة
وعبر المؤشرات وما إلى ذلك.
وهذا أمر عظيم لأنه يمكنك القيام
بأي شيء تريده في الكمبيوتر.
لكن يصاحبها خطر
كبير وتكلفة كبيرة.
السبب الأول، التكلفة هي وقت الشخص.
والأمر مؤلم فقط لكتابة
هذا النوع من التعليمة البرمجية أحيانًا.
والثاني، أنها تُعد أيضًا مخاطرة كبيرة لأنه إذا
ارتكبت خطأ ما، حتى لو كان خطأ بسيطًا،
فقد يتعطل الكمبيوتر بأكمله.
ونحن لم نرى
أمثلة على ذلك، ولكن قد
تقوموا بإنشاء تعليمتكم البرمجية
بحيث تكون عُرضة لمتسلل
إذا كان قادرًا أو كانت قادرة على استغلال
خطأ متعلق بالذاكرة بطريقة ما
وقراءة جميع كلمات المرور في
برنامجكم، أو شيء من هذا القبيل.

English: 
Different levels of abstraction.
AUDIENCE: C is very [INAUDIBLE] actually
dealing with a lot of things that you
don't have to think about in Python--
DAVID MALAN: Good.
AUDIENCE: --where these sort of
things are taken care of for you,
such as memory allocations and so on.
And so depending on what level of
abstraction you want to work on
and what parts you want to manipulate.
DAVID MALAN: OK, good.
Bringing it back to
abstraction does make sense.
C is, indeed, very low level, literally
having the ability to manipulate memory
and via pointers and so forth.
And that's great because you can do
anything you want with the computer.
But it comes at great
risk and great cost.
One, the cost is human time.
It's just painful to write
that kind of code sometimes.
Two, it's also very risky because if you
make a mistake, even a simple mistake,
the whole computer can crash.
And we didn't see
examples of this, but you
can make your code
vulnerable to a hacker
if he or she is able to somehow
exploit a memory-related bug
and read all of the passwords in
your program, or something like that.

English: 
So with great power comes
great responsibility
is kind of the mantra of C down here.
But JavaScript we saw allows us to
do things a little more high-level.
There were no pointers.
There was no memory.
We didn't talk about
things at that level.
We talked about things
at the level of a tree,
a DOM in memory and changing colors and
positioning of things on the screen.
And that's, indeed, a higher level.
Now, Python is not
necessarily even web-centric.
It's more of a multi-purpose language.
People use Python to write
command-line programs,
like we will soon, at the keyboard,
like we've been doing with C.
You can also, though,
use it, as we'll see
next week, to generate other languages.
So next week we will
write code in Python,
the language we're about to see,
to generate another language, HTML
and CSS.
Some of you probably noticed in your
homepages that you had some redundancy.
You probably had similar
tags or similar structure,
maybe a similar menu across pages.
Python and other languages
will let us factor that
out and generate those
commonalities a lot more
easily, among many other things.
And it's also arguably
easier and faster to write

Arabic: 
إذن تعد مقولة القوّة الوافرة تصحبها
مسؤوليّة كبيرة
شعار لغة C إلى حد ما في الأسفل هنا.
لكن JavaScript التي رأيناها تتيح لنا 
القيام بأشياء على مستوى أعلى قليلاً.
لم تكن هناك مؤشرات.
لم تكن هناك ذاكرة.
لم نتحدث عن
أمور في ذلك المستوى.
تحدثنا عن أشياء
في مستوى الشجرة،
dOM في الذاكرة وتغيير الألوان وموضع 
الأشياء على الشاشة.
وهذا، في الواقع، مستوى أعلى.
الآن، لا ترتكز Python 
بالضرورة على الويب.
إنها أكثر من لغة متعددة الأغراض.
يستخدم الأشخاص Python
لكتابة برامج سطر الأوامر،
مثلما سنفعل قريبًا، على لوحة المفاتيح،
كما كنا نفعل باستخدام لغة C.
يمكنكم أيضًا، على الرغم من ذلك،
استخدامها، كما سنرى
الأسبوع المقبل، لإنشاء لغات أخرى.
إذن في الأسبوع المقبل 
سنكتب تعليمة برمجية في Python،
اللغة التي نحن بصدد رؤيتها،
لإنشاء لغة أخرى، HTML
وCSS.
ربما لاحظ البعض منكم في الصفحة
الرئيسية أن لديكم بعض التكرار.
ربما كانت لديكم علامات
متشابهة أو بنية متشابهة،
ربما قائمة متشابهة عبر الصفحات.
ستتيح لنا Python 
واللغات الأخرى استبعاد
ذلك وإنشاء تلك القواسم
المشتركة بسهولة
أكثر، ضمن أشياء أخرى كثيرة.
وكما يمكن القول أنها
أسهل وأسرع في الكتابة

English: 
because it comes with so many more
features, as we will soon see.
So in fact-- you know what?
Let me do this.
Let me go ahead and open up CS50 IDE.
Let me go ahead and create a new file.
And out of curiosity,
of our recent problem
sets, what was maybe among the most
challenging programs you've written?
AUDIENCE: Crack.
DAVID MALAN: OK, crack was a good one.
What else?
AUDIENCE: Resize.
DAVID MALAN: Resize, recover.
Yeah, definitely the forensics ones.
And more people probably
did recover and resize.
So let's take resize, for example.
So let me go ahead and write a program
in a file called resize.py for Python,
instead of .c, and see if we can't
spend, what, few hours, couple days,
as you probably did in
C, implementing resize.
Well, let me go ahead and do this.
I'm going to go ahead and--
let's see.
First I'm going to import some
features that just come with Python.
And I'm going to go ahead
and say from sys import argv.
And I'm going to go ahead and
also do from pil import image.
Don't know yet what these are.
We'll tease this apart in a moment.
But then let me just do a check.

Arabic: 
لأنها تأتي مع العديد من
الميزات، كما سنرى قريبًا.
إذن في الواقع-- أتعرفون ماذا؟
دعوني أقوم بهذا.
دعوني أمضي قُدمًا وأفتح CS50 IDE.
دعوني أمضي قدمًا وأقوم بإنشاء ملف جديد.
وبدافع الفضول،
من مجموعات المشاكل
الأخيرة لديكم، ما الذي من المحتمل أن يكون ضمن
أكثر البرامج صعوبة التي قمتم بكتابتها؟
الجمهور: الكراك.
ديفيد مالان: حسنًا، كان الكراك فكرة جيدة.
ماذا أيضًا؟
الجمهور: تغيير الحجم.
ديفيد مالان: تغيير الحجم، الاسترداد.
نعم، بالتأكيد التحليلات الجنائية.
ومن المحتمل أن أشخاصًا آخرين قاموا
بالاسترداد وتغيير الحجم.
لذلك دعونا نقوم بتغيير الحجم، على سبيل المثال.
إذن دعوني أمضي قدمًا وأكتب برنامجًا
في ملف يُسمى resize.py للغة Python،
بدلاً من لغة .C، ونرى إذا كان لا يمكننا
قضاء، ماذا، بضع ساعات، يومين،
كما فعلتم على الأرجح في
لغة C، تنفيذ تغيير الحجم.
حسنًا، دعوني أمضي قدمًا وأقوم بذلك.
سأمضي قدمًا و--
لنرى.
أولاً سأقوم باستيراد بعض
الميزات التي تأتي فقط مع Python.
وسأمضي قدمًا
وسأقول من sys قم باستيراد argv.
وسأمضي قدمًا 
وأقوم أيضًا من pil باستيراد صورة.
لا أعرف بعد ما هي هذه.
سنقوم بتقسيم هذا في غضون لحظات.
لكن بعد ذلك دعوني فقط أجري فحصًا.

Arabic: 
إذا كان طول --
بدلاً من ذلك، إذا كان طول
argv لا يساوي 4،
سأمضي قدمًا وأخرج من
المستخدم وأقول إن استخدام هذا البرنامج
هو Python resize.py
وinfile، وoutfile.
إذن على الرغم من أنه يجب أن يبدو بعض هذه
مشفرًا في الوقت الحالي،
هناك بعض القواسم المشتركة--
argv، تذكرون، من لغة C،
وسلسلة الاستخدام هذه التي قمنا 
بطباعتها كلما حدث أي شيء خاطئ.
هذا يبدو مشابهًا جدًا وبشكل جوهري للغة C.
وما الذي فعلناه في تغيير الحجم؟
إذا قمتم بتنفيذ تغيير الحجم،
مثل الإصدار الذي اعتدتم عليه بشكل أقل،
لزيادة حجم الأشياء، فمن المحتمل أنكم
قد أعلنتم عن متغير مثل n
ويساوي sys--
أو بالأحرى، argv قوس
واحد للوصول إليه.
سأمضي قدمًا وأقوم بتحويل
ذلك أو صب ذلك إلى int.
من المحتمل أنه كان لديكم متغير infile
الذي يمنح الوصول إلى argv 2.
من المحتمل أنه كان لديكم متغير outfile
الذي يمنح الوصول إلى argv 3،
وهكذا.
وتبين أنه في
Python، أتعرفون ماذا؟
يمكنني بالفعل استخدام مكتبة، التعليمة البرمجية
التي كتبها أشخاص آخرون.
دعوني أنتقل إلى متغير
يُسمى inimage، مثل infile.
هذا هو inimage الخاص بي.

English: 
If the length of--
rather, if the length of
argv does not equal 4,
I'm going to go ahead and exit for the
user and say the usage of this program
is Python resize.py
and in file, out file.
So even though some of this
should look cryptic at the moment,
there's some commonalities--
argv, you recall, from C,
and this usage string that we printed
out whenever anything went wrong.
That looks very similar in spirit to C.
And what did we do in resize?
If you implemented resize,
like the less comfy version,
to increase the size of things, you
probably declared a variable like an
and got sys--
or rather, argv bracket
one to get access to it.
I'm going to go ahead and convert
that or cast that to an int.
You probably had an infile variable
that gave you access to argv two.
You probably had an out file variable
that gave you access to argv three,
and so forth.
And it turns out in
Python, you know what?
I can actually use a library, code
that other people have written.
Let me come up with a variable
called in image, like infile.
This is my input image.

English: 
And that's going to equal
image.open because I
want to open this thing called infile.
And then the width--
let me get the width and the
height of the existing image
by doing input image.size.
And then let me go ahead and make a
new image-- out image, I'll call it--
which is going to equal the input
image calling a resize function
and doing the width times n, which is
the number the human probably typed in,
and height times n, which is
the number the human typed in.
Then let me go ahead and just
save the outfile as follows.
Outfile, OK.
Done.
Problem set three.
Tada.
OK, either really exciting or
really, really disheartening perhaps.
So with the right language,
as you say, can you
solve problems so much more easily.
Now, I'm being a little
disingenuous because I'm also
leveraging what's called a library.
And we had access to these
in C. And undoubtedly
we could have dug a little
deeper on the internet

Arabic: 
وسيساوي
image.open لأنني
أريد فتح هذا الشيء الذي يُسمى infile.
ومن ثم العرض--
دعوني أحصل على عرض 
وطول الصورة الموجودة
عن طريق كتابة inimage.size.
ومن ثم دعوني أمضي قدمًا وأقوم بإنشاء صورة
جديدة-- سأطلق عليها، outimage--
والتي ستساوي inimage
الذي يستدعي دالة تغيير الحجم
والقيام بكتابة العرض ضرب n، والذي يكون 
الرقم الذي ربما كتبه الشخص،
والطول ضرب n، والذي يكون
الرقم الذي كتبه الشخص.
ثم دعوني أمضي قدمًا
وأحفظ outfile على النحو التالي.
Outfile، حسنًا.
تم.
مجموعة المشاكل الثالثة.
مفاجأة.
حسنًا، هي مثيرة حقًا أو
مثبطة للهمم جدًا، جدًا، ربما.
إذن، وباستخدام اللغة الصحيحة،
كما تقولون، هل يمكنكم
حل المشاكل بسهولة أكثر.
الآن، أنا مخادع قليلاً
لأنني أيضًا
استفدت مما يُطلق عليها مكتبة.
ووصلنا إلى هذه
في لغة C. وبدون شك
يمكننا أن نبحث بشكل أعمق
على شبكة الإنترنت

English: 
into other people's available code and
found maybe a library for bitmap files.
But notice that there is no
dealing with padding now.
There's no dealing with arrays.
There's no dealing with memory because
I'm using the right tool for the job.
And if I wrote this
code correctly-- and let
me cross my fingers that
I didn't make any typos.
Let me go ahead here
and get myself a copy
of smiley, which I brought with me.
So that was the tiny little
image from last week.
Let me go ahead and
open this in the IDE.
Smiley, super small.
Just a few pixels there.
And let me go ahead now and run Python,
which we'll see why in a moment,
resize.
Let's increase this by a factor of 10,
increasing Smiley, and call it out.bmp.
Now let me go ahead and open out.bnp
and voila, it indeed seems to work.
Right, no funky colors.
No weird sizes.
No padding.
No padding of all things.
It's just now Python.
So you can probably glean some of
the logic that's going on here.
But some of it certainly should
and probably does look magical.

Arabic: 
في التعليمة البرمجية الأخرى المتاحة للأشخاص الآخرين
ومن المحتمل أن نجد مكتبة لملفات الصورة النقطية.
ولكن لاحظوا أننا لا
نتعامل مع الحشو الآن.
لا نتعامل مع المصفوفات.
لا نتعامل مع الذاكرة لأنني
استخدم الأداة المناسبة لهذه المهمة.
وإذا كتبتُ هذاه التعليمة البرمجية
بشكل صحيح-- ودعوني
أنتقل لأتأكد
أنني لم أرتكب أي أخطاء مطبعية.
دعوني أمضي قدمًا هنا
وأحصل لنفسي على نسخة
من الوجه المبتسم، الذي أحضرته معي.
إذن تلك كانت الصورة 
المصغرة من الأسبوع الماضي.
دعوني أمضي قُدمًا وأفتح هذا في IDE.
الوجه المبتسم، فائق الصغر.
فقط بضع وحدات بكسل هناك.
ودعوني أمضي قدمًا الآن وأشغل Python،
وسنرى السبب في غضون لحظات،
تغير حجمها.
ودعونا نزيد هذا بعامل 10،
ونزيد الوجه المبتسم، ونُسميه out.bmp.
الآن دعوني أمضي قدمًا وأفتح out.bmp
و ها هو ذا، يبدو أن الأمر نجح بالفعل.
صحيح، لا توجد ألوان غير تقليدية.
لا توجد أحجام غريبة.
لا يوجد حشو.
لا يوجد حشو لجميع الأشياء.
إنها الآن Python فقط.
لذلك ربما يمكنكم جمع بعض
المنطق لما يجري هنا.
لكن بعضها بالتأكيد يجب أن يكون
منطقيًا وربما يبدو سحريًا.

English: 
So let's use today to tease this
apart and appreciate not only
what you can do with another
language like Python,
but how it's similar and
different and how it actually
is built upon something like C.
So let's do some comparisons first
so that we can see that it's
not a huge stretch to introduce
yet another language so quickly.
So recall that in Scratch if we wanted
to set a variable, like counter,
to zero, you might simply
do something like this,
setting it equal to zero at left.
In C, we would do the same
thing here at the right.
In JavaScript, this instead
looked a little different.
What did we do in JavaScript?
Yeah, we used let instead because we
don't specify explicitly the type.
But we do need to tell the computer, let
me have this variable called counter.
In Python, it's going to be that.
So we've gotten rid of the type still.
We've gotten rid of any mention
of let or another keyword.
And we've gotten rid of--
perhaps most gratifyingly--
semi-colons are gone.
No more semi-colons.
And no more curly braces in the
way you've seen them thus far.
So that was C, JavaScript,
and now Python.

Arabic: 
لذلك دعونا نستخدم اليوم تقسيم
هذا وتقدير ليس فقط
ما يمكنكم القيام به باستخدام لغة
أخرى مثل Python،
ولكن كيف هو متشابه
ومختلف وكيف تم بناؤه
في الواقع على شيء مثل لغة C.
لذلك دعونا نجري بعض المقارنات أولاً
حتى يمكننا أن نرى أنه
ليس امتداد كبير لتقديم
لغة أخرى بسرعة حتى الآن.
إذن تذكرون أنه في سكراتش إذا أردنا
تعيين متغير، مثل عدّاد،
إلى الصفر، فيمكنكم ببساطة
فعل شيء من هذا القبيل،
لتعيينه يساوي صفر على اليسار.
في لغة C، وسنقوم بالشيء
نفسه هنا على اليمين.
في JavaScript، بدا هذا
مختلفًا بعض الشيء بدلاً من ذلك.
ما الذي قمنا به في JavaScript؟
نعم، استخدمنا يدع بدلاً من ذلك لأننا
لم نحدد بشكل واضح النوع.
لكننا بحاجة إلى إخبار الكمبيوتر، دعني
أحصل على هذا المتغير الذي يُسمى عدّاد.
في Python، سيكون الأمر كذلك.
إذن لقد تخلصنا من النوع.
لقد تخلصنا من ذكر
يدع أو كلمة رئيسية أخرى.
ولقد تخلصنا من--
من المحتمل وبشكل يبعث على الرضى--
اختفت الفاصلات المنقوطة.
لا مزيد من الفاصلات المنقوطة.
ولا مزيد من الأقواس المتعرجة بالطريقة
التي رأيتموها حتى الآن.
إذن كانت هذه لغة C، وJavaScript، 
والآن Python.

English: 
So how about something like this?
In Scratch, if you wanted to
increment a counter by one,
you would use a block like this.
In C, we would do the same
on the right here in code.
In JavaScript, did it look
any different on the right?
No.
You haven't had occasion
to use this yet.
But one of the sort of revelations of
JavaScript was that's also JavaScript.
It was identical.
Something like this, though, is Python.
So it's almost the same.
But I've gotten rid of the semi-colon.
But the logic is exactly the same--
set counter on the left equal to
whatever it is on the right plus one
additional value.
What about this?
This in C had what effect?
Incrementing the variable.
So this is exactly the same.
It's sort of a nice shorthand
notation for doing counter equals
counter plus 1, which just
gets a little tedious to type.
We had that same syntax in JavaScript.
And you can probably guess in
Python, what's it going to look like?
AUDIENCE: Same thing without the--
DAVID MALAN: Same thing
minus the semi-colon.
So pretty nice pattern so far.
Languages just keep getting
trimmer and trimmer, if you will.

Arabic: 
إذن ماذا عن شيء كهذا؟
في سكراتش، إذا أردتم
زيادة العدّاد بمقدار واحد،
ستستخدمون كتلة مثل هذه.
في لغة C، سنفعل الشىء
نفسه على اليمين هنا في التعليمة البرمجية.
في JavaScript، هل تبدو
مختلفة على اليمين؟
لا.
لم تسنح لكم فرصة
استخدام هذا بعد.
ولكن كانت JavaScript إحدى
أنواع عمليات الكشف عن JavaScript أيضًا.
كانت متطابقة.
شيء من هذا القبيل، على الرغم من ذلك، هو Python.
لذا هي نفسها تقريبًا.
لكنني تخلصت من الفاصلة المنقوطة.
لكن المنطق هو نفسه بالضبط--
تعيين العدّاد على اليسار يساوي
أيًا كان على اليمين بالإضافة إلى قيمة
إضافية واحدة.
ماذا عن هذا؟
كان لهذا أي تأثير في لغة C؟
زيادة المتغير.
إذن هذا بالضبط الشيء نفسه.
إنه تدوين شديد الاقتضاب جيد
لإنشاء عدّاد يساوي
عدّاد زائد 1، وكتابته أمر
ممل قليلاً.
كانت لدينا الصيغة نفسها في JavaScript.
وربما يمكنكم التخمين في
Python، ما هي الكيفية التي ستبدو عليها؟
الجمهور: الشيء نفسه دون--
ديفيد مالان: الشيء نفسه
ناقص الفاصلة المنقوطة.
نمط جميل جدًا حتى الآن.
تصبح اللغات فقط
مهذبة ومهذبة، إذا صح التعبير.

Arabic: 
في لغة C، تذكرون أنه يمكننا 
فقط إنشاء زائد زائد،
وهي خدعة أخرى 
لتشغيل العملية نفسها تلقائيًا.
تتيح صيغة JavaScrip الأمر نفسه.
وإذا كنتم أعجبتكم حقًا تلك الصيغة،
فلا يمكنني عرض شريحة Python لكم.
غير موجودة.
لم تعد قادرة على إنشاء زائد زائد.
لذلك نحن ندفع الثمن.
لم يقم مؤلف Python
بتضمين ذلك في اللغة.
لكن لا مشكلة.
لدينا على الأقل هذه،
وهي ليست مروعة للغاية.
إذن ما الذي ألقينا نظرة عليه أيضًا في المرة الأخيرة؟
وحالة إذا كهذه،
لمقارنة إذا كان x أقل من y،
في لغة C تبدو هكذا.
في JavaScript تبدو
مثل هذا الشيء نفسه.
في Python، تبدو هكذا.
لذا اختفت الأقواس المتعرجة.
تمت إضافة نقطتين.
وما لم تروه بعد هو أن 
المسافة البادئة ستكون مهمة.
لذلك أي منكم كان يتعامل مع style50
على نحو سريع وغير دقيق
وكما رأينا في ساعات
العمل، جميع تعليماتكم البرمجية،
ومع ذلك فإن العديد من السطور التي
قمتم بكتابتها لأي سبب من الأسباب
تتم محاذاتها جميعًا على اليسار 
ولم تتم إزاحة أي شيء في الواقع.
الآن لن تسمح
Python بذلك.
تتطلب Python مسافة بادئة من أجل المنطق.
إذن هذه في الواقع 
ميزة نمطية للغة.

English: 
In C, recall that we
could just do plus plus,
which was another trick for
automating that same process.
JavaScript allows for the same.
And if you really like this syntax,
I can't show you a slide for Python.
Doesn't exist.
Can no longer do plus plus.
So we're paying a price.
The author of Python did not
include this in the language.
But that's OK.
We at least have this one,
which is not too horrible.
So what else did we look at last time?
An if condition like this,
comparing if x is less than y,
in C it looks like this.
In JavaScript it looks
like this same thing.
In Python, it looks like this.
So gone are the curly braces.
Added is a colon.
And what you don't see yet is that
indentation is going to be important.
So any of you have been a little
fast and loose with style 50
and, like we've seen at office
hours, all of your code,
however many lines you've
written for whatever reason
is all aligned on the left and
nothing is actually indented.
Now Python is not
going to tolerate that.
Python requires indentation for logic.
And so this is actually a
stylistic feature of the language.

Arabic: 
إنها تجبركم على اعتماد أمور نمطية مرئية
جيدة لأن التعليمة البرمجية
لن يتم تشغيلها فقط إذا لم 
تضع المسافات البادئة بشكل صحيح.
إذن أي شيء سيحدث
إذا كان x أقل من y
وتحتاج إلى إزاحته، لنقل، أربع
مسافات أسفل تلك النقطتين.
ماذا أيضًا قد رأيناه؟
في لغة C أو في سكراتش كانت لدينا
هذه الكتلة لـ if وكتل أخرى.
في لغة C تبدو هكذا.
في JavaScript تبدو هكذا.
في Python، ستبدو 
هكذا، وإن كانت باستخدام مسافة بادئة
أسفل كل علامات النقطتين تلك.
ماذا عن هذا؟
عندما كان لدينا مفترق طرق
ثلاثي الاتجاهات-- ماذا لو أخرى، ماذا لو أخرى--
في لغة C يبدو الأمر هكذا.
بدت JavaScript نفسها.
في Python، تبدو غير تقليدية قليلاً.
ستبدو هكذا--
ولكن ثلاث علامات نقطتين، هذه المرة علامتين.
ماذا أيضًا؟
ألقينا نظرة على التكرارت الحلقية الدائمة في
سكراتش، وفي لغة C، وفي JavaScript.
يمكنكم استخدام الصيغة نفسها
بالضبط في Python، تقريبا الشيء نفسه.
اختفت الأقواس المتعرجة،
وتمت إضافة النقطتين.
والخدعة الطفيفة، إذا
لاحظتم ذلك، صحيح وخاطئ
أصبحت الآن أسماء مناسبة جديدة، إذا صح التعبير.
وتعد كتابة حرف T كبير حرف F
كبير أمرًا ضروريًا.
ماذا عن التكرار الحلقي؟

English: 
It forces you to adopt good visual
stylistic habits because the code just
won't run if you haven't
indented it properly.
So anything that's going to
happen if x is less than y
needs to be indented, say, four
spaces underneath that colon.
What else have we seen?
In C or in Scratch we had
this block for if's and elses.
In C it looks like this.
In JavaScript it looks like this.
In Python it's going to look like
this, albeit with indentation
below each of those colons.
How about this?
When we had three-way a fork in
the road-- if else, if else--
in C it looks like this.
JavaScript looked the same.
In Python, looks a little funky.
It's going to look like this--
elif but three colons, this time two.
What else?
We also looked at forever loops in
Scratch, in C, and in JavaScript.
You could use exactly the same
syntax in Python, almost the same.
Gone are the curly braces,
added is the colon.
And the slight subtlety, if
you noticed, true and false
are now proper nouns, if you will.
Capital T capital F
is necessary to write.
How about a for loop?

English: 
So in Scratch, we could very
easily say, repeat this 50 times.
C and JavaScript is a little
pedantic in that you have
to initialize and increment and check.
Both C and JavaScript
take that same approach,
although in JavaScript we of
course use let instead of int.
Python is a little more succinct
although a little less explicit
step by step.
You just do this.
For i in range of 50 is the way
of saying start iterating at 0,
count all the way up to
but not including 50,
thereby giving you a range of values.
So this is the one that's
perhaps the most weird
thus far, but still a little
more succinct to write.
So in C, we had so many data types--
bool, char, double, float, int, long,
string--
the last of which, of course,
came from the CS50 library.
And there's others
that you can use in C,
as you might recall, from
problem set 3, perhaps.
In Python, we're going to shorten
this list, at least initially,
to just these data types.
In Python, we're going to have bools
for true-false, floats for real numbers,
ints for integers, and
then strs for strings.
Just a little more succinct, but it
does actually exist. str in Python

Arabic: 
إذن في سكراتش، يمكننا القول
بسهولة، كرّر هذا 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

English: 
is a real thing.
It is not a CS50 addition.
There are other data types
that come with Python.
In fact, this is where the
language gets powerful.
And those of you who came
from a Java background or C++,
the subset of you who
have programmed before,
you have more features in Python just
like you do in those other languages
that we did not have in C. In Python,
you have dictionaries or hash tables.
You have lists, which are arrays,
but that can automatically resize.
You don't have to decide in
advance how big or small they are.
Range we just saw, it's a range
of values, like 50 of them,
set in the mathematical sense.
It's a collection of things
that ensures you don't
have duplicates in that collection.
And then tuple is a combination
of things kind of like for math
when you have x comma y or
latitude comma longitude.
Any time you have pairs or
triples or more of things,
those are called tuples.
And those are common in math courses
and higher-level CS theory classes,
as well.
But we do give you, at
least in this first week
of our look at Python, a
few functions from CS50,

Arabic: 
شيء حقيقي.
إنها ليست إضافة CS50.
هناك أنواع بيانات أخرى
تأتي مع Python.
في الواقع، بهذا
تصبح اللغة قوية.
ومَن جاء منكم
من خلفية Java أو لغة ++C،
مجموعتكم الفرعية من الأشخاص الذين
قاموا بالبرمجة من قبل،
لديكم المزيد من الميزات في Python فقط
مثلما تفعلون في تلك اللغات الأخرى
التي لم تكن لدينا في C. في Python،
لديكم قواميس أو جداول علامات التجزئة.
لديكم قوائم، وهي عبارة عن مصفوفات،
ولكن يمكنكم تغيير حجمها تلقائيًا.
لا يتعين عليكم اتخاذ قرار مسبقًا
عن مدى كبر أو صغر حجمها.
النطاق الذي رأيناه للتو، إنه نطاق
القيم، مثل 50 منها،
تم تعيينه بالمعنى الرياضي.
إنه مجموعة من الأشياء
التي تضمن لك عدم وجود
تكرارات في تلك المجموعة.
ومن ثم الصف وهو مزيج
من الأشياء التي تشبه الرياضيات إلى حد ما
عندما يكون لديكم x فاصلة y أو
خط الطول فاصلة خط العرض.
في أي وقت لديكم أزواج أو
ثلاثيات أو الكثير من الأشياء،
هذه تُسمى بالصفوف.
وهي شائعة في دورات الرياضيات
وفصول نظرية CS للمستوى الأعلى،
أيضًا.
ولكننا أعطيناكم، في 
هذا الأسبوع الأول على الأقل
نظرتنا في Python،
وعدد قليل من الدالات من CS50،

Arabic: 
من بينها getFloat ،getInt،
وgetString، والتي تتصرف بالضبط
مثل نظرائها في C.
وهذا سيتيح لنا
فقط البدء
بكتابة تعليمة برمجية بطريقة تذكرنا جدًا
بما فعلناه في الأسابيع القليلة الماضية.
ولكن دعونا نفكر
في الشيء الذي سيتغير
بينما نحن على وشك البدء
بكتابة البرامج الخاصة بنا.
في لغة C، عندما كنت تريدون استخدام
مكتبة CS50، وقمتم بالطبع
بتضمين ملف الرأس الخاص بها.
ستغير هذه الصيغة في
Python حيث كنتم في هذا الأسبوع الأول
تريدون استخدام مكتبة CS50،
ستقولون بدلاً من ذلك
من CS50 قم بالاستيراد ثم قائمة من
الدالات مفصولة بفاصلة
تريدون استيرادها
أو استخدامها في تعليمتكم البرمجية.
إذن، هذا الأمر دقيق أكثر قليلاً.
لا تقول هذه الصيغة
أعطني كل شيء.
أعطني هذا، وهذا،
وهذا الشيء الآخر.
وإذا كنتم ترغبون في استخدام قائمة واحدة أو أكثر،
فيمكنكم فقط الفصل بينها بفواصل.
وكملاحظة جانبية، وعلى وجه التحديد
هؤلاء الذين رأوا Python من قبل،
هناك طرق أخرى للقيام بذلك.
توجد عدة نُهج.
من المحتمل أن هذا هو الشيء الأنسب
للمقارنة لأغراضنا اليوم.
ما الذي 
ستعرفونه أيضًا؟
في لغة C يجب أن تحولوا تعليمتكم البرمجية برمجيًا.
وقمتم بذلك باستخدام clang، هكذا.
ومن ثم قمتم بتشغيل البرنامج
باستخدام نقطة خط مائل مرحبًا.
أو بشكل بسيط أكثر، كتبتكم
مرحبًا، وبعد ذلك

English: 
among them getFloat, getInt, and
getString, which behave exactly
like their C counterparts.
And this is just going
to allow us to start
writing code very reminiscent of
what we did the last few weeks.
But let's consider
what's going to change
as we're about to start
writing our own programs.
In C, when you wanted to use
the CS50 library, you of course
included its header file.
That syntax is going to change in
Python so that for this first week when
you want to use the CS50 library,
you're going to instead say
from CS50 import and then a comma
separated list of the functions
that you want to import
or use in your code.
So it's a little more precise.
This syntax is not saying
give me everything.
Give me this, this,
and this other thing.
And if you want to use one or more,
you can just separate them by commas.
As an aside, especially those of
you who have seen Python before,
there's other ways to do this.
There are several approaches.
This is, perhaps, the most
comparable for our purposes today.
What else are you're
going to have to know?
In C you had to compile your code.
And you did so with clang, like this.
And then you ran your
program with dot slash hello.
Or more simply, you
did make hello and then

English: 
we'd figure out the command for you
in the IDE or the sandbox or lab.
In Python, you're going to
skip the compilation step.
When you want to run
a program in Python,
you're going to do just
what I did quickly before.
You're just going to run the command
Python and then the name of the file
that you want to run.
And the reason for this is as follows.
In the world of C, recall that we
had this sort of pipeline process
where we have our source
code as our input.
And then we wanted to get to the point
of machine code, the zeros and ones.
And what was standing in between
source code and machine code,
just to be clear?
What process?
Yeah, so compiling.
So we had a compiler in the
middle whose purpose in life
is by definition to translate
one language to another.
It happens to be an English-like
language to a computer-like language,
but a compiler is a general term that
just converts one thing to another.
And so this pipeline
for C looked like this.
And that's why you had to run
Clang explicitly, or make.
You had to induce that
middle man operation

Arabic: 
كنا سنكتشف الأمر من أجلكم
في IDE أو sandbox أو lab.
في Python، ستقومون
بتخطي خطوة التحويل البرمجي.
عندما تريدون تشغيل
برنامج في Python،
ستقومون فقط
بما فعلته بسرعة من قبل.
ستقومون فقط بتشغيل الأمر
Python ثم اسم الملف
الذي تريدون تشغيله.
والسبب وراء هذا هو على النحو التالي.
في عالم لغة C، تذكرون أنه
كان لدينا هذا النوع من العملية المستمرة
حيث لدينا تعليمة المصدر
البرمجية الخاصة بنا كمدخل.
ثم أردنا الوصول إلى المغزى
من التعليمة البرمجية الآلية، الأصفار والواحدات.
وما الذي كان يحول بين
تعليمة المصدر البرمجية والتعليمة البرمجية الآلية،
فقط ليتضح الأمر؟
أي عملية؟
نعم، إذن التحويل البرمجي.
إذن كان لدينا محول برمجي في
المنتصف هدفه في الحياة
بحسب التعريف هو ترجمة
لغة إلى أخرى.
ويصادف أنه بلغة تشبه اللغة
الإنجليزية إلى لغة تشبه الكمبيوتر
ولكن المحول البرمجي هو مصطلح عام
فقط يحول شيء واحد إلى آخر.
إذن بدا خط الاتصال هذا
للغة C هكذا.
وهذا هو السبب في أنه يجب أن تشغلوا
Clang بشكل صريح، أو make.
يجب أن تزيحوا
عملية man في المنتصف

English: 
to convert the language to
something the computer understands.
Python and other languages are not
typically compiled in the same way.
They're generally said
to be interpreted,
whereby you don't compile
them into zeros and ones
and then run the program.
You instead run a program that
someone else wrote called Python.
And that program is, by
definition, an interpreter.
And that interpreter's
purpose in life, as the word
implies, is to read your code
top to bottom, left to right,
and just do exactly
what you tell it to do,
step by step by step, without doing
the upfront work of converting things
to zeros and ones.
So in the human world, if I
speak English and someone there
speaks Spanish and we don't
speak each other's language,
we might put a third human in between
us, obviously a human interpreter.
The role is very similar.
The interpreter listens
to me and then translates
that to something the
computer understands.
But it doesn't get into zeros and ones.
It just goes from one
directly to the other.
So the difference here in
Python is that you still
are going to write source code,
like I quickly did for resize.
And ultimately, we
want to actually get it

Arabic: 
لتحويل اللغة إلى
شيء يفهمه الكمبيوتر.
لم يتم تحويل Python ولغات أخرى
برمجيًا بالطريقة نفسها تمامًا.
يتم قولها بشكل عام
ليتم تفسيرها،
حيث لن تقوموا بتحويلها
برمجيًا إلى أصفار وواحدات
ومن ثم تشغيل البرنامج.
يمكنكم بدلاً من ذلك تشغيل برنامج
كتبه شخص آخر يُسمى Python.
وهذا البرنامج، بحسب
تعريفه، هو مترجم.
وهدف هذا المترجم
في الحياة، كما تشير
الكلمة، هو قراءة تعليمتك البرمجية
من الأعلى إلى الأسفل، من اليسار إلى اليمين،
ويقوم بالضبط بما
تمليه عليه لفعله،
خطوة بخطوة بخطوة، دون القيام
بعمل مسبق لتحويل الأشياء
إلى أصفار وواحدات.
إذن في عالم البشر، إذا كنت
أتحدث اللغة الإنجليزية وهناك شخص ما
يتحدث اللغة الإسبانية وكل منا لا
يتحدث لغة الآخر،
قد نضع شخص ثالث
بيننا، بالطبع شخص يعمل مترجمًا.
الدور متشابه جدًا.
يستمع المترجم
إليّ ثم يترجم
هذا لشيء
يفهمه الكمبيوتر.
ولكن لن يصبح أصفار وواحدات.
إنه ينتقل فقط مباشرة من
واحد إلى الآخر.
إذن الاختلاف هنا في
Python هو أنك ستظل
تكتب تعليمة المصدر البرمجية ،
مثلما فعلتُ بسرعة لتغيير الحجم.
وفي نهاية المطاف، نحن
فعلاً نريد تحويلها

English: 
into a program called an interpreter.
And so the step ideally
just looks like this.
But as an aside, Python is a
pretty sophisticated language.
And even though we have the
pleasure of running it just
with one step instead of these two
steps, there actually is, as an aside,
some magic going on underneath the hood.
And for the curious, there actually
is, for performance reasons,
a compiler built into Python that
actually converts it to something
intermediary called bytecode.
And bytecode is what's
actually interpreted.
And so this is why Python,
while potentially slower than C
at certain tasks because you're not
going to the low level zeros and ones,
can actually be used in business
applications and popular websites
and such.
And that didn't really work very well.
And so it can be highly
performing, as well.
But more on that in a little bit.
So with that said, if these
are the differences not only
syntactically but also
mechanically, let's go ahead

Arabic: 
إلى برنامج يُسمى مترجم.
ولذا تبدو الخطوة 
المثالية مثل هذه.
ولكن كملاحظة جانبية، Python هي
لغة متطورة للغاية.
وعلى الرغم من أن لدينا رفاهية
تشغيلها فقط
باستخدام خطوة واحدة بدلاً من هاتين
الخطوتين، هناك في الواقع، كملاحظة جانبية،
بعض السحر غير الظاهر.
وبداعي الفضول، هناك 
في الواقع، لأسباب تتعلق بالأداء،
محول برمجي تم إنشاؤه في Python
يقوم بالفعل بتحويلها إلى شيء ما
وسيط يُسمى التعليمة البرمجية المكونة من وحدات البايت.
والتعليمة البرمجية المكونة من وحدات البايت 
هي ما تم تفسيره بالفعل.
وهذا هو السبب في أن Python،
على الرغم من أنها قد تكون أبطأ من لغة C
في بعض المهام لأنكم لن تنتقلوا إلى
الأصفار والواحدات ذات المستوى المنخفض،
يمكن استخدمها في الواقع في تطبيقات
الأعمال التجارية ومواقع الويب الشائعة
وما شابه ذلك.
وهذا الأمر لم ينجح بشكل جيد.
ولذا يمكن أن تكون ذات
أداء عالٍ، أيضًا.
ولكن المزيد حول ذلك بعد قليل.
إذن من هذا المنطلق، إذا كانت هذه
هي الاختلافات ليس فقط
من الناحية البنائية ولكن أيضًا
من الناحية الآلية، دعونا نمضي قدمًا

Arabic: 
ونكتب برنامجًا بالفعل.
لذا دعوني أمضي قُدمًا وأنتقل إلى IDE.
دعوني أغلق الأمثلة السابقة.
ودعونا نبدأ بشكل بسيط أكثر لأن
تغيير حجم كان أمرًا صعبًا في كل مرة.
دعوني أمضي قدمًا وأقوم بإنشاء ملف
جديد يُسمى hello.py.
وبدلاً من كتابة
هذا البرنامج بلغة C،
دعوني أمضي قدمًا 
وأكتب فقط مرحبًا بالعالم.
لذا دعونا نمضي قُدمًا ونفعل هذا.
اطبع مرحبًا بالعالم.
تم.
هذا هو أول برامجي في Python،
وحقًا أول برنامج أقوم به في Python،
ليس شيء حيوي
بتغيير الحجم إلى حد ما.
إذن ما هو الشيء غير الموجود في هذا الملف
والذي كان في شيء مثل hello.c؟
لا توجد دالة 
main الضرورية هنا.
ما هو الشيء غير الموجود أيضًا؟
الجمهور: Printf.
ديفيد مالان: لم يذكر
printf.
إنها طباعة بدلاً من ذلك، وهي
مراعية للشخص بشكل أكبر قليلاً.
الجمهور: المكتبات.
DAVID MALAN: لم تذكر
ملفات الرأس أو المكتبات
في الجزء العلوي من الملف.
لقد تعمقتُ فقط بشكل صحيح وانتقلتُ إليه.
نعم؟
الجمهور: لا توجد فاصلات منقوطة.
ديفيد مالان: لا توجد فاصلات منقوطة.
ماذا أيضًا؟
ماذا أيضًا؟
نعم؟
الجمهور: لا يوجد خط مائل عكسي n.
ديفيد مالان: لا يوجد خط مائل عكسي n.

English: 
and actually write a program.
So let me go ahead and go into the IDE.
Let me close our examples from before.
And let's start more simply because
resize was a mouthful all at once.
Let me go ahead and create
a file called hello.py.
And instead of writing
this program in C,
let me go ahead and
just write hello world.
So let's go ahead and do this.
Print hello world.
Done.
That's my first program in Python,
and truly my first program in Python,
not sort of coming out
swinging with resize.
So what is not present in this file
that was in something like hello.c?
There is no main
function necessary here.
What else is missing?
AUDIENCE: Printf.
DAVID MALAN: There is
no mention of printf.
It's instead print, which is
a little more human friendly.
AUDIENCE: Libraries.
DAVID MALAN: There is no mention
of header files or libraries
at the top of the file.
I just dived right in and got to it.
Yeah?
AUDIENCE: No semi-colons.
DAVID MALAN: No semi-colons.
What else?
What else?
Yeah?
AUDIENCE: No backslash n.
DAVID MALAN: No backslash n.

Arabic: 
من المحتمل أنني-- لم
أقم بتشغيلها بعد، ولكن أعتقد
أنني سأحصل على هذا مجانًا
هذه المرة باستخدام Python.
لا يجب أن أكون صريحًا جدًا.
هل كانت هناك يد أخرى مرفوعة هنا؟
الجمهور: لا يوجد حرف f في printf.
ديفيد مالان: لا يوجد
حرف f في printf، نعم.
شيء آخر؟
لا توجد مسافة بادئة.
ومع ذلك لكي نكون منصفين،
هناك سطر واحد فقط.
لكن لا توجد مسافة بادئة.
هذا عادل.
هذا عادل.
لا توجد أقواس متعرجة، أيضًا.
لم يذكر int.
لم يذكر void.
أعني، يا إلهي.
لماذا لم نفعل هذا فقط في المرة الأخيرة؟
ولهذا السبب تتطور اللغات.
أدرك الأشخاص منذ سنوات،
يا إلهي، لغة C تخدمنا بشكل جيد.
بمجرد أن أفهم المؤشرات
والصيغة، حسنًا، لقد فهمت.
لكن يا إلهي، إن كتابة حتى أبسط
البرامج أمر ممل
لأنه يجب أن أكتب علامة التجزئة بما في ذلك،
standard io.h، int main void، أعني،
كل هذا التجاوز البنائي
الذي يحول فقط دون قيامك
بالعمل الذي تهتم 
به، وهو في أبسط أشكاله
هنا حيث يقوم فقط بطباعة مرحبًا بالعالم.
إذن Python والعديد من اللغات
الحديثة-- من بينها،
Ruby وPHP ولغات أخرى--
فقط تتخلص من العديد من هذا
التجاوز حتى يمكنكم البدء

English: 
I probably-- I haven't
run it yet, but I think
I will get that for free
this time with Python.
I don't have to be so explicit.
Was there another hand here?
AUDIENCE: There's no f in printf.
DAVID MALAN: There's
no f in printf, yep.
Something else?
There's no indentation.
Though to be fair,
there's only one line.
But there's no indentation.
That's fair.
That's fair.
There's no curly braces, as well.
There's no mention of int.
There's no mention of void.
I mean, my God.
Why didn't we just do this last time?
And so this is why languages evolve.
People realized years ago,
gee, C is serving us well.
Once I understand pointers
and the syntax, OK, I got it.
But my God, it's just so tedious to
write even the simplest of programs
because I have to do hash includes,
standard io.h, int main void, I mean,
all of this syntactic overhead
that's getting in the way of you just
doing the work you care
about, which in simplest form
here is just printing hello world.
So Python and a lot of more
modern languages-- among them,
Ruby and PHP and others--
just get rid of a lot of that
overhead so that you can just get down

Arabic: 
بالعمل بسرعة أكبر على الفور.
إذن كيف يمكنني المضي قدمًا وتشغيل هذا؟
في لغة C، تذكروت أنني قمتُ
بإنشاء نقطة خط مائل hello.py.
لكننا قلنا للتو منذ لحظة
أن هذا ليس هو النهج الصحيح.
كيف يمكنني المضي وتشغيل هذا البرنامج؟
نعم، إذن حرفيًَا أقوم بتشغيل برنامج يُسمى
بالصدفة Python نفسها.
هذا هو المترجم.
هذا هو الرجل في المنتصف بيني
وبين صديقي الذي يتحدث اللغة الإسبانية
ويجب عليه فقط تحويل hello.py
إلى أي جهاز كمبيوتر يفهمه
بنفسه.
إذن لدينا هناك، بالفعل،
مرحبًا بالعالم.
وكما تلاحظون، لا يوجد
خط مائل عكسي n على تعليمتي البرمجية.
لكنني أحرك المؤشر
إلى السطر الجديد.
حيث قررت Python للتو، أتعلمون ماذا؟
إنه لمن الشائع للغاية أن تكون هناك سطورًا جديدة،
دعونا فقط نضيف هذه بشكل افتراضي.
تعلمون، سيكون الثمن الذي
سندفعه
مزعجًا قليلاً للتخلص منها.
لكننا سنرى ذلك بعد قليل، أيضًا.
إذن إنها مجرد مقايضة.
حسنًا، لنقم بشيء واحد آخر.
وهو أبسط
البرامج الممكنة فقط.
دعونا نمضي قدمًا ونقوم، لنقل،
بشيء أفضل قليلاً
يتيح لنا أن نفعل
شيء أكثر من ذلك.
إذن دعونا نمضي قدمًا، لنقل،
ولا نقارن هذا

English: 
to work more quickly right away.
So how do I go ahead and run this?
In C, recall, I would have
done dot slash hello.py.
But we just said a moment ago
that's not the right approach.
How do I go and run this program?
Yeah, so I run literally a program that
is coincidentally called Python itself.
That is the interpreter.
That's the man in the middle between
me and my Spanish-speaking friend that
just has to convert hello.py
into whatever the computer itself
understands.
And so there, indeed,
we have hello world.
And as you notice, there's
no backslash n on my code.
But I am moving the
cursor to the new line.
So Python just decided, you know what?
It's so damn common to have new lines,
let's just add those by default.
You know, the price we're
going to pay is it's
a little annoying to get rid of them.
But we'll see that in a little bit, too.
So just a tradeoff.
All right, let's do another one.
That's just a simplest
of possible programs.
Let's go ahead and do, say,
something a little fancier
that allows us to do
something more than that.
So let's go ahead, say,
and compare not just

English: 
that, but let's actually
go get some user input.
So for user input, there's
a few ways to do this.
We'll do it the CS50 way initially,
but these are training wheels this week
that we'll use for just a
week before we take them off,
just bridging us from C to Python.
Let me go ahead and
call this string zero.py
because I'm dealing with strings.
And let me go ahead and do
s to give me a variable.
Get string.
Let me prompt the human for his or her
name like this and then let me go ahead
and say hello.
And so and now I just have to
consider how to print out their name.
And in Python, I can
actually just do this.
I don't need to do percent s.
I don't need to put a second-- or, I
do need to put a second comma here.
But I can just do this,
which is a little simpler.
And this is not correct.
I'm not practicing what I preached.
Get rid of the f.
Just print what you
want to print, indeed.
So s, notice, is apparently a
variable because I'm assigning
it a value from right to left.
But notice that I'm not
specifying the type.
So Python does have type. str we
said is the string equivalent.
But you don't have to mention it.

Arabic: 
فقط، ولكن دعونا في الواقع
نحصل على بعض مدخلات المستخدم.
إذن بالنسبة لمدخل المستخدم، توجد
بعض الطرق للقيام بذلك.
سنقوم بذلك بطريقة CS50 في البداية،
لكن هذه هي عجلات التدريب هذا الأسبوع
التي سنستخدمها لأسبوع واحد
فقط قبل أن نزيلها،
فقط للانتقال من لغة C إلى Python.
دعوني أمضي قدمًا 
واستدعي هذه السلسلة zero.py
لأني أتعامل مع السلاسل.
ودعوني أمضي قدمًا وأكتب
s ليتم منحي متغير.
Get string.
دعوني أطلب من الشخص اسمه أو
اسمها هكذا، ومن ثم دعوني أمضي قدمًا
وأقول مرحبًا.
وكذا وكذا، والآن يجب فقط أن
أفكر في كيفية طباعة اسمه.
وفي Python، يمكنني
في الواقع القيام بذلك فقط.
لا أحتاج إلى كتابة النسبة المئوية s.
ولا أحتاج إلى وضع واحدة أخرى-- أو، لا
أحتاج إلى وضع فاصلة ثانية هنا.
ولكن يمكنني فقط القيام بهذا،
وهو أبسط قليلاً.
وهذا غير صحيح.
أنا لا أفعل ما أنصح به.
التخلص من f.
فقط طباعة ما كنتَ
تريد طباعته، حقًا.
إذن s، لاحظوا، من الواضح أنه
متغير لأنني أقوم بتعيين
قيمة له من اليمين إلى اليسار.
ولكن لاحظوا أنني لم
أحدد النوع.
إذن، تحتوي Python على نوع. str التي
تحدثنا عنها وهي سلسلة مُعادلة.
لكن لا يجب أن تذكرها.

English: 
Python, like JavaScript, will just
figure it out, even without a keyword
like let.
But I do need to add one thing.
What's that?
AUDIENCE: You need to
import the getString?
DAVID MALAN: Yeah,
getString is a CS50 thing.
And we're only going to use it for
a week, but I do need to import it.
And the syntax with which to do this
is to say, from the CS50 library,
import a function called get string.
I don't need to import
any more with commas.
That one suffices for this program.
Yeah.
AUDIENCE: Would you want to--
instead of saying hello your name, would
you want to first getName that says
[INAUDIBLE]?
You're not indicating where
the error is [INAUDIBLE]..
DAVID MALAN: Sure, let me come
back to this in one second.
Let's run this program first
to demonstrate that it indeed
does what we saw it do last week.
And let me go ahead here and do
this time Python of string 0.
Let me go ahead and it's
just waiting for my name.
So I'll type in David.
Hello, David.
But as you propose, what if
you wanted to flip this around?

Arabic: 
Python، مثل JavaScript، ستحددها،
حتى دون وجود كلمة رئيسية
مثل let.
لكنني أحتاج إلى إضافة شيء واحد.
ما هو؟
الجمهور: تحتاج إلى 
استيراد getString؟
ديفيد مالان: نعم،
getString هي شيء خاص بدورة CS50.
وسنستخدمها فقط لمدة 
أسبوع، ولكنني أحتاج إلى استيرادها.
والصيغة للقيام بهذا باستخدامها
هي لقول، من مكتبة CS50،
قم باستيراد دالة تُسمى getstring.
ولا أحتاج إلى استيراد
المزيد مع الفواصل.
هذه تكفي لهذا البرنامج.
أجل.
الجمهور: هل تريد أن--
بدلاً من قول مرحبًا اسمك، هل 
تريد الحصول أولاً على الاسم الذي يقول
[INAUDIBLE]؟
أنت لا تشير إلى مكان
وجود الخطأ [INAUDIBLE]..
ديفيد مالان: بالتأكيد، دعوني
أعود مجددًا إلى هذا خلال ثانية واحدة.
دعونا نشغل هذا البرنامج أولاً
لإثبات أنه يقوم
بالفعل بما رأينا أنه يقوم به في الأسبوع الماضي.
ودعوني أمضي قدمًا هنا وأكتب
هذه المرة Python من سلسلة 0.
دعوني أمضي قدمًا 
وهي فقط في انتظار اسمي.
إذن سأكتب ديفيد.
مرحبًا، ديفيد.
ولكن كما كنتم تقترحون، ماذا إذا
أردت تغيير موضع هذا؟

Arabic: 
حسنًا، لنفترض أنني أردت قول
اسم الشخص وبعد ذلك
شيء مثل مرحبًا لأنني
متحمس بالفعل لرؤيته، بدلاً من ذلك.
دعونا نرى ما يفعله هذا.
دعوني أمضي قدمًا الآن 
وأشغّل Python من سلسلة 0.
أكتب اسمي.
وأعتقد أنه تقريبًا
ما قصدتموه.
لكن هناك خطأ--
خطأ جمالي، على الأقل.
إذن يبدو أنه باستخدام دالة
طباعة Python لا
تحتاجون إلى استخدام العنصر النائب مثل النسبة المئوية s.
ولكن يبدو أنه من المفترض أن تضيف
مساحة من أجلك بعد كل شيء
تمر به كمدخل لطباعتها.
لذا لاحظوا كم وسيطة
تستهلكها الطباعة
وفقًا لهذا الجزء المظلل؟
كم عدد الوسطيات التي يمكن أن تستنتجوها؟
الجمهور: S مسافة ومن ثم الشيء.
ديفيد ج. مالان: وسيطتان؟
نعم، إذن وسيطتان.
وسيطة واحدة هي s، فاصلة، والثانية
هي ما تم تظليله باللون الأخضر هنا.
نعم، توجد فاصلة ثانية هناك،
ولكنها داخل السلسلة.
إذن مثلما هو الحال في C، وهذا
نوع من أنواع جذب الانتباه.
توجد وسيطتان هنا فقط.
ولكن يبدو أن دالة الطباعة--
وستعرفون ذلك

English: 
Well, suppose I wanted to say
the person's name and then
something like hello because I'm
just excited to see them, instead.
Let's see what this does.
Let me go ahead now and
run Python of string 0.
Type in my name.
And it's almost what
I think you intended.
But there is a bug--
an aesthetic bug, at least.
So it seems with Python's
print function you don't need
to use the placeholder like percent s.
But it would seem to presumptuously add
a space for you after everything you're
passing in as an input to print itself.
So notice print is
taking how many arguments
according to this highlighted portion?
How many arguments might you infer?
AUDIENCE: S space and then the thing.
DAVID MALAN: Two?
Yeah, so two.
One is s, comma, and then the rest
is what's highlighted in green here.
Yes, there's a second comma there,
but it's inside of the string.
So just like in C, that's
sort of a red herring.
There's only two arguments here.
But it seems that the print
function-- and you would know this

English: 
by reading that documentation-- if you
pass in two or three or more arguments,
it prints all of them.
But separates them with a single space.
So this isn't quite right.
So this is actually a great
motivation for cleaning this up.
If I want to actually improve this
program and tidy it up a little bit,
let me do that in version one here.
Let me create another file
called, say, string1.py.
Let me start where we
started a moment ago.
And let me actually use a placeholder
akin to C. So if I want to do,
for instance, hello so-and-so, it turns
out you can actually say, hey Python,
put a variable called s right here.
However, if I run this as is,
there's still going to be a bug.
It's not quite solved yet.
But when I hit Enter now
and type in my name--
all right, this is
obviously stupid looking.
So it seems that I need to tell Python
that this string that I'm passing in,
hello comma so and so,
is a formatted string.
It's a placeholder string that
it should make some changes to.
And this is a little weird,
cryptic syntactically in Python.

Arabic: 
من خلال قراءة هذه الوثائق-- إذا
مررتم في وسيطتين أو ثلاث أو أكثر،
إنها تطبعها جميعًا.
لكن تفصل بينها بمسافة واحدة.
إذن هذا ليس صحيحًا تمامًا.
إذن هذا دافع كبير بالفعل
لإزالة ذلك.
إذا كنت أريد بالفعل تحسين هذا البرنامج
وتنظيمه قليلاً،
دعوني أفعل ذلك في الإصدار الأول هنا.
دعوني أقوم بإنشاء ملف آخر
يُطلق عليه، على سبيل المثال، string1.py.
دعوني أبدأ من حيث بدأنا
منذ قليل.
ودعوني أستخدم عنصر نائب بالفعل
يشبه C. لذا إذا أردتُ كتابة،
على سبيل المثال، مرحبًا ذاك وذاك، يتضح
أنه يمكنك بالفعل قول، مرحبًا Python،
ضَع متغيرًا يُسمى s هنا.
ومع ذلك، إذا قمتُ بتشغيلها كما هي،
ستصبح خطأ.
لم يتم حلها تمامًا بعد.
ولكن عندما أنقر فوق Enter الآن
وأكتب اسمي--
حسنا، هذا يبدو بالفعل 
أمرًا غبيًا.
لذا يبدو أنني بحاجة إلى إخبار Python
بأن هذه السلسلة التي أمر بها،
مرحبًا فاصلة ذاك وذاك،
هي سلسلة منسقة.
إنها سلسلة العنصر النائب التي
يجب أن تتم بها بعض التغييرات.
وهذا مشفر بشكل غريب بعض الشيء
من الناحية البنائية في Python.

English: 
But the way you do this in Python is
you put an f before the string itself.
So I'm sorry, we got rid
of the f a moment ago.
So we just called it print.
Now we're reusing a different f here.
And it's stupid-looking
syntax, admittedly.
But this just means hey, Python,
the following double quotes
or single quotes that
you're about to see should
be formatted by you in a special way.
And it literally goes at
the beginning of the string
even though that does
admittedly look weird.
But if I now rerun this Python
string one and type in my name now,
now it does the substitution.
So I can flip it around
logically much more flexibly now
and do something like hello because
now I'm passing in one argument
that print will format for me.
So when I type in my name now, I'm not
going to get that superfluous space.
And now I have complete control
over the formatting of the string.
So you know, sort of two steps forward,
one step back, perhaps, syntactically.
But it does allow us to do
what we want this to do.
We could write the
same program using ints
and floats using getInt and getFloat.
Would look exactly the same.
You don't need to worry about percent
s versus percent i versus percent f.

Arabic: 
لكن الطريقة التي تفعلون بها ذلك في Python هي
أن تضعوا حرف f قبل السلسلة نفسها.
لذا معذرة، لقد تخلصنا من f
منذ لحظة.
لذا نحن نسميها الطباعة فقط.
نحن الآن نعيد استخدام f مختلفة هنا.
وهذه صيغة
تبدو غبية، في الحقيقة.
ولكن هذه تعني فقط، مرحبًا Python،
علامات الاقتباس المزدوجة التالية
أو علامات الاقتباس المفردة التي
على وشك أن تروها يجب
أن تكون منسقة بطريقة خاصة.
وهي حرفيًا ستنتقل إلى
بداية السلسلة
حتى على الرغم من أن ذلك
يبدو أمرًا غريبًا في الحقيقة.
لكن إذا أعدت الآن تشغيل سلسلة Python
هذه وكتبتُ الآن اسمي،
الآن إنها تقوم بالاستبدال.
إذن يمكنني أن أغيرها بصورة
مرنة أكثر وبشكل منطقي الآن
وأقوم بشيء مثل مرحبًا لأنني
الآن أمرُ بوسيطة واحدة
ستنسقها الطباعة من أجلي.
إذن عندما أكتب اسمي الآن، لن
أحصل على هذه المسافة غير الضرورية.
والآن أنا أتحكم بشكل كامل
في تنسيق السلسلة.
إذن تعرفون، خطوتان إلى الأمام إلى حد ما،
ربما، خطوة واحدة إلى الخلف من الناحية البنائية.
لكنها تتيح لنا أن نقوم
بما نريد القيام به.
يمكننا كتابة
البرنامج نفسه باستخدام أعداد صحيحة
وقيم كسرية باستخدام getInt وgetFloat.
ستبدو الأمر نفسه بالضبط.
لا تقلقوا بشأن النسبة المئوية s
مقابل النسبة المئوية i مقابل النسبة المئوية f.

Arabic: 
أنتم تكتبون فقط اسم المتغير
داخل تلك الأقواس المتعرجة.
حسنًا، دعوني أمضي قدمًا
وأقوم ببعض العمليات الحسابية بسرعة.
دعوني أمضي قُدمًا وأقوم بذلك.
دعوني أمضي قدمًا وأقوم بإنشاء ملف جديد.
سنسمي هذا ints.py للأعداد الصحيحة.
ودعوني أمضي قدمًا
وأحصل على حق الوصول هذا إلى--
ماذا عن دالة أو طريقة getint الخاصة
بمكتبة CS50 الموجودة.
بعد ذلك دعوني أمضي قدمًا
وأعلن عن متغير
يُسمى X وأحصل على عدد صحيح من المستخدم
وأطلب منه أو منها X فقط.
ثم دعوني أمضي قدمًا
وأقوم بالشيء نفسه
وأحصل فقط على y منه، أيضًا.
ومن ثم في الأسفل هنا، دعوني
أقوم فقط ببعض العمليات الحسابية البسيطة.
وقمنا بهذا في الأسبوع الأول
عن طريق الطباعة على النحو التالي.
دعوني أمضي قدمًا
وأطبع فقط x زائد y يساوي--
والآن هذا هو الأمر الرائع 
في ميزة القوس المتعرج هذه.
يمكنك بالفعل استخدام
ليس فقط أسماء المتغيرات،
ولكن يمكنك أيضًا القيام بعمليات
بسيطة هناك، كذلك.
يمكنني حرفيًا القيام بعملية حسابية داخل تلك الأقواس
المتعرجة وطباعة تلك القيمة.
لكن بالطبع، هذا سيقوم فقط حرفيًا
بطباعة الأقواس المتعرجة.
ماذا عليّ أن أضيف؟
نعم، لذا إنه يبدو غريبًا بعض الشيء.

English: 
You just type in the variable
name inside of those curly braces.
All right, let me go ahead
and do some quick math.
Let me go ahead and do this.
Let me go ahead and create a new file.
We'll call this ints.py for integers.
And let me go ahead and
get this access to--
how about the CS50 library's get
int method or function which exists.
Then let me go ahead
and declare a variable
called x and get an int from the user
and just prompt him or her for x.
Then let me go ahead
and do the same thing
and just get y from them, as well.
And then down here, let me
just do some simple math.
And we did this way back in
week one by printing as follows.
Let me go ahead and just
print out x plus y equals--
and this is what's cool now
about this curly brace feature.
You can actually do not
just variable's names,
but you can do simple
operations in there, too.
I can literally do math inside of those
curly braces and print out that value.
But of course, this alone is just going
to literally print the curly braces.
What do I have to add?
Yeah, so it looks a little weird.

Arabic: 
لكن هذا الآن سيحل هذه المشكلة.
سيقوم حرفيًا بطباعة 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.

English: 
But this now will solve that problem.
It will print literally x plus y
equals whatever the actual sum is.
AUDIENCE: Just following
up, what does f mean?
DAVID MALAN: Format.
Format the following string for me.
Good question.
Let's do just a few copy/paste
but change the operator here.
So x minus y, I want to
see what this looks like.
X, say-- what did we do last time?
Multiplying by y.
I want to do that math, too.
I can divide as well.
And then we had one
more, which was modulo,
or modular arithmetic, which,
recall, was the percent sign.
So syntactically, it's identical to see.
We're just adding this curly brace
notation just for the print function
right now.
Let me go ahead and run this.
Python of ints.py.
And let me go ahead
and do one and say two.
So 1 plus 2 is 3.
1 minus 2 is negative 1.
1 times 2 is 2.
1 divided by 2 is 0.5.
And 1 then divide by 2 and
take the remainder is 1.

Arabic: 
إذن أعتقد أن هذا يتحقق
رياضيًا.
لكن يجب أن تكونوا متفاجئين قليلاً
من إحدى هذه النتائج.
كررها؟
الجمهور: حصلتَ على قيمة كسرية.
ديفيد ج. مالان: نعم ،حصلتُ على قيمة كسرية.
على سبيل المثال، يبدو أن Python نفسها
قد أصلحت خللاً في C نفسها.
ماذا حدث في C عندما قسمتَ
1، عدد صحيح، على 2، عدد صحيح، في C؟
ستحصل على عدد صحيح آخر.
وما هو أقرب عدد صحيح
يمكنك تمثيله
ولا توجد فيه علامة عشرية؟
0، لأن C سوف تقتطع
كل شيء بعد العلامة العشرية.
وحتى الآن، يبدو أن Python قد أصلحت
هذه المشكلة.
وهذه في الواقع
ظاهرة حديثة إلى حد ما.
وهذا موضع نقاش كبير وقديم
حول ما إذا كان
يجب أن تحتفظ بالتعريف التاريخي
للقسمة أم لا، وهو
هي قسمة عامة، إذا جاز التعبير، أو
يجب أن نجعلها قسمة حقيقة،
مثلما تعلمنا جميعًا في المدرسة.
اتخذت Python النهج الأخير وجعلت القسمة تعني
القسمة، القسمة الحقيقية،
حيث إذا قمتَ بقسمة عددين صحيحين 
ستظهر لك قيم كسرية.
بالطبع، هذه هي المشكلة
إذا أراد الأشخاص
كتابة التعليمة البرمجية التي تفترض أنه
سيتم اقتطاعها.
يمكن أن يكون ذلك بمثابة ميزة قوية في الواقع.

English: 
So I think this checks
out mathematically.
But you should be a little
surprised by one of these outcomes.
Say again?
AUDIENCE: You're getting a float.
DAVID MALAN: Yeah, I'm getting a float.
Like, Python itself seems to
have fixed a bug in C itself.
What happened in C when you divided
1, an integer, by 2, an integer, in C?
You would get another integer.
And what's the closest
integer you can represent
that doesn't have a decimal point?
0, because the C would truncate
everything after the decimal point.
And yet, Python seems to
have fixed this problem.
And this is actually a
somewhat recent phenomenon.
And this a huge religious
debate as to whether or not
you should just keep the historical
definition of division, which
is floor division, so to speak, or
we should make it truly division,
like we all grew up learning in school.
Python took the latter approach and made
division mean division, true division,
where if you divide two
ints you get back a float.
Of course, this is a
problem if people want
to write code that assumes that
it's going to be truncated.
That can actually be a powerful feature.

English: 
So it turns out, and you won't have
terribly many occasions to use this,
but the compromise in the world
was, all right, if you really
want the old behavior of the division
in Python, we will give it back to you.
You have to use two slashes.
So again, another one of these
two steps forward, one step back.
But it's there, so problems can
still be solved in the same way.
And this, if I save it and
rerun that same code, 1 and 2,
now I get back 0, just as I would in
C, which does have some applicability.
Let's do one other example
now involving some numbers.
And let me go ahead and
call this floats.py.
And let me do the same thing, from
CS50 import getFloat this time.
So I can deal with
floating point values.
Let me declare a variable
x and get a float
and we'll ask the user for a variable x.
Then let's go ahead and get another
float, and just as before, call it y.
But this time both of
them are, indeed, floats.
Then let me go ahead and do
some math, x plus y equals z.
Let's give myself a third variable.
And then let me just go ahead
and print out a similar message--

Arabic: 
إذن يتضح أن، ولن تسنح لك
فرص لاستخدام هذا كثيرًا،
لكن التسوية في العالم
كانت، حسنًا، إذا كنتم حقًا
تريدون النهج القديم للقسمة
في Python، سنعيده لكم.
يجب أن تستخدموا خطين مائلين.
لذا مجددًا، خطوة واحدة أخرى من هاتين
الخطوتين إلى الأمام، خطوة واحدة الى الخلف.
لكن إنها هناك، لذا يمكن حل المشاكل
بالطريقة نفسها.
وهذا، إذا قمتُ بحفظه
وأعدتُ تشغيل التعليمية البرمجية نفسها، 1 و2،
الآن حصلتُ على 0، تماما كما في C، وهو
يمكن تطبيقه.
دعونا نطرح الآن مثالاً آخر
يحتوي على بعض الأرقام.
ودعوني أمضي قدمًا
وأسمي هذا floats.py.
ودعوني أفعل الشيء نفسه، من
CS50 قم باستيراد getFloat هذه المرة.
لذا يمكنني التعامل
مع قيم كسرية حقيقية.
دعوني أعلن عن متغير
× وأحصل على قيمة كسرية
وسنطلب من المستخدم متغير x.
ثم دعونا نمضي قدمًا ونحصل على
قيم كسرية أخرى، وكما فعلنا من قبل، نسميها y.
لكن هذه المرة، كلتاهما،
في الواقع، قيمة كسرية.
إذن دعوني أمضي قدمًا وأقوم
بعملية حسابية، x زائد y يساوي z.
دعوني أعطي نفسي متغير ثالث.
ومن ثم دعوني فقط أمضي قدمًا
وأقوم بطباعة رسالة متشابهة--

Arabic: 
x مقسوم على y يساوي z.
حسنًا، ودعوني أمضي قدمًا
وأقوم بحفظ هذا، وأزيل ما بداخل نافذتي الطرفية،
وأقوم بإنشاء Python من floats.py.
1 مقسوم على 10 هذه المرة.
وأحصل-- اللعنة، خطأ.
كيف أقوم بحل تلك المشكلة؟
حسنًا، إذن مجرد f بسيط.
لنجعلها سلسلة منسقة.
ليس أمرًا صعبًا.
إذن لنعيد تشغيل هذا، 1، 10.
حسنًا، هوو، هوو.
هذا أمر جديد.
ما الذي يحدث هناك؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: لقد حددت z في السطر
أعلاه، وما هو تعليقك؟
الجمهور: لقد استخدمتَ x زائد y.
ديفيد ج. مالان: لقد استخدمتُ x
زائد y، لكنني أعتقد أنني--
أوه، انتظر، حسنًا.
معذرة.
دعونا-- حسنًا، حتى نتمكن من إصلاح ذلك.
دعونا-- معذرة.
هناك.
حسنًا، إذن 1، 10.
امم، ما زال خطأ.
ملاحظة جيدة، شكرًا لك، على الرغم من ذلك.
لماذا 1 زائد 2 يساوى 11--

English: 
x divided by y equals z.
All right, and let me go ahead
and save this, clear my terminal,
and do Python of floats.py.
1 divided by 10 this time.
And I get-- dammit, bug.
How do I fix this?
All right, so just a simple f.
Make it a format string.
No big deal.
So let's rerun this, 1, 10.
OK, hoo, hoo.
That's a new one.
What is going on there?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: I did define z in the line
above it, and what was your comment?
AUDIENCE: You used x plus y.
DAVID MALAN: I did use x
plus y, but I think I--
oh, wait, OK.
I'm sorry.
Let's-- OK, so we can fix that.
Let's-- sorry.
There.
OK, so 110.
Hmm, still wrong.
Good catch, thank you, though.
Why is 1 plus 2 11--

English: 
or 1 plus 10, 11?
Yeah?
AUDIENCE: [INAUDIBLE].
DAVID MALAN: Wait, wait, wait.
Sorry.
AUDIENCE: [INAUDIBLE]
[LAUGHTER]
DAVID MALAN: This brings me back to
my earlier point as to how tired I am.
So this is correct.
So Python does math correctly.
But-- OK, horrifying.
All right, so now let's
do division and try
to make the point I think I meant to
make late last night where I if I do 1
divided by 10, OK, 1 divided by 10,
as expected, does actually work here.
So 0.1, that's correct.
But remember in C-- let me
dig myself out of this hole--
remember in C what happened
if we dug a little deeper
and we looked a little past
the first decimal point.
So how do I do this in Python?
It's actually pretty similar.
Let me go ahead and not just
show myself z but go ahead
and print out to, let's say, two
decimal places that same value.
The syntax here is weird.
It's different from C. But you literally
take the variable that you want

Arabic: 
أو 1 زائد 10 يساوى 11؟
أجل؟
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: انتظروا، انتظروا، انتظروا.
معذرة.
الجمهور: [INAUDIBLE]
[LAUGHTER]
ديفيد ج. مالان: هذا يعيدني إلى وجهة نظري السابقة 
وهي كم أنا متعب.
إذن هذا صحيح.
إذن Python تقوم بالعملية الحسابة بشكل صحيح.
لكن-- حسنًا، هذا أمر مروع.
حسنًا، إذن الآن دعونا نقوم بالقسمة
ونحاول
نجعل النقطة أعتقد أنني قصدتُ في وقت
متأخر من الليلة الماضية حيث إذا قسمتُ 1
على 10، حسنًا، 1 مقسوم على 10،
كما هو متوقع، هل ينجح الأمر هنا بالفعل.
إذن 0.1، هذا صحيح.
ولكن تذكرون في C-- دعوني
أخرِج نفسي من هذا المأزق--
تذكرون في C 
ماذا حدث لو تعمقنا أكثر قليلاً
ونظرنا قليلاً في
النقطة العشرية الأولى.
إذن كيف أقوم بفعل ذلك في Python؟
الأمر متشابه للغاية في الواقع.
دعوني أمضي قدمًا وليس فقط
أعرض بنفسي z لكن أمضى قدمًا
وأطبعه، دعونا نقول،
لموضعين عشريين هذه القيمة نفسها.
الصيغة هنا غريبة.
انها مختلفة عن C. لكنكم حرفيًا
تأخذون المتغير الذي تريدون تنسيقه،

Arabic: 
وتضعون نقطتين
ومن ثم نقطة--
لأنكم تريدون ضبط النقطة--
ومن ثم تريدون
أن تقولوا شيئًا مثل 2f.
لذا هذا يقول، مرحبًا،
Python، قم بتنسيق المتغير
الموجود على يسار النقطتين
باستخدام نقطتين عشريتين.
وبالمناسبة، إنها قيمة
كسرية حقيقة.
إذن f هذا له معنى مختلف.
هذا هو f كما هو في قيمة كسرية.
f على اليسار منسق.
إذن دعوني أمضي قُدمًا وأشغل هذا.
1 مقسوم على 10.
وحسنًا، ما يزال الأمر جيد جدًا.
إذن دعونا نقوم بذلك ربما ثلاثة مواضع
عشرية، ونحفظ ذلك، ونعيد تشغيله.
1 مقسوم على 10.
ما يزال الأمر جيدة جدًا.
دعونا نكون طموحين قليلاً.
دعونا نقوم بها 50 موضع 
عشري، مقسوم على 10، واللعنة.
لم تقم Python بحل
تلك المشكلة الأساسية.
إذن كيف نصف تلك المشكلة؟
ما هي الكلمة الطنانة هنا 
لشرح أو حل تلك المشكلة؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: هذا هو تجاوز عدد
صحيح، مرتبط في جوهره.
يحدث تجاوز العدد الصحيح
حرفيًا عندما
تقومون بإضافات كثيرة ويتحول شيء ما
من قيمة كبيرة

English: 
to format, you put a
colon and then a dot--
because you want to adjust the dot--
and then you want to
say something like 2f.
So this is saying, hey,
Python, format the variable
that's to the left of the
colon using two decimal points.
And by the way, it's a
floating point value.
So this f has a different meaning.
This is f as in float.
The f to the left is in format.
So let me go ahead and run this.
1 divided by 10.
And OK, still looking pretty good.
Let's do maybe three decimal
places, save that, rerun it.
1 divided by 10.
Still pretty good.
Let's get a little ambitious.
Let's do it 50 decimal places
out, 1 divided by 10, and damn it.
Python has not fixed
this fundamental problem.
So we describe this problem as what?
What's the sort of buzzword here to
sort of explain or forgive this issue?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: This is an integer
overflow, related in spirit.
Integer overflow literally
happens when you're
doing lots of addition and something's
rolling over from a big value

Arabic: 
إلى صغيرة أو حتى سالبة.
متشابه في جوهره.
أجل؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: أجل.
إذا كنتم تريدون
كمية غير محدودة من الدقة دائمًا،
فتحتاجون إلى كمية غير محدودة من الذاكرة.
ولا يحتوي Mac أو جهاز الكمبيوتر الشخصي أو الهاتف
على كمية غير محدودة من الذاكرة.
في مرحلة ما، يتم رسم خط في الرمل
ويمكنكم أن تكونوا دقيقين للغاية فقط.
ولذا كان عدم الدقة هو التناظر
في عالم القيم الكسرية
لتجاوز، تذكرون، حيث إذا كان لديكم
فقط عدد غير محدود من وحدات البت
يمكنكم القيام به بشكل جيد إلى نقطة ما.
لكن في النهاية، قام جهاز الكمبيوتر
بتقييم تلك القيمة من أجلك
لأنه لا يمكنك أن تمثل
عدد غير محدود من القيم.
إذن هذا يعني أن Python 
محدودة فقط، بشكل أساسي،
مثل بعض اللغات الأخرى
مثل C. لذا لم نتخلص
من جميع تلك المشاكل.
لكن بصراحة، في عالم
علم البيانات والتحليلات،
هي بالتأكيد عمليات حسابية دقيقة
ومهمة.
لذا هناك حلول لهذه المشكلة.
لكنها تتطلب مكتبات
خاصة، عادة،
استيراد شيء يتيح
لكم استخدام أكبر قدر من الذاكرة
لأنكم تحتاجون كمية أكبر
من حجم الذاكرة الافتراضي.

English: 
to a small or even a negative.
Similar in spirit.
Yeah?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Yeah.
If you want to have an infinite
amount of precision all the way out,
you need an infinite amount of memory.
And no Mac or PC or phone has
an infinite amount of memory.
At some point, a line is drawn in the
sand and you can only be so precise.
And so imprecision was the analog
in the floating point world
to overflow, recall, where if you
only have a finite number of bits
you can do really well up to a point.
But eventually, the computer's
got to estimate that value for you
because you can't represent
an infinite number of values.
So this is to say Python is
just as limited, fundamentally,
as some other languages
like C. So we've not
gotten rid of all of those problems.
But frankly, in the world of
data science and analytics,
it's certainly important
precise mathematics.
So there are solutions to this problem.
But it requires special
libraries, typically,
importing something that allows
you to use as much memory
as you want more than just
the default amount of memory.

Arabic: 
لذا ما تزال تلك المشكلة موجودة.
دعوني أمضي قدمًا وأفتح
مثالاً آخر هنا.
وفي الحقيقة، في C، ستتذكرون
أنه كان لدينا هذا المثال هنا.
في C كان لدينا برنامج يُسمى overflow.c.
ولاحظوا أن تلك التعليمة البرمجية
في C منذ بضعة أسابيع
مضروبة فقط i في 2، في 2، في 2.
لذا كانت تتضاعف، إذا جاز 
التعبير--
1 إلى 2، إلى 4، إلى 8، و16،
و32، و64، وهكذا.
ما الذي كان سيحدث إذا انتظرنا 
مدة كافية وشاهدنا هذا البرنامج
منذ بضعة أسابيع؟
الجمهور: ستحصل على 5
مليار بدلاً من--
ديفيد ج. مالان: نعم، سنحصل على
5 مليار أو 4 مليار تقريبًا--
أو بالأحرى، سنحصل من الناحية الفنية،
على ما أعتقد، على 2 مليار، ومن ثم تحوّل.
وحدثت مشكلة نتيجة عن ذلك في الواقع.
إذن دعوني أقوم بذلك بالفعل.
دعوني أمضي قدمًا وأكتب make overflow
حتى نتمكن من توضيح النقاط
التي أشرتَ إليها في وقت سابق بشأن
تجاوز عدد صحيح، وهي، في الواقع،
هذه النقطة.
دعوني أمضي قُدمًا وأشغّل overflow.
سأقوم بتكبير شاشتي فقط حتى يمكننا
جعلها مناسبة أكثر قليلاً على الشاشة.
وبما أن ذلك يعمل--
عذرًا، دعوني أصلح هذا.
ها نحن ذا.

English: 
So that problem there still exists.
Let me go ahead and open
up one other example here.
And in fact, in C, you'll recall
that we had this example here.
In C we had a program called overflow.c.
And notice that this code
in C from a few weeks
back just multiplied i by 2, by 2, by 2.
So it was doing
exponentiation, so to speak--
1 to 2 to 4 to 8, 16,
32, 64, and so forth.
What happened if we waited
long enough and watched
this program a few weeks back?
AUDIENCE: You go to 5
billion instead of--
DAVID MALAN: Yeah, we hit
roughly 5 billion or 4 billion--
or rather, we technically hit, I think,
2 billion, and then it rolled over.
And it actually created a problem.
So let me actually do this.
Let me go ahead and make
overflow so we can demonstrate
the points that you made earlier about
integer overflow, which is, indeed,
this one.
Let me go ahead now and run overflow.
I'll expand my window just so we
can fit a little more in the screen.
And as this runs--
whoops, let me fix this.
Here we go.

Arabic: 
دعوني أمضي قدمًا وأكتب make overflow.
والآن 1، و2، و4، و8،
و16، و32، وهكذا.
إنها بطيئة بعض الشيء في البداية،
ولكن المضاعفة والمضاعفة
ستجعلنا نصل إلى قيمة كبيرة
بسرعة كبيرة.
سيتجاوز هذا فى الواقع
بمجرد أن نصل إلى 2 مليار تقريبًا.
لماذا؟
لماذا اثنين مليار، معطاة أو مأخوذة؟
لماذا هذه القيمة في C؟
أجل؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: نعم، هذا هو العدد الذي
يمكن أن يقوم عدد صحيح بتخزينه
لأننا نستدعي C. عادة ما يكون العدد الصحيح
32 وحدة بت أو 4 وحدات بايت.
وباستخدام 32 وحدة بت، يمكنك تمثيل
القيمة المحتملة بمقدار أربعة مليارات.
وإذا كان نصف هذه القيم
إيجابي ونصفها الآخر سلبي،
فمن المنطقي أن يرمز هذا إلى السبب في أن
أعلى رقم يمكنك حسابه هو 2 مليار تقريبًا.
وبالفعل، عندما نحاول فقط حساب
مضاعفة المليار الواحد، سنقوم بتجاوزه.
إذن بالنسبة إلى وجهة نظرك السابقة،
ما يزال التجاوز يعد مشكلة،
لكن في سياق الأعداد الصحيحة.
لكن الآن دعونا نحاول استخدم إصدار
Python من هذا.
دعوني أمضي قُدمًا الآن وأشغّل overflow.py،
وهو برنامج كتبتُه مسبقًا.
إنه على موقع الويب الخاص
بالدورة، كما هو الحال دائمًا،
إذا كنتم ترغبون في إلقاء نظرة عليه عن كثب.

English: 
Let me go ahead and make overflow.
And now 1, 2, 4, 8,
16, 32, and so forth.
It's a little slow to start,
but doubling and doubling
is going to get us up to a
big value pretty quickly.
This is indeed going to overflow
once we hit roughly 2 billion.
Why?
Why two billion, give or take?
Why that value in C?
Yeah?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Yeah, that's
how much an integer
can store because we're calling C. An
int is typically 32 bits or 4 bytes.
And with 32 bits, you can represent
four billion possible values.
And if half of those values are
positive and half of them are negative,
it stands to reason that the highest
you can count is roughly 2 billion.
And indeed, once we try to count up
just doubling one billion, we overflow.
So to your point earlier,
overflow is still an issue,
but in the context of integers.
But now let's try a
Python version of this.
Let me go ahead now and
open up overflow.py,
which is a program I wrote in advance.
It's on the course's
website, as always, if you
want to take a look more closely.

Arabic: 
وإذا انتقلتُ إلى هذا الملف من الأسبوع
الأول، overflow.py، فإننا سنرى هذه التعليمة البرمجية.
إذن هي تقريبًا نفسها.
لكن لاحظوا أنني استخدم مكتبة أخرى
نحن لم نرها من قبل،
from time import sleep.
إنها لطيفة إلى حد ما.
لذا يتيح لي هذا السكون لمدة ثانية.
سيصبح هذا أمرًا مملاً بسرعة،
لكن هذا جيد.
دعونا نقوم بهذا بسرعة.
إذا انتقلتُ إلى دليل المصدر
السادس، من الأسبوع الأول،
وقمتُ بتشغيل Python of overflow.py، إنها
الدالة نفسها-- أو البرنامج نفسه،
وظيفيًا.
لكن بصراحة، أصبح هذا
أمرًا مملاً بعض الشيء.
دعونا نمضي قدمًا ونزيل السكون لمدة ثانية،
ونقوم بالحفظ وإعادة التحميل.
دعونا فقط نقم بتشغيل هذا الشيء.
يا للعجب، انظروا إليه.
فقط هناك.
انظروا للأعلى هناك.
ما الذي تقوم به بشكل مختلف؟
إنها تعدُّ أكثر بكثير
من 2 مليار.
إذن ما الذي قد تستنتجونه
بشأن الأعداد الصحيحة في Python؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: كرري ذلك؟
الجمهور: العدد الصحيح محدد
ليكون عددًا كبيرًا من وحدات البت.
ديفيد ج. مالان: حسنًا، العدد الصحيح محدد
ليكون عددًا كبيرًا من وحدات البت.
وبالفعل، هذا هو الحال.

English: 
And if I go into this file in weeks
one, overflow.py, we see this code.
So it's almost the same.
But notice I'm using another
library that we've not
seen before, from time import sleep.
It's kind of cute.
So this allows me to sleep for a second.
That's going to get tedious
quickly, but that's OK.
Let's do this real fast.
If I go into the source
six directory, weeks one,
and run Python of overflow.py, it's
the same function-- or same program,
functionally.
But honestly, this is
getting a little tedious.
Let's go ahead and not sleep for a
second every time, save and reload.
Let's just run the thing.
Whew, look at it go.
Only up there.
Look up there.
What's it doing differently?
It's counting a lot
higher than 2 billion.
So what might you infer
about integers in Python?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Say again?
AUDIENCE: An integer is defined
to be quite a number of bits.
DAVID MALAN: OK, an integer is
defined to be quite a number of bits.
And indeed, that's the case.

English: 
Python is not actually this slow.
It's because we're running a web
based IDE and the internet itself
is a little slow.
And so what's happening here is just
the internet is getting in the way.
But suffice it to say that Python is
counting up way, way higher than C was.
And that's the power you get by
just using larger data types.
We could have done this in C. We
could have used longs, for instance.
But notice that with Python you just
get more by default out of the box.
Let's go ahead and take
a five minute break here.
And when we resume, we'll
introduce some more syntax
and solve some more problems.
All right, so let's take a
look at a few other examples
that are comparable to what we did
back in week one and look at a few
from week two and three
and really take a look
not just at the syntax, ultimately,
but some of the features of Python.
And of course, we need the ability
to express ourselves conditionally
or logically with control flow.
And so let me propose
a quick program here
that we'll just call conditions.py,
reminiscent of conditions.c
some time ago.
Let me go ahead and import
from CS50 getInt this time
and get myself another x
with getInt x from the user.

Arabic: 
Python ليست في الحقيقة بطيئة هكذا.
إن ذلك بسبب أننا نشغّل IDE القائمة على
شبكة ويب وشبكة الإنترنت نفسها
بطيئة بعض الشيء.
ولذا ما يحدث هنا فقط هو أن شبكة الإنترنت 
بطيئة بهذا الشكل.
لكن يكفي أن نقول أن Python تعدّ ما هو أعلى،
بكثير مما تعدّه C.
وهذه هي الطاقة التي تحصلون عليها 
فقط باستخدام أنواع بيانات أكبر.
كان يمكن أن نقوم بذلك في C. 
ونستخدم longs، على سبيل المثال.
لكن لاحظوا أنه باستخدام Python تحصلون
على أشياء أكثر بشكل افتراضي خارج الصندوق.
دعونا نمضي قدمًا ونأخذ
استراحة لمدة خمس دقائق.
وعندما نستأنف، سنقدم
بعض الصيغ الأخرى
وسنحل بعض المشاكل الأخرى.
حسنًا، إذن دعونا نلقي
نظرة على بعض الأمثلة الأخرى،
التي يمكن مقارنتها بما قمنا به
في الأسبوع الأول ونلقي نظرة على بعض الأمثلة
من الأسبوع الثاني والثالث
ونلقي نظرة بالفعل
ليس فقط على الصيغة، في النهاية،
ولكن على بعض ميزات Python.
وبالطبع، نحتاج إلى القدرة
على التعبير عن أنفسنا بشكل مشروط
أو منطقي باستخدام التحكم في التدفق.
ولذا دعوني أقترح
برنامج سريع هنا
سنسميه conditions.py فقط،
ليذكرنا بـ conditions.c
منذ مدة قصيرة.
دعوني أمضي قدمًا وأقوم باستيراد
getInt من CS50 هذه المرة
وأحصل لنفسي على x آخر
باستخدام getInt x من المستخدم.

Arabic: 
ثم دعوني أمضي قدمًا وأطلب منه
getInt y من المستخدم.
ومن ثم دعوني أمضي قُدمًا
و أقارن بينهما.
وهكذا بحسب المقارنة التي قمنا بها هنا
باستخدام Scratch منذ قليل،
يمكنني القول ببساطة إذا كان x
أقل من y، ثم أمضي قدمًا
وأطبع، على سبيل المثال، أطبع x 
أقل من y، تمامًا كما فعلنا منذ أسابيع.
Elif إذا كان x أكبر من y،
يمكننا المضي قدمًا
وطباعة x أكبر من y.
ومن ثم ما يزال لدينا
الشرط الثالث، else،
تمامًا كما في C، حيث نطبع، 
على سبيل المثال، الاستنتاج المنطقي.
x يساوي y.
لذا للإشارة فقط إلى
بعض الاختلافات،
المسافة البادئة مهمة جدًا الآن.
ويجب أن تكون منسقة.
لا يمكنكم الحصول على أربع مسافات وثلاث.
يجب أن تكون لديكم، على سبيل المثال، 
أربع مسافات على طول الطريق.
لاحظوا أن لدي النقطتين
منسقتين هناك.
لكن لاحظوا أنني لا أحتاج إلى كلا القوسين،
بعد الآن.
وباستخدام Python، توجد كلمة
طنانة إلى حد ما، Pythonic.
هناك طريقة بايثونية للقيام بالأشياء.
يمكنكم الحصول على قوسين حول x،
أقل من y، أو x أكبر من y،
تمامًا كما فى C. لكنها على الأرجح لا تضيف
أي شيء بشكل منطقي.
وإذا لم تجعل تعليمتك البرمجية
قابلة للقراءة بشكل أكبر،

English: 
Then let me go ahead and ask
them for getInt y from the user.
And then let me go ahead
and just compare them.
And so per our comparison
with Scratch a bit ago,
I can simply say if x is
less than y, then go ahead
and print out, for instance, print x is
less than y, just as we did weeks ago.
Elif if x is greater
than y, we can go ahead
and print out x is greater than y.
And then we can still have a
third condition, else, just
like in C, where we print out, for
instance, the logical conclusion.
x is equal to y.
So just to point out
some of the differences,
indentation is ever so important now.
And it's got to be consistent.
You can't have four spaces and three.
You've got to have, for
instance, four all the way.
Notice that I've got the
colons consistently there.
But notice that I don't need the
parentheses, either, anymore.
And with Python, there's
sort of a buzzword, Pythonic.
There is a Pythonic way of doing things.
You can have parentheses around x,
less than y, or x greater than y,
just like in C. But it doesn't
add anything logically, arguably.
And if it doesn't make
your code more readable,

Arabic: 
فلا تجعلها فوضوية
باستخدام أحرف إضافية.
ولذا هذه الآن قاعدة ثابتة عامة.
تقوم Python بتشذيب أكبر عندما
يتعلق الأمر بالصيغة، فقط
تقدمها عندما تقوم بحل مشكلة بالفعل،
وهي في هذه الحالة،
ليست موجودة بالفعل.
أجل؟
الجمهور: سؤال سريع، السطور [INAUDIBLE]،،
هذه مجمعة معًا الآن،
واحدًا تلو الآخر، واحدًا تلو الآخر
وواحدًا تلو الآخر.
إذا وضعتَ
سطرًا إضافيًا بينهم،
هل سيكسر ذلك التعليمة البرمجية؟
ديفيد ج. مالان: لا، لا على الإطلاق.
يمكنني أن أضع العديد من المسافات
بشكل رأسي بقدر ما أريد.
أريد أن أضيف بعض التعليقات، بالطبع،
يمكنني القيام بذلك.
ولماذا لا نقوم بذلك، في الحقيقة،
لأن صيغة التعليق
للغة Python مختلفة قليلاً.
في C، لقد اعتدنا على
وضع خط مائل خط مائل.
Python، إنها بالفعل مختصرة قليلاً.
يمكنكم فقط استخدام علامة تجزئة واحدة.
ويمكنكم قول احصل على x من المستخدم هنا.
يمكنكم قول احصل على y من المستخدم هنا.
ومن ثم يمكنني قول شيء ما 
مثل قارن x وy.
وإذا أردتُ هذا حقًا،
فيمكنني وضع تعليقات هنا.
هذا حقًا رائع للغاية.
لكن سأحتفظ به بشكل مضغوط أكثر
باستخدام ذلك المثال المعين.
حسنًا أي أسئلة عن الصيغة المشروطة
أو ما قمنا به فقط هنا؟
حسنًا، دعوني أعرض
مثالاً آخر،
هذه المرة سأقوم ببعض المقارنات.

English: 
don't clutter your code
with additional characters.
And so that's a general
rule of thumb now.
Python is much more trim
when it comes to syntax, only
introducing it when it really solves
a problem, which in this case,
it doesn't really.
Yeah?
AUDIENCE: Quick question,
the lines [INAUDIBLE],,
those are grouped right together,
one to the next, one to the next,
and one to the next.
If you were to put an
additional line between them,
would that break the code?
DAVID MALAN: No, not at all.
I can have as much whitespace
vertically as I want if.
I want to add some comments,
indeed, I can do that.
And why don't we do that, in fact,
because the commenting syntax
for Python is a little different.
In C, we were in the habit
of doing slash slash.
Python, it's actually
a little more succinct.
You can just use a single hash.
And you can say gets x from user here.
I can say get y from user here.
And then I can say something
like compare x and y.
And if I really wanted to, I
could put comments in here.
That is perfectly fine.
But I'll just keep it more compact
with this particular example.
So any questions on the conditional
syntax or what we've just done here?
All right, let Me whip
up another example,
this time doing some comparisons.

English: 
This time, let me create
a file called answer.py,
which is reminiscent of a quick example
we did weeks ago called answer.c.
Let me go ahead and from
CS50 import getString.
And this time, let me
go ahead and declare
a variable, C. And let me go ahead
and get a string from the user--
whoops-- get a string from
the user for their answer
to whatever question
it is we care about.
And then if it's meant to be a
yes/no answer, let's check for that.
If c equals equals y or
c equals equals little y,
then go ahead and say, just
for the sake of demonstration,
yes, because the human
presumably meant that.
Elif c equals equals capital
n or c equals equals little n,
then go ahead and print
out, for instance, no.
So a short program, but what
are some of the takeaways?
Well, what's different clearly among
these lines, 5 through 8, versus C,
weeks ago?
Yeah.
AUDIENCE: For or you have to do--
DAVID MALAN: Yeah, none of those
stupid vertical bars or the ampersand
ampersand.

Arabic: 
هذه المرة، دعوني أقوم بإنشاء
ملف يُسمى answer.py،
وهو يذكرنا بالمثال السريع
الذى قمنا به منذ أسابيع الذي يُسمى answer.c.
دعوني أمضي قدمًا ومن CS50
أقوم باستيراد getString.
وهذه المرة، دعوني أمضي قدمًا
وأعلن عن
متغير، C. ودعوني أمضي قدمًا
وأحصل على سلسلة من المستخدم--
عذرًا-- أحصل على سلسلة
 من المستخدم لإجابته
عن أي سؤال
هذا ما نهتم به.
ومن ثم إذا كانت الإجابة بنعم/لا،
دعونا نتحقق من ذلك.
إذا كان c يساوي يساوي y
أو c يساوي يساوي حرف y صغير،
ثم أمضى قدمًا وأقول،
فقط من أجل الإثبات،
نعم، لأنه من المفترض أن
يعني الشخص ذلك.
Elif c يساوي يساوي حرف n كبير
أو c يساوي يساوي حرف n صغير،
ثم أمضى قدمًا وأطبع،
على سبيل المثال، لا.
إذن برنامج قصير،
لكن ماذا عن بعض الملاحظات السريعة؟
حسنًا، ما هو المختلف بشكل واضح ضمن تلك السطور،
5 عبر 8، مقابل C،
منذ أسابيع؟
أجل.
الجمهور: بالنسبة إلى أو يجب أن تقوم بـ--
ديفيد ج. مالان: أجل، ليس اي من تلك 
الأشرطة الرأسية الغبية أو علامة العطف
علامة العطف.

English: 
If you want to do something or or
and it together, just say and and
or, much like Scratch,
actually, some weeks ago.
Notice, too-- how are
we comparing strings?
Turns out Python does
not have chars, per se.
C did have chars, single characters.
Python only has strings.
It has strings, ints, floats,
and then some fancier things,
but it doesn't have chars.
So that's why I am
deliberately using string.
But when we use strings in C,
how did we compare two strings?
Str comp, right, because of the whole
annoying pointer comparison thing.
Well, it turns out now
in Python if you want
to compare two strings character
by character by character,
equal equals is back.
And it does exactly what you expect
it to do, even if it's a full word.
So if you're actually checking for, for
instance, yes or yes from the human,
you can still use equal equals,
as well, even though it's
more than now one character.
So that's a wonderful feature, too.
And it just makes the code
more readable and a lot easier
to write right out of the gate.

Arabic: 
لكن إذا أردتم القيام بشيء ما أو
أو وهذا معًا، فقط قولوا و و
أو، مثل سكراتش فى الواقع،
منذ بضعة أسابيع.
لاحظوا، أيضًا-- كيف نقارن
بين السلاسل؟
يتضح أن Python لا تحتوي على chars،
في حد ذاتها.
تحتوي C على chars، أحرف منفردة.
تحتوي Python فقط على سلاسل.
تحتوي على سلاسل، وأعداد صحيحة، وقيم كسرية،
وبعض الأشياء الرائعة،
لكن لا تحتوي على chars.
لهذا السبب أنا أستخدم
السلسة بشكل متعمد.
لكن عندما نستخدم السلاسل فى C،
كيف قمنا بمقارنة سلسلتين؟
Str comp، حسنًا، بسبب
مسألة مقارنة المؤشر المزعجة بأكملها.
حسنًا، يتضح الآن
في Python إذا كنتم تريدون
مقارنة سلسلتين
حرف بحرف بحرف،
سترجع علامتي يساوي يساوي.
وتقوم بما تتوقع أن تقوم به
بالضبط، حتى لو كانت كلمة كاملة.
لذلك إذا كنت تحقق بالفعل من، على سبيل المثال،
نعم أو نعم من الشخص،
ما يزال بإمكانك استخدام علامتي يساوي يساوي
أيضًا، على الرغم من أنه
أكثر من حرف واحد الآن.
إذن هذه ميزة رائعة، أيضًا.
وهذا يجعل التعليمات البرمجية فقط
قابلة للقراءة ويمكن كتابتها
بسهولة أكثر ومن دون أي تردد.

Arabic: 
حسنًا، تذكرون الآن أننا
في C قد أمضينا بعض الوقت،
وكذلك في سكراتش، حيث ألقينا نظرة
على بعض الأمثلة الخاصة بالسعال،
من جميع الأشياء.
وفي الواقع، في Python وC--
بدلاً من ذلك، في سكراتش وC--
قمنا بمثال الصفر الذي
يبدو إلى حد ما مثل هذا.
إذا كنتم ترغبون في محاكاة فكرة
سكراتش سعال القط،
قد تقومون بذلك، بالطبع.
ومن ثم إذا كان سيسعل
ثلاث مرات، فقد تقومون بذلك.
وقمنا بتشغيل هذا وظهر فقط
سعال، سعال، سعال على الشاشة.
لن أحمل نفسي عناء تشغيله
لأنه سيقوم بذلك فقط.
ولكن كان هذا تصميمًا سيئًا
زعمنا القيام به منذ أسابيع.
ما هي خلاصة
السبب في أن هذا تصميم سيء؟
أعني، إنني حرفيًا قمتُ بنسخه ولصقه.
والاحتمالات هي إذا قمتَ بهذا
في CS50 أو في البرمجة
بشكل عام أكثر، فمن المحتمل أنك
ستكون كسولاً قليلاً
وهناك طريقة أفضل للقيام بذلك.
وهي طريقة قابلة
للصيانة بشكل أكبر للقيام بذلك.
إذن بالطبع، قدّمنا منذ أسابيع،
في كل من سكراتش وفي C،
القدرة في cough1،
هذه المرة، على القيام بتكرار حلقي.
ويمكنني إجراء تكرار حلقي بشكل مختلف قليلاً
في Python وفي C. لكن فيما يخص i
في النطاق 3، امضي
قدمًا واطبع سعال.
وبالتالي فإن الصيغة
للتكرار الحلقي مختلفة قليلاً.

English: 
All right, so now recall that
in C we spent a little while,
as well as in Scratch, taking a look
at a few examples about coughing,
of all things.
And in fact, in Python and C--
rather, in Scratch and in C--
we did a zero example that
looked a little like this.
If you want to simulate the notion
of Scratch the cat coughing,
you might, of course, do this.
And then if he's going to cough
three times, you might do this.
And we ran this and it just did
cough, cough, cough on the screen.
I won't bother running it
because it will just do that.
But this was bad design
we claimed weeks ago.
What was the gist of
why this is bad design?
I mean, I literally copied and pasted.
And the odds are if you're ever
doing that in CS50 or in programming
more generally, you're
probably being a little lazy
and there's a better way to do it.
And it's a more
maintainable way to do it.
So of course, we introduced weeks
ago, both in Scratch and in C,
the ability to in cough
one, this time, do a loop.
And I can do a loop slightly differently
in Python and in C. But for i
in the range of 3, go
ahead and print out cough.
So the syntax for the for
loop is a little different.

Arabic: 
لكنها مباشرة للغاية،
على الرغم من ذلك،
بمجرد أن تتذكروا استخدام for،
اسم المتغير، ثم
حرف الجر in، ومن ثم نطاق
الكلمة داخل قوسين و--
قوسين والقيمة التي 
تريدون الاهتمام بها.
لكن سنحت لنا فرصة، تذكرون، 
تجريد السعال في الواقع.
السعال، في الشكل النصي على الأقل،
فقط القيام بطباعة شيء.
إذن قدّمنا في الإصدار 
الثاني منذ فترة،
النهج التالي في cough2.
وبدلاً من ذلك قمتُ بتعريف دالة تُسمى 
cough لتقوم بالسعال من أجلي.
ولم نرى هذا حتى الآن في Python.
إذن كيف تقومون بتعريف دالة 
في Python تُسمى cough؟
وبعبارة أخرى، كيف تقومون بإنشاء 
قطعة لغز مخصصة خاصة بكم،
مثلما فعلنا في لغة سكراتش؟
حسنًا تقومون بتعريفها باستخدام def.
ومن ثم تجعلونها تقوم 
بما تريدونه بالضبط
أن تقوم به فقط من خلال وضع مسافة بادئة بين سطور
التعليمة البرمجية التي تنتمي إلى تلك الدالة.
لذلك لا توجد قيمة مرتجعة.
لا نحتاج إلى 
مدخل في هذه اللحظة.
لكن لدينا النقطتين.
ولدينا المسافة البادئة.
لا توجد أقواس متعرجة، ولا شيء آخر.
كيف يُمكنني الآن استخدام هذه الدالة؟
حسنًا، هنا حيث توجد لدينا بضعة خيارات 
بشكل نمطي في البرنامج.

English: 
But it's pretty
straightforward, nonetheless,
once you remember that you
use for, variable name, then
the preposition in, and then the word
range with a parenthesis and its--
parentheses and the value
you want to care about.
But then we saw an opportunity, recall,
to actually abstract coughing away.
Coughing, at least in our textual form,
is just the act of printing something.
So we introduced in
version two some time ago,
the following approach in cough two.
I instead defined a function called
cough that did the coughing for me.
And we've not seen this yet in Python.
So how do you define a function
in Python called cough?
Put another way, how do you make
your own custom puzzle piece,
just as we did in Scratch?
Well, you define it with def.
And then you have it do
exactly what you want
it to do by just indenting the lines
of code that belong to that function.
So there's no return value.
There's no need for an
input at the moment.
But we do have the colon.
And we have the indentation.
No curly braces, nothing else.
How do I now use this function?
Well, here's where we have a few
options stylistically in the program.

English: 
The simplest way to call this function
would be quite simply like this.
Go ahead and for i in range
3, go ahead now and cough.
And this should look a little weird.
It looks, indeed, a little sloppy.
But let's see if it works.
So if I go ahead and run
Python of coughtwo.py,
it seems to cough, cough, cough.
But I say this is a little
weird because what am I
doing that's very different now from C?
There's no what?
There's no main function.
I just have some code right
here on the left of the screen.
And yet, I do have a function here.
And in Python, this is OK.
Because you're using an
interpreter and reading the file
top to bottom, left to right, you don't
strictly need a function called main.
It's just going to
interpret all of your code.
And when it's seen the
definition of a function, OK.
It's going to say, OK, got it.
I now know what the verb cough means.
I will do this anytime
I see it down here.
But we're going to run into a problem.
And if, indeed, I did what
my first instinct was,

Arabic: 
ستكون أبسط طريقة لاستدعاء هذه
الدالة هي بسيطة تمامًا هكذا.
امضي قدمًا واكتب for i في النطاق 
3، امضي قدمًا وcough.
ويبدو هذا غريبًا قليلاً.
يبدو، بالفعل، أمرًا سيئًا قليلاً.
لكن دعونا نرى إذا نجح الأمر.
إذن إذا مضيتُ قدمًا وقمتُ بتشغيل
Python من coughtwo.py،
تبدو هكذا cough ،cough ،cough.
ولكن أقول هذا أمر غريب 
قليلاً لأن الشيء الذي
أقوم به مختلف للغاية الآن عن C؟
لا توجد ماذا؟
لا توجد دالة main.
فقط لدي تعليمة برمجية هنا
على يسار الشاشة.
ومع ذلك، لدي دالة هنا.
وفي Python، هذا جيد.
لأنكم تستخدمون المترجم
وتقرأون الملف
من الأعلى إلى الأسفل، من اليسار إلى اليمين،
لا تحتاجون إلى دالة تُسمى main على وجه التحديد.
سيقوم فقط بتفسير 
جميع تعليمتكم البرمجية.
وعندما يرى 
تعريف الدالة، حسنًا.
سيقول، حسنًا، فهمت ذلك.
أعرف الآن ما الذي يعنيه الفعل يسعل.
وسأفعل هذا في أي وقت 
أرى فيه هذا بالأسفل.
لكننا سنواجه مشكلة.
وإذا، اتّبعتُ بالفعل حدسي الأول،

Arabic: 
وهو وضع المنطق، الجزء 
الرئيسي من برنامجي في الأعلى
وأقوم بتعريف cough هنا بالأسفل، 
دعونا نرى ما يحدث.
دعوني أقوم بالتصغير.
دعوني أمضي قدمًا وأعيد تشغيل coughtwo.py.
والآن نبدأ برؤية
أول رسائل الأخطاء.
وستبدو مشفرة فقط كما كانت
منذ الوهلة الأولى كما كان clang
وmake.
أكد البقية أنه يمكن أن تساعد help50
برسائل الأخطاء في Python، أيضًا.
لكن دعونا نحاول فقط تحليل
ما أفهمه. cough2.py، السطر الثاني
في الوحدة أيًا كان ذلك، خطأ اسم.
الاسم cough غير محدد.
إذن ماذا يقول حدسك هنا؟
ما هذا حقًا--
ما هو توضيح هذا الخطأ؟
لأن السعال محدّد بوضوح--
حرفيًا باستخدام فعل def المُحدّد--
هناك على السطر الرابع الآن.
ماذا--
الجمهور: أنت تستدعي cough
قبل أن يتم تحديده.
ديفيد مالان: نعم، أحاول
استدعاؤه قبل أن يتم تحديده.
تحاول Python
أن تنقلني بشكل حرفي للغاية.
وستقوم بذلك من الأعلى
إلى الأسفل، من اليسار إلى اليمين.
وإذا لم ترى شيء حتى
الجزء السفلي
الذي من المفترض أن
تقوم به في الأعلى، فلن ينجح الأمر فقط.
لذا هناك حل لهذا
وأصبح هذا قبيحًا قليلاً.
لكنه حل عام أكثر.

English: 
which was to put the logic, the
main part of my program at the top
and to define cough down
here, let's see what happens.
Let me zoom out.
Let me go ahead and rerun coughtwo.py.
And now we start to see the
first of our error messages.
And they're going to look just as
cryptic at first glance as is clang
and make were.
Arrested assured that help 50 can help
with Python error messages, as well.
But let's just try to parse what I
do understand. cough2.py, line two
in module whatever that is, name error.
Name cough is not defined.
So what's your gut here?
What is that really--
what's the explanation for that error?
Because cough is clearly defined--
literally with the define def verb--
right there on line four now.
What--
AUDIENCE: You're calling
cough before it's defined.
DAVID MALAN: Yeah, I'm trying
to call it before it's defined.
Python is trying to
take me very literally.
And it's going to do top
to bottom, left to right.
And if it doesn't see
until the bottom something
it's supposed to be doing at the
top, it's just not going to work.
So there is a solution to this and
it starts to get a little ugly.
But it's a more generalized solution.

English: 
It turns out that even though main
is not required in a Python program,
many programmers just
create one nonetheless
to address this particular problem.
And they specifically
do something like this--
def main-- and then below it
they indent everything there.
And then you need one specific
feature to solve this problem now.
I've now defined main and I've
defined cough, which theoretically
solves this problem just
as it did in C. There
is no notion of a prototype in Python.
That is not the solution to copy paste
the name of the function up above.
But when I do this now,
literally nothing happens.
But I did get rid of the error.
So just reason through this, perhaps.
Especially if you've never
programmed Python before,
why might nothing now be happening?
AUDIENCE: Not calling main?
DAVID MALAN: I'm not calling main, yeah.
So whereas in C--
and frankly, in Java, C++, and a few
other languages-- main is special.
It just gets called by default.
In Python, main is not special.

Arabic: 
يتضح أنه على الرغم من أن main
غير مطلوبة في برنامج Python،
يقوم العديد من المبرمجين
بإنشاء واحدة فقط على الرغم من ذلك
لمعالجة هذه المشكلة الخاصة.
وهم على وجه التحديد
يفعلون شيئًا كهذا--
def main-- ومن ثم أسفلها
يزيحون كل شيء هناك.
ومن ثم يحتاجون إلى ميزة واحدة محددة
لحل هذه المشكلة الآن.
لقد حددتُ الآن main وحددتُ
cough، وهو من الناحية النظرية
يحل هذه المشكلة فقط
كما فعل في C. لا توجد
فكرة النموذج الأولي في Python.
هذا ليس حل نسخ ولصق
اسم الدالة أعلاه.
ولكن عندما أقوم بهذا الآن،
حرفيًا لا يحدث أي شيء.
لكنني تخلصتُ من الخطأ.
لذا مجرد سبب لهذا، ربما.
خاصة إذا لم تقوموا
ببرمجة Python من قبل،
لمَ قد لا يحدث شيء الآن؟
الجمهور: عدم استدعاء main؟
ديفيد مالان: أنا لا أستدعي main، نعم.
لذلك بينما في C--
وبصراحة، في Java، C++، وبعض
اللغات الأخرى-- تعد main أمرًا خاصًا.
يتم استدعاؤها بشكل افتراضي.
في Python، لا تعد main أمرًا خاصًا.

Arabic: 
لقد اخترتُ هذا الاسم main فقط
لأن العديد من اللغات الأخرى تستخدمها،
لكن ليست لها أهمية خاصة.
إذا كنت ترغب في استدعاء main،
يجب أن تقوم بذلك بنفسك.
ولذا هذا غريب
قليلاً، في الحقيقة.
ولكن يمكنك حرفيًا فعل ذلك هنا
لأنه سيتم تنفيذ تعليماتك البرمجية من الأعلى
إلى الأسفل، من اليسار إلى اليمين.
مع مرور الوقت يتم الوصول إلى السطر الزمني 10،
يتم تحديد كل من main
وcough،
مما يعني أنك على ما يرام.
لذا إذا انتقلتُ الآن إلى هنا وقمتُ بتشغيل Python
من cough2، الآن نجح الأمر في الواقع.
الآن، كملاحظة جانبية، هذا ليس
باثوني، إذا صح التعبير.
سيقوم معظم الأشخاص بذلك بالفعل
إذا كان الاسم يساوي يساوي main،
ثم يقوموا بهذا.
هذا للأسباب ذات المستوى المنحفض
دعوني لا أتطرق إلى هذا اليوم.
لكن خلاصة القول، إضافة هذا
السطر الذي يبدو مشفرًا
يحل المشاكل الأخرى
التي لن نتجاوزها
خلال هذا الأسبوع
وربما الأسبوع المقبل.
إذن هذه هي الطريقة الشائعة للقيام بذلك.
ولكن إذا تجاهلتُ ذلك فقط، فإن تأثير
هذه التعليمة البرمجية التي تبدو مشفرة
هو فقط أن تقوم باستدعاء main بنفسك
من أسفل ملفك.
لذا عندما نبدأ بكتابة
برامج مثير للاهتمام أكثر،
ستصبح هذه
تقليدية أكثر فقط.
إذا كنتَ ترغب في البدء بكتابة دالات الكتابة
وما إلى ذلك،

English: 
I've chosen this name main just
because so many other languages use it,
but it has no special significance.
If you want to call main,
you have to do it yourself.
And so this is a little
weird, admittedly.
But you can literally do this down here
because your code will be executed top
to bottom, left to right.
By the time line 10 is reached,
both main has been defined
and cough has been defined,
which means you're good to go.
So if I now go down here and run Python
of cough2, now it actually works.
Now, as an aside, this is
not Pythonic, if you will.
Most people would actually do this
if the name equals equals main,
then do this.
This is for lower level reasons that
let me wave my hand out for today.
But long story short, the addition
of this cryptic-looking line
solves other problems
that we're just not going
to trip over this week
and probably next.
So this is the common way to do it.
But if you just ignore that, the
effect of this cryptic-looking code
is just to call main yourself
at the very bottom of your file.
So when we start writing
more interesting programs,
this is just going to
become conventional.
If you want to start writing
functions and so forth,

English: 
odds are you'll benefit
by writing a main function
and putting more code in there.
So let's do one final example with
cough that actually now parameterizes
the code, just as we did weeks ago in
Scratch and C. This will be cough3.py.
Let me start as I did
just a little bit ago.
But suppose I want to
achieve this effect.
I want the computer to cough three
times by passing in an input.
I now do need to modify
cough to take an input.
And in C, I would have
said something like int n.
But you don't have to
specify data types in Python,
you just have to specify the
parameter name or the argument name.
So that's nice and simple.
And now down in here, in cough
is where I should probably
say for i in the range of 3, do this.
But this isn't quite right.
What fix do I want to make here?
Yeah.
Now I can just pass in n.
So range is just a function
that takes an argument that I've
been hard coding as three just because.
But you can generalize
it with n, as well.
So now again, per our discussion
of abstraction weeks and weeks
ago, do we have a sort of
beautiful version of coughing,

Arabic: 
فالاحتمالات هي أنك ستستفيد من خلال
كتابة دالة main
ووضع المزيد من التعليمات البرمجية هناك.
لنقم بمثال واحد أخير باستخدام
cough الذي يميز الآن بالفعل
التعليمة البرمجية، تمامًا كما فعلنا منذ أسابيع في
سكراتش وC. هذا سيكون cough3.py.
دعوني أبدأ كما فعلت
فقط منذ قليل.
لكن لنفترض أنني أريد
تحقيق هذا التأثير.
أريد الكمبيوتر أن يقم بالسعال ثلاث
مرات عن طريق التمرير في مدخل.
أنا الآن أحتاج إلى تعديل
سعال ليأخذ مدخل.
إذن في C، قلت 
شيئًا مثل int n.
ولكن لا يجب أن تحددوا
أنواع البيانات في Python،
يجب فقط أن تحددوا
اسم المعلمة أو اسم الوسيطة.
لذا هذا لطيف وبسيط.
والآن في الأسفل هنا، في سعال،
حيث يجب أن أقول
for i في النطاق 3، قم بهذا.
لكن هذا ليس صحيحًا تمامًا.
ما هو الإصلاح الذي أريد القيام به هنا؟
أجل.
الآن يمكنني فقط التمرير في n.
لذا النطاق هو مجرد دالة
تأخذ الوسيطة التي قمتُ
بترميزها بشكل ثابت كثلاثة لسبب ما فقط.
ولكن يمكنك تعميمها
باستخدام n، أيضًا.
و لذا الآن، مجددًا، في مناقشتنا
للتجريد منذ أسابيع وأسابيع،
هل لدينا إصدار
جيد من سعال إلى حد ما،

Arabic: 
على الرغم من أنه
يبدو مشفرًا أكثر.
ولكن خطوة بخطوة بخطوة
وصلنا إلى المغزى من
وجود دالة main التي
تأخذ التجريد، سعال.
قم بذلك عدة مرات.
الآن تفاصيل التنفيذ
مخبأة في قطع اللغز المخصصة هذه،
إذا صح التعبير.
ويبدأ السطران في الأسفل
للتو
بالتنفيذ الكامل للبرنامج.
لكن هذا هو الشيء الوحيد الذي
يحدد Python حقًا.
أجل؟
الجمهور: هل يمكننا استخدام دالة سعال
على السطر 11 [INAUDIBLE]؟؟
ديفيد مالان: هل يمكن استخدام دالة سعال
على السطر 11؟
نعم.
يمكنك بالتأكيد القيام بذلك،
على سبيل المثال، والتخلص من main مجددًا.
إنها مجرد تقليد.
بمجرد أن تبدأ بكتابة
برامج متطورة أكثر باستخدام دالات،
ربما يجب أن تقدم
main فقط لتبقيها مرتبة.
الجمهور: باستخدام [INAUDIBLE].
ديفيد مالان: يمكنك فعل ذلك.
ثم تبدأ في أن تكون غير باثوني.
على سبيل المثال، نعم، يمكنك أن تكتب cough3
ولكن سيطلب منك الأشخاص

English: 
even though it's looking
way more cryptic.
But by step by step by step
did we get to the point
of having a main function that
takes an abstraction, cough.
Do it this many times.
Now the implementation details are
hidden in this custom puzzle piece,
if you will.
And the two lines at
the bottom just kick off
the whole execution of the program.
But that's the only stuff that's
really Python-specific now.
Yeah?
AUDIENCE: Can we use the cough
function on line 11 [INAUDIBLE]??
DAVID MALAN: Could use the
cough function on line 11?
Yes.
You could absolutely just do this, for
instance, and get rid of main again.
It's just a convention.
Once you start writing more
sophisticated programs with functions,
you should probably introduce
main just to keep it tidy.
AUDIENCE: With the [INAUDIBLE].
DAVID MALAN: You could do that.
Then you're starting to be non-Pythonic.
Like, yes, you could do cough3
but people would look askew at you

English: 
because it's just not done that way.
That's what Pythonic means.
Yeah, other questions?
AUDIENCE: You need to have the
[INAUDIBLE] come after the for i
in range n so that it
knows what the cough is?
DAVID MALAN: Not in this case.
So the order now is OK because
first Python is seeing here's
the definition of main.
OK, I got it.
And then it's saying, here is the
definition of cough, OK, I got it.
But it's not actually
calling those functions yet.
The Python errors are thrown
only at what's called runtime,
the running of the program's time,
which means only when main is called
does Python actually
execute line 4 and then see,
ooh, I need to call a
function called cough.
But that's OK because it
saw it earlier when it first
read the file top to bottom.
So it matters when the
functions are called,
not where they appear, per se, in
the file, the order in which they're
called.
Other questions?

Arabic: 
لأن ذلك لن يتم بهذه الطريقة.
هذا ما تعنيه كلمة Pythonic.
نعم، أي أسئلة أخرى؟
الجمهور: تحتاج إلى أن يأتي
[INAUDIBLE] بعد for i
في نطاق n بحيث يعرف
ما هو سعال؟
ديفيد مالان: ليس في هذه الحالة.
لذا فالترتيب الآن مقبول
لأن Python الأولى ترى هنا
تعريف main.
حسنا، فهمت.
ثم تقول، ها هو
تعريف سعال، حسنًا ، فهمت.
لكنها لا تستدعي في الواقع
هذه الدالات حتى الآن.
يتم طرح أخطاء Python
فقط في ما يُسمى وقت التشغيل،
وقت تشغيل البرنامج،
والذي يعني فقط عندما يتم استدعاء main
تقوم Python فعليًا
بتنفيذ السطر 4 ومن ثم ترى،
أوه، أنا أحتاج إلى استدعاء دالة
تُسمى سعال.
ولكن هذا جيد لأنها
رأتها في وقت سابق عندما قرأت
لأول مرة الملف من الأعلى إلى الأسفل.
لذلك الأمر مهم عندما
يتم استدعاء الدالات،
وليس مكان ظهورها، في حد ذاته،
في الملف، الترتيب الذي يتم
استدعاؤها به.
أي أسئلة أخرى؟

Arabic: 
حسنًا، نعم؟
الجمهور: أنا لا أعرف
من أين تقوم [INAUDIBLE].
كيف تحدد n كعدد صحيح؟
ديفيد مالان: كيف أحدد
n كعدد صحيح؟
هذا هو الشيء اللطيف بشأن Python.
إذا كنت تريد متغير
أو معلمة، فقط
فابدأ في استخدامها
دون الإشارة إلى نوع بياناتها.
لذا وضعتُ n بين
قوسين في هذه الدالة، ويعني،
مرحبًا، Python، دعي هذه
الدالة تأخذ مدخل يُسمى n.
ويمكن أن يكون في الواقع أي نوع للبيانات--
عدد صحيح، أو قيمة كسرية، أو سلسلة،
أو حتى شيء آخر.
الأمر متروك لي لاستخدامها
بشكل مسؤول كرقم
ولاستدعائها بشكل
مسؤول استخدام رقم.
سؤال جيد.
أجل؟
الجمهور: لذا من الممكن
أن يعمل متغير على تغيير نوع؟
ديفيد مالان: نعم، بالفعل،
يمكن لمتغير
تغيير نوع، ملاحظة جيدة.
لذا نعم، ليست Python
لغة مكتوبة قوية، إذا جاز التعبير.
لغة C مكتوبة قوية حيث
إذا قمتُ بكتابة شيء int،
فإنه يبقى int إلى الأبد.
تمت كتابة Python بشكل غير دقيق، حيث
يمكن أن يكون x عدد صحيح في البداية.
ولكن إذا كنتَ تريد حقًا تحويلها
إلى سلسلة، يمكنك فعل ذلك.

English: 
All right, yes?
AUDIENCE: I don't know
where you [INAUDIBLE] from.
How do you define n as an integer?
DAVID MALAN: How did I
define n as an integer?
This is what's nice about Python.
If you want a variable
or a parameter, just
start using it without
mentioning its data type.
So the fact that I put n in
parentheses in this function
means, hey, Python, let this
function take an input called n.
And it can actually be any
data type-- int, float, string,
or even something else.
It's up to me to use it
responsibly as a number
and to call it
responsibly with a number.
Good question.
Yeah?
AUDIENCE: So it's possible
for a variable to change type?
DAVID MALAN: It is, indeed,
possible for a variable
to change type, a good observation.
So yes, Python is not as
strongly-typed language, so to speak.
C is strongly-typed in that
if you make something an int,
it is staying an int forever.
Python is loosely typed, whereby
x can be an int initially.
But if you really want to turn
it into a string, you can.

Arabic: 
لكن سيكون التقليد هناك، نعم،
يمكنك القيام بذلك، لكن لا تقم بذلك.
إذن لدى Python، بصراحة،
نوع من التعجرف
كونها لغة للبالغين إلى حد ما.
نعم، يمكنك القيام بذلك، ولكن لا تقم بذلك.
لماذا يجب أن نحميكم
من أنفسكم؟
ومن هذا المنطلق، تحتاج إلى
أن تكون مسؤولاً أكثر قليلاً بشأنها.
لكن مجددًا، توجد
وسيطات بكلا الطريقتين.
وهي تزيح الأخطاء المحتملة
التي ستزيلها C من أجلك.
وهذا هو المكان حيث يبدأ البشر
في الاختلاف حول المستجدات
والجوانب السلبية للغات، سواء
يجب أن تكون اللغة قوية أو غير دقيقة
أو لم تتم كتابتها على الإطلاق.
ملاحظة جيدة.
لذا دعونا نلقي نظرة على نموذج
كان شائعًا جدًا في C
عندما أردنا أن نقوم
بشيء مرارًا وتكرارًا
لنرى كيف يتم ذلك بالفعل
بشكل مختلف قليلاً في Python الآن.
دعوني أمضي قدمًا وأقوم بإنشاء ملف
يُسمى positive.py
وأمضي قدمًا وأكتب
برنامجًا بشكل سريع قليلاً هنا.
لذا من CS50، دعوني أمضي
قدمًا وأقوم باستيراد getInt،
حتى يمكننا الحصول على أعداد صحيحة من المستخدم.
دعوني أمضي قدمًا 
وأُحدّد دالة main
التي ببساطة ستقوم بكتابة i، والذي سيكون
المتغير الخاص بي، وتحصل على positive int،
وتطلب من المستخدم،
كما قمنا بذلك منذ أسابيع،
وإذا كنتم تتذكرون،
لعدد صحيح موجب.

English: 
But the convention there would be, yes,
you can do that, but don't do that.
So Python has the, frankly,
the sort of arrogance
of being sort of an adult language.
Yes, you could do that, but just don't.
Why do we have to protect
you from yourselves?
And so in that sense, you need to be
a little more responsible about it.
But again, there are
arguments both ways.
That induces potential bugs
that C would catch for you.
And this is where humans start
to disagree about the upsides
and downsides of languages, whether a
language should be strongly or loosely
or not even typed at all.
A good observation.
So let's look at a paradigm
that was super common in C
when we wanted to do
something again and again
to see how it actually is a little
differently done in Python now.
Let me go ahead and create
a file called positive.py
and go ahead and write a
program a little quickly here.
So from CS50, let me go
ahead and import getInt,
so we can get integers from the user.
Let me go ahead and
define a main function
that simply does i, which will be
my variable, gets a positive int,
and asks the user, just
as we did weeks ago,
if you'll recall, for
a positive integer.

Arabic: 
ومن ثم تمضي قدمًا
وتطبعه بشكل ملل جدًا.
هذا كل ما يقوم به هذا البرنامج.
ودعوني أمضي قدمًا
وفقط من التذكر--
على الرغم من أن نسخ ولصق
هذه السلسلة التي تبدو مشفرة جيد جدًا،
سنكون مهملين فقط إذا لم
نوضح لك كيف يقوم معظم الأشخاص بذلك.
لذلك إذا قمت بذلك، هذا
برنامج كامل،
باستثناء أن ما هو الشيء
غير الموجود حتى الآن؟
من المحتمل أنه لا توجد Get positive int،
تمامًا كما لم تكن موجودة في الأسبوع الأول،
لأنه يجب أن نخترعها بأنفسنا.
توجد Get int، ولكن لا توجد
Get positive int.
وفقط من أجل
إثبات ذلك، لنجرب هذا.
Python من positive.py،
لاحظوا أن لدينا خطأ اسم غير محدد في
get positive int.
حسنًا، إذن يمكننا إصلاح ذلك.
يمكننا حرفيًا أن نحددها، أو def it.
لذا get positive int.
سيتطلب الأمر
الطلب من المستخدم،
تمامًا كما فعلنا منذ أسابيع، السلسلة
التي تريد عرضها له أو لها.
والآن دعوني أمضي قدمًا
وأحصل على عدد صحيح موجب.
ما هو نوع بنية البرمجة
التي استخدمناها
في C للقيام بشيء
مرارًا وتكرارًا؟
الجمهور: التكرار الحلقي.
ديفيد مالان: تكرار حلقي، بالتأكيد،
ولكن على وجه التحديد،

English: 
And then just goes ahead and
very boringly prints it out.
So that's all this program does.
And let me go ahead and
just from recollection--
though it's totally fine to copy/paste
this cryptic-looking string,
we would just be remiss in not
showing you how most people do this.
So if I do this, this
is a complete program,
except for the fact that
what does not exist yet?
Get positive int probably does not
exist, just as it didn't in week one,
because we have to invent it ourselves.
Get int exists, but get
positive int does not.
And just for demonstration's
sake, let's try this.
Python of positive.py,
notice we have name error get
positive int not defined.
OK, so we can fix that.
We can literally define, or def, it.
So get positive int.
It's going to take a
prompt from the user,
just as it did weeks ago, the string
that you want to show to him or her.
And now let me go ahead
and get a positive integer.
What type of programming
construct did we
use in C to do something
again and again and again?
AUDIENCE: Loop.
DAVID MALAN: A loop, for
sure, but more specifically,

Arabic: 
للقيام بشيء ما
مرة واحدة على الأقل ومن ثم ربما
مرارًا وتكرارًا
إذا لم يتعاونوا؟
الجمهور: While.
ديفيد مالان: لنكتب while.
لا نكتب while في Python.
لذا هذه الميزة المفيدة
لمدخل المستخدم غير موجودة.
لذا هذا جيد.
نحتاج إلى حل هذا بشكل مختلف فقط.
وبصراحة، في C، يمكنك أن
تحل هذه المشكلة بشكل مختلف.
لا تحتاج إلى كتابة while.
كان يمكننا أن نستبعد ذلك من أجلكم.
يمكن أن تستبعد C ذلك.
يمكنكم حل كل المشاكل
التي ظهرت في الأسابيع الماضية
باستخدام for loop أو while loop.
كتابة while هي مجرد ميزة مفيدة ورائعة.
لكن يمكننا محاكاة ذلك.
والطريقة البايثونية
للقيام بذلك هي على النحو التالي.
بإزاحة تكرار
حلقي لا نهائي بشكل متعمد، لأنه من المحتمل
أنكم تريدون القيام بالتكرار الحلقي.
لكن سيكون المنطق هو،
أعطني تكرار حلقي لا نهائي
وسأقوم بتقسيمه عندما
أكون مستعدًا لتقسيمه.
سيكون هذا هو التقليد.
إذن، في حين أن ما يلي صحيح، قم بذلك.
أمضي قدمًا وأعلن
عن متغير يُسمى n.
احصل على int من المستخدم
وقم بتمريره في ذلك المُحث نفسه.
إذن get int، كتبنا-- طاقم العمل--
المُحث هو كل ما كتبتُه هنا.
إذن قم فقط بالنسخ واللصق من إصدار C.
ثم تحت أي ظروف
تجعلني أريد تقسيم هذا التكرار الحلقي اللا نهائي

English: 
to do something at least
once and then maybe again
and again and again if
they don't cooperate?
AUDIENCE: While.
DAVID MALAN: Do while.
No do while in Python.
So that handy feature for
user input does not exist.
So that's fine.
We need to solve this just differently.
And honestly, in C, you could have
solved that problem differently.
You don't need do while.
We could have taken it away from you.
C could take it away.
You could still solve every problem
that we have in the past weeks
using a for loop or a while loop.
Do while just is a nice handy feature.
But we can simulate it.
And the Pythonic way of
doing this is as follows.
Deliberately induce an
infinite loop, because you
do want to loop potentially.
But the logic is going to
be, give me an infinite loop
and I will break out of it when
I'm ready to break out of it.
This would be the convention.
So while the following is true do this.
Go ahead and declare
a variable called n.
Get an int from the user and
pass in that same prompt.
So get int, we wrote-- the staff--
prompt is whatever I typed in up here.
So just copy/paste from the C version.
And then under what circumstances do I
want to break out of this infinite loop

Arabic: 
إذا تم استدعاء
الدالة لكتابة get positive int؟
الجمهور: [INAUDIBLE]
ديفيد مالان: أجل،
إذا كان n أكبر من 0،
ثم ما تزال لدي فرصة لتقسيم
الكلمة الرئيسية، تمامًا كما فعلنا في C.
يمكنني تقسيم هذا التكرار الحلقي.
ومن ثم بمجرد أن أقوم بذلك، يمكنني
المضي قدمًا واسترجاع n فقط.
أو من أجل هذا الأمر، يمكنني
تكثيف هذه قليلاً.
يمكنني فقط استرجاع n على الفور
وربطه فقط قليلاً.
لذا هناك طرق متعددة للقيام بذلك.
وإلا سيقوم فقط 
بتكرار حلقي وتكرار حلقي للأبد.
إذن دعوني أمضي قدمًا الآن
وأقوم بتشغيل positive.py
من خلال Python، عدد صحيح موجب مثل
-1، ربما -2، 0، حسنًا، 1.
والآن هي، في الواقع، تتعاون.
إذن هذا مجرد نموذج شائع.
هذا هو الشيء الذي يحدث عندما
تتعلمون لغة جديدة وهي بصراحة
تميل إلى تعطيل الأشخاص في البداية.
تحتاجون إلى تعلم
طريقة JavaScript للقيام بالأشياء.
تحتاجون إلى تعلم
طريقة Python للقيام بالأشياء.
ولكن بعد ذلك ستبدأون في ملاحظة
ما تسمى بأنماط التصميم هذه.
في أي وقت تريدون القيام بشيء
في Python مرارًا وتكرارًا،
نعم، تريدون التكرار الحلقي.
ولكن إذا كنتم تريدون القيام بشيء
بالتأكيد مرة واحدة وربما مرة أخرى؟
ما زلتم تستخدمون
التكرار الحلقي، ولكن بشكل متعمد

English: 
if the function is to be
called to get positive int?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Yeah, so
if n is greater than 0,
then I do have the keyword
break still, just as I did in C.
I can break out of this loop.
And then once I do that, I can
go ahead and just return n.
Or for that matter, I could
condense this a little bit.
I could just return n immediately
and tighten it just a little bit.
So multiple ways to do this.
Otherwise it's just going
to loop and loop forever.
So let me go ahead now
and run positive.py
through Python, positive integer like
negative 1, maybe negative 2, 0, OK, 1.
And now it, indeed, co-operates.
So this is just a common paradigm.
This is the kind of thing when
learning a new language that honestly
tends to hang people up initially.
You need to learn the
JavaScript way of doing things.
You need to learn the
Python way of doing things.
But then you start to notice
these so-called design patterns.
Anytime in Python you want to
do something again and again,
yes, you want to loop.
But if you want to do something
definitely once and maybe again?
You still just use a
loop, but you deliberately

English: 
induce, typically, an infinite loop, and
just break out of it when you're ready.
So a very common approach.
So not everything translates
literally from C back and forth.
Any questions then on that?
Yeah, in the back?
AUDIENCE: Is that something you
just did with the while for loop,
is that [INAUDIBLE] initializing
a variable called [INAUDIBLE]
to a negative number and then
do while n is less than 0--
DAVID MALAN: Really good question.
Is this approach preferable
to instead declaring, maybe
in here, a variable that is equal to
some known value, like zero or whatnot,
and then updating it?
Short answer, yes, because
your approach, while correct,
is not as well-designed, arguably
because it's just not necessary.
And the Pythonic way, and
really the well-designed way
to do most things would
be use as few lines
as you can so long as it's still
readable and understandable,
which I would argue this is once
you're comfortable with the syntax.
But this does bring up an interesting
point about one other topic in C. Scope
has now gone out the window, at
least as we previously saw it.

Arabic: 
تستنتجون، عادة، تكرار حلقي لا نهائي،
وتقومون بتقسيمه عندما تكونوا مستعدين.
إذن هو نهج شائع جدًا.
إذن لا يُترجم كل شيء 
حرفيًا من C ذهابًا وإيابًا.
أي أسئلة على هذا الجزء؟
نعم، في الخلف؟
الجمهور: هذا الشيء الذي فعلته للتو 
مع while for loop،
هل هذا [INAUDIBLE] يقوم بتهيئة
متغير يُسمى [INAUDIBLE]
إلى عدد سالب ومن ثم 
يجعل عندما يكون n أقل من 0--
ديفيد مالان: سؤال جيد حقًا.
هل يُفضل هذا النهج 
بدلاً من الإعلان، ربما هنا،
عن متغير يساوي
قيمة ما معروفة، مثل صفر أو أي شيء،
ومن ثم يقوم بتحديثه؟
الإجابة المختصرة هي، نعم، لأن
نهجكم، في حين أنه صحيح،
فليس مصممًا بشكل جيد، يمكن القول
لأنه ليس ضروريًا فقط.
وعلى طريقة Python،
وهي حقًا طريقة مصممة بشكل جيد
للقيام بمعظم الأشياء التي ستكون
قيد الاستخدام كسطور قليلة
قدر الإمكان طالما أنها ستظل
قابلة للقراءة وللفهم،
ويمكنني القول أن ذلك هو ما سيحدث بمجرد
أن تعتادوا على الصيغة.
ولكن هذا يثير نقطة شيقة
عن موضوع واحد آخر في C. لقد اختفى Scope
من على الشاشة تمامًا، على
الأقل كما رأيناه سابقًا.

English: 
Scope referred to
where a variable lives.
And we defined it essentially
casually between two curly braces,
the most recently opened curly braces.
Well, no curly braces anymore so it
turns out that variables by default
have function scope here.
So when you declare n on line 9,
you can use it in Python on line 10.
And you know what?
You can even use it on line 12,
even though it was declared inside
of this loop higher up.
So once you declare a
variable on this line,
you can use it anywhere on a subsequent
line within that same function.
So in some sense, it's a little
sloppy that you're allowed to do this.
But on the other hand,
it's very convenient
because you don't have
to deal with those things
like declaring the variable up
here just to use it down here.
So it's one less thing to think about.
All right, let's take a look
just a few examples from week two
wherein we introduced arrays
and strings more generally
to see what has changed now, as well.
You'll recall that in week two, perhaps,
we had an example about capitalization.
And let me go ahead and look
at the third version of that,

Arabic: 
كان Scope يشير إلى
مكان متغير.
وقمنا بتعريفه بشكل أساسي
وعرضي بين قوسين متعرجين،
الأقواس المتعرجة المفتوحة الحديثة أكثر.
حسنًا، لم تعد هناك أقواس متعرجة،
إذن يتضح أن المتغيرات بشكل افتراضي
لديها دالة scope هنا.
إذن عندما تعلنوا عن n على السطر 9،
يمكنكم استخدامه في Python على السطر 10.
وأتعلمون ماذا؟
يمكنكم استخدامه حتى على السطر 12،
على الرغم من إعلانه بداخل
التكرار الحلقي هذا بالأعلى.
إذن بمجرد أن تعلنوا عن متغير
على هذا السطر،
يمكنكم استخدامه في أي مكان على سطر
لاحق ضمن الدالة نفسها.
إذن بشكل منطقي، هذا أمر 
سيء قليلاً حيث يتاح لكم القيام بهذا.
ولكن من ناحية أخرى،
إنه مناسب للغاية
لأنكم لن تضطروا إلى
التعامل مع هذه الأشياء
مثل الإعلان عن المتغير بالأعلى 
هنا فقط لاستخدامه بالأسفل هنا.
إذن، هذا أمر واحد صغير لن تفكروا به.
حسنًا، دعونا نُلقي نظرة
على بضعة أمثلة من الأسبوع الثاني
حيث قدّمنا فيه ​​مصفوفات
وسلاسل بشكل عام أكثر
لرؤية ما تغير الآن، أيضًا.
ستتذكرون أنه في الأسبوع الثاني، ربما،
تناولنا مثالاً حول كتابة الأحرف الكبيرة.
ودعوني أمضي قدمًا وألقي نظرة
على الإصدار الثالث من ذلك،

English: 
capitalize too, but
convert it to Python.
The purpose in life was to
take input from the user
and just capitalize
every character therein.
So if I type in my
name in all lowercase,
it should come back as all uppercase.
So from the CS50
library, let me go ahead
and import getString so that I
have some input from the user.
Then let me go ahead and just get a
string from the user, like their name.
And then I want to go ahead
and capitalize everything.
So let me go ahead and do this.
And this is a fancy feature.
In C I would have done a for int
i is zero i less than strlen.
I mean, you perhaps remember the
paradigm for iterating over a string.
Python is just so much more pleasant.
For c in s--
that will induce a loop over the string
s, giving you access to every character
at a time, calling that variable c.
And so what is it I want to
do, just as a preliminary step,
a baby step, if you will, let's just
print out c, just to see what happens.

Arabic: 
وأقوم بالتكبير أيضًا، ولكن
بالتحويل إلى Python.
كان الهدف في الحياة هو 
أخذ مدخل من المستخدم
وتكبير جميع 
أحرفه فقط هناك.
إذن إذا كنت أكتب
جميع اسمي بأحرف صغيرة،
يجب أن يعود جميعه بأحرف كبيرة.
إذن من مكتبة CS50، 
دعوني أمضي قدمًا
وأقوم باستيراد getString بحيث يكون
لدي بعض المدخلات من المستخدم.
ثم دعوني أمضي قدمًا وأحصل على سلسلة
من المستخدم فقط، مثل اسمه.
ومن ثم أريد أن أمضي قدمًا
وأكتبه بأحرف كبيرة.
إذن دعوني أمضي قدمًا وأفعل هذا.
وهذه ميزة رائعة.
في C كنت أفعل هذا 
لـ int i يساوي صفر وi أقل من strlen.
أعني، ربما تتذكرون نموذج
التكرار على سلسلة.
لكن Python ممتعة أكثر فقط.
لـc في s--
هذا سينتج تكرار حلقي عبر السلسلة
s، مما يتيح لك الوصول إلى جميع الأحرف
في كل مرة، وتسمية ذلك المتغير c.
إذن ما الذي أريد
القيام به، فقط كخطوة مبدئية،
خطوة صغيرة، إذا صح التعبير، دعونا فقط
نطبع c، فقط لرؤية ما سيحدث.

Arabic: 
دعوني أمضي قدمًا بالأسفل هنا وأقوم 
بكتابة Python بحرفين كبيرين.
دعوني أمضي قدمًا وأكتب
اسمي بأحرف صغيرة.
حسنًا، ولماذا
يتم عرضه بشكل عمودي
هكذا، حرف واحد في كل سطر؟
نعم، تحصلون على السطر المجاني--
سطر جديد مجاني هذه المرة.
إذن دعونا نرى كيف يمكنكم تعطيل ذلك.
إنه يبدو غبيًا، بصراحة.
لكن يمكنكم كتابة end يساوي علامة اقتباس علامة إنهاء الاقتباس،
وبالتالي هذا يكشف عن ميزة جديدة
من Python ولا توجد في C.
يتضح أن Python تحتوي ليس فقط
على الوسيطات الموضعية، كما تُسمى،
حيث تقومون فقط بالتمرير في
الوسيطات بين الفواصل.
وهذا ما كنا نفعله في C.
لكن Python تحتوي أيضًا على
الوسيطات المُسماة، حيث
يمكنكم تحديد 
اسم الوسيطة،
ثم علامة يساوي، ثم القيمة.
وقوة الوسيطات المُسماة،
حتى وإن كان هذا مثال صغير،
تعني أنه يمكنكم أحيانًا التمرير
في الوسيطات بأي ترتيب.
لا يجب أن تتذكروا.
لن تكونوا مضطرين لسحب
دليل CS50 أو صفحات man
لتتذكروا ما هو ترتيب
جميع هذه الوسيطات.
يمكنكم تمريرها في أي ترتيب،
ولكن عبر تحديد
اسم الوسيطة، 
علامة يساوي، وقيمتها.

English: 
Let me go ahead down here and
do Python of capitalize two.
Let me go ahead and type
in my name, all lowercase.
All right, and why is
it showing up vertically
like that, one character per line?
Yeah, you get the free line--
free new line this time.
So let's see how you can disable that.
It's stupid looking, honestly.
But you say end equals quote unquote,
thereby revealing a new feature
of Python that C does not have.
It turns out that Python has not only
positional arguments, as it's called,
whereby you just pass in
arguments between commas.
That's what we've been doing in C.
But Python also has
named arguments, whereby
you can specify the
name of the argument,
then an equals sign, then the value.
And the power of named arguments,
even though this is a tiny example,
means that you can sometimes pass
in your arguments in any order.
You don't have to remember.
You don't have to pull up
CS50 manual or the man pages
to remember what is the order
of all these darn arguments.
You can pass them in in any
order, but by specifying
the name of the argument, an
equals sign, and its value.

English: 
And in Python 2, you can
have optional arguments.
Obviously, in all of
the examples thus far,
I have never typed the word
end and an equals sign yet.
But what Python does support is
default values for arguments.
And so if you look in the documentation
for Python, this is equivalent--
this cryptic looking sequence-- this
is equivalent to the default behavior,
which is to type none of that at all.
End implies, for the print function,
that you should end every line
with that default character.
Therefore, if you want
to override it, you
can just change it to the
empty string, quote unquote.
So if I now run this again and
run it through with my name,
now I get it like that,
one character at a time.
But you can do weird things,
like ha ha ha ha ha--
not that you would.
I don't know why I went with that.
But I mean, that does
the exact same thing
because you're just
changing the line ending.
So don't do that, but do something
else like this with it, instead.
So suppose I want to now
capitalize the first character.

Arabic: 
وفي Python 2، يمكنكم
الحصول على وسيطات اختيارية.
من الواضح أنه، في جميع هذه
الأمثلة حتى الآن،
لم يسبق لي كتابة كلمة
end وعلامة يساوي حتى الآن.
لكن ما تدعمه Python هو
القيم الافتراضية للوسيطات.
ولذا إذا نظرتُ في الوثائق
الخاصة بلغة Python، فهذا يعادل--
هذا التسلسل الذي يبدو مشفرًا--
هذا يعادل السلوك الافتراضي،
وهو عدم كتابة أيًا من ذلك على الإطلاق.
تشير end إلى، لدالة الطباعة،
أنه يجب أن تُنهوا كل سطر
بذلك الحرف الافتراضي.
وبالتالي، إذا كنتم تريدون
تجاوزه،
يمكنكم فقط تغييره إلى سلسلة فارغة،
علامة اقتباس وعلامة إنهاء الاقتباس.
إذن إذا قمت الآن بتشغيل هذا مجددًا
وقمت بتشغيله باستخدام اسمي،
الآن سأحصل عليه هكذا،
حرف واحد في كل مرة.
ولكن يمكنكم كتابة أشياء غريبة،
مثل ها ها ها ها ها ها--
لن تفعلوا ذلك.
لا أعرف لماذا تماديت في ذلك.
ولكن أعني أنه يقوم
بالأمر نفسه بالضبط
لأنكم فقط تقومون
بتغيير نهاية السطر.
لذا لا تقوموا بذلك، ولكن قوموا بشيء
آخر مثل هذا، بدلًا من ذلك.
إذن لنفترض أنني أريد الآن
تكبير الحرف الأول.

English: 
It turns out that strings in Python
are more powerful than strings
in C. In C, there is no string.
That was a lie.
It's just a sequence of characters as
referenced by an address in memory.
In Python, a string is an actual object.
It's a data structure.
And if you think about C, we had
structs toward the very end of our look
at C, nodes and structs and
student structures and the like.
A string in Python is like
this container inside of which
somewhere are all of those characters.
But in that container or structure
is also built-in functions,
features of a string
that you can just call.
So in C, we would have
said something like toUpper
and then passed as input to
a function called toUpper
the character that we care about.
Python kind of flips the logic around.
Strings come with built-in
functionality that
allow you to operate on the
given character automatically.
So in Python, the syntax is
actually the character itself.
Use the dot notation
because it's a structure.
And then you can literally do--
oops.
You can literally do upper.

Arabic: 
يتضح أن السلاسل في Python
قوية أكثر من السلاسل
في C. في C، لا توجد أي سلسلة.
كانت هذه كذبة.
إنها مجرد تسلسل من الأحرف كما
يُشار إليها من خلال عنوان في الذاكرة.
في Python، السلسلة هي كائن فعلي.
إنها بنية البيانات.
وإذا كنتم تفكرون بشأن C، كانت لدينا
بنيات حتى نهاية عرضنا
في C، عُقد وبنيات وبنيات
student وما شابه ذلك.
تُشبه السلسلة في Python
هذه الحاوية التي بداخلها
في مكان ما جميع هذه الأحرف.
ولكن يوجد في تلك الحاوية أو البنية
أيضًا دالات تم إنشاؤها،
وميزات سلسلة
يمكنكم فقط استدعاؤها.
إذن في C، قلنا 
شيئًا مثل toUpper
ومن ثم تمريرها كمدخل إلى
دالة تُسمى toUpper
الحرف الذي نهتم به.
لكن تعكس Python المنطق إلى حد ما.
تأتي السلاسل باستخدام 
دالة تم إنشاؤها
تتيثح لكم العمل على
الحرف المُعطى تلقائيًا.
إذن في Python، تعد الصيغة
في الواقع هي الحرف نفسه.
استخدام تدوين النقطة
لأنه بنية.
ومن ثم يمكنكم حرفيًا--
عذرًا.
يمكنكم حرفيًا كتابة upper.

English: 
So this is to say, built into
the string type in Python
is a bunch of features, one of
which is a function called upper.
And the syntax with which you call
it is the name of the variable
or the name of the string dot name of
the function open paren, close paren.
And that's just now the paradigm.
There's no C type library.
There's no to upper or to lower.
Those features now built
into the strings themselves.
And this is an example
of encapsulation, or more
generally, object oriented
programming, something
you'll explore if you take
a class like CS51 that
bakes into the data types itself
all of the relevant functionality.
It does not relegate
them to another library.
So if I clean this up by just
moving the cursor to the next line,
now hopefully you'll indeed see David
typed out in all caps, the same idea
as before.
What about this length of a string?
This one is pretty trivial,
but if I go in here,
let me go ahead and create a
file called str len of .py.
If I want to see the length of a
string, from CS50 import getString,
just as we did before.

Arabic: 
إذن فهذا يعني، ما تم إنشاؤه
في نوع السلسلة في Python
هو مجموعة من الميزات، إحداها
دالة تُسمى upper.
والصيغة التي تستدعوها بها
هي اسم المتغير
أو اسم السلسلة نقطة ثم اسم
الدالة قوس مفتوح، قوس مغلق.
والآن هذا هو النموذج فقط.
لا توجد مكتبة من نوع C.
لا توجد دالة toupper أو tolower.
تم إنشاء هذه الميزات الآن
في السلاسل نفسها.
وهذا مثال
عن التغليف، أو بشكل
عام أكثر، البرمجة التي
تستهدف الكائن، شيء ما
ستكتشفوه إذا حصلتم
على دورة مثل CS51 والتي
تُصمِم في أنواع البيانات نفسها
جميع الدالات ذات الصلة.
ولا تُحيلها
إلى مكتبة أخرى.
لذا إذا قمتُ بتنظيف هذا فقط من خلال
تحريك المؤشر إلى السطر التالي،
آمل الآن أن تروا ديفيد
مكتوبة كلها بأحرف كبيرة، نفس الفكرة
التي كانت من قبل.
ماذا عن طول هذه السلسلة؟
هذا الأمر بسيط جدًا،
ولكن إذا انتقلت إلى هنا،
دعوني أمضي قدمًا وأقوم بإنشاء ملف
يُسمى strlen.py.
إذا أردتُ رؤية طول سلسلة ما،
من CS50، قم باستيراد getString،
تمامًا كما فعلنا من قبل.

English: 
Let me go ahead and get a string
for myself, like my name again.
And then here, if I want to print
the length of the string, in Python--
in C, you would say strlen.
In Python, it's a little different.
You actually just say len for length.
So if I go ahead and run
this through strlen--
strlen-- type in my name.
Hopefully I, indeed, see five.
And there's no notion that you need
to care about the backslash zero
in order to terminate the string.
Yeah?
AUDIENCE: So this upper [INAUDIBLE]
DAVID MALAN: No, in fact.
So that's a really good observation.
Let's rewind and actually
improve upon this
rather than just translate it from what
was our comparable example in C. Let
me go ahead here and
actually say, you know what?
S gets s upper.
And then let me just print s, perhaps.
Let's see what happens.
Let me go back here and
run Python of capitalize 2.
Enter David.
And it operates on the whole string.
Good intuition.

Arabic: 
دعوني أمضي قدمًا وأحصل على سلسلة
لنفسي، على سبيل المثال اسمي مجددًا.
ومن ثم هنا، إذا أردتُ طباعة
طول السلسلة، في Python--
في C، ستقولون strlen.
في Python، الأمر مختلف قليلاً.
في الواقع فقط تقولون len للطول.
إذن إذا مضيتُ قدمًا وقمتُ بتشغيل
هذا من خلال strlen--
strlen-- اكتب اسمي.
آمل بالفعل أن أرى خمسة.
ولا توجد فكرة أنكم تحتاجون إلى
الاهتمام بالخط المائل العكسي صفر
من أجل إنهاء السلسلة.
أجل؟
الجمهور: إذن upper هذا [INAUDIBLE]
ديفيد مالان: لا، في الواقع.
إذن هذه ملاحظة جيدة حقًا.
دعونا نرجع ونقوم 
بتحسين هذا في الواقع
بدلًا من مجرد ترجمته من ما كان
عليه مثال المقارنة في C. دعوني
أمضي قدمًا هنا وأقول 
في الواقع، أتعلمون ماذا؟
s يساوي upper s.
ومن ثم دعوني فقط أطبع s، ربما.
دعونا نرى ما سيحدث.
دعوني أرجع إلى هنا وأقوم
بتشغيل Python من capitalize2.
Enter David.
وسيعمل على السلسلة بأكملها.
حدس جيد.

English: 
And honestly, I don't need to do this.
I could just say upper here and
really trim this down and do
Python of capitalize, type in my name.
That still works.
And if I really want to be fancy,
I don't even need s at all.
I can take this, get rid of that,
put this here, immediately call
upper on the user's input and whittle
this down to one line, type in David,
and that, too, works.
So you just get lots and lots
and lots of more expressiveness.
Good question.
So how do you even know
that things like this exist?
Well, quick aside.
Google will truly be your
friend in cases like this.
And you'll want to know at this point,
there's different versions of Python.
The world is kind of
holding out and is still
using, a lot of people, version 2 of
Python, which is older by many years
now.
We are using version 3.
And this is where the world is going.
And indeed, Python 2 will be
officially deprecated or phased out
in a couple of years, theoretically.
So when you Google, you just
want to be mindful of this
so that you don't accidentally make your
way to old tutorials, old documentation
and the like.

Arabic: 
وبصراحة، لا أحتاج إلى القيام بذلك.
يمكنني فقط أن أقول upper هنا
وأقوم بتشذيب هذا بالأسفل وأكتب
Python من capitalize2، وأكتب اسمي.
ما زال ذلك ينجح.
وإذا أردتُ حقًا أن أكون رائعًا،
فأنا لا أحتاج إلى s على الإطلاق.
يمكنني أخذ هذه، والتخلص من ذلك،
ووضع هذا هنا، وعلى الفور استدعاء
upper على مدخل المستخدم و أقوم بضم
هذا إلى سطر واحد، ثم أكتب david،
وهذا، أيضًا، ينجح.
إذن فقط تحصلون على
طرق للتعبير كثيرة جدًا جدًا.
سؤال جيد.
إذن كيف تعرفون حتى
أن أشياء كهذه موجودة؟
حسنًا، لمحة سريعة.
سيكون Google حقًا صديقكم
في مثل هذه الحالات.
وستريدون أن تعرفوا في هذه المرحلة،
أن هناك إصدارات مختلفة من Python.
يُعد العالم إلى حد ما
مُتمسكًا وما يزال
يستخدم، الكثير من الأشخاص، الإصدار 2 من
Python، وهو قديم منذ عدة سنوات
الآن.
نحن نستخدم الإصدار 3.
وهذا هو الطريق الذي يسير فيه العالم.
وبالفعل، فإن الإصدار Python 2 سيصبح
مهجورًا أو موقوفًا تدريجيًا
في غضون عامين، من الناحية النظرية.
إذن عندما تجرون بحثًا في Google، يجب فقط
أن تضعوا هذا في الاعتبار
حتي لا تشقوا طريقكم عن طريق الخطأ
إلى البرامج التعليمية، والوثائق القديمة
و ما شابه ذلك.

Arabic: 
إذن دعوني أمضي قدمًا وأبحث عن
Python 3 string، أو str، وupper،
فقط لمعرفة إذا كان يمكنني الوصول
إلى الوثائق.
هنا لديكم عدد من البرامج التعليمية.
ولكن إذا ركزنا هنا، ما الذي
تريدون البحث عنه بشكل عام،
على الأقل عن الوثائق الرسمية، 
هو docs.python.org.
ترون في عنوان URL، إنه الإصدار 3،
وهذا ما نريد الانتقال إليه.
إذن دعوني أمضي قدمًا وأنقر فوق
هذا، مُشغلات السلسلة الشائعة.
وأُريد أن أنفي هذا--
أعتقد، بشكل شخصي،
أن وثائق Python
ليست سهلة الاستخدام جدًا بالنسبة إلى المبتدئ.
على سبيل المثال، إنها مكتوبة بشكل غامض
إلى حد ما
يجب أن تتعمقوا جيدًا فيها
لفهم أمور معينة.
هذا جيد.
ستعتادون عليها
مع مرور الوقت.
ولكن إذا كنتم تشعرون 
بالزخم منها قليلًا،
يا إلهي، كل ما أُريد فقط أن أعرفه هو
upper، الجميع يشعرون بهذا أيضًا.
إذن، control F أو Command F
هو صديقكم، upper.
دعوني أمضي قدمًا وأبحث عن هذا.
وفي الواقع إنه غير موجود 
في هذه الصفحة، أليس كذلك؟
سلسلة-- طرق السلسلة.
ها نحن ذا.
طرق السلسلة.
حسنًا، إذن أسفل طرق السلسلة، 
دعوني أمضي قدمًا وأبحث عن upper.
وبالأسفل هنا، في الواقع،
توجد الوثائق.

English: 
So let me go ahead and Google
Python 3 string, or str, and upper,
just to see if I can get
to the documentation.
Here you have a number of tutorials.
But if we focus down here, what you're
generally going to want to look for,
at least for the official
documentation, is docs.python.org.
You see in the URL it's version
3, and that's where we want to go.
So let me go ahead and click on
this, common string operators.
And I will disclaim this--
I think, personally,
Python's documentation
is not terribly newbie-friendly.
Like, it's written fairly
arcanely and you kind of
have to really dig to
understand certain things.
That's fine.
You'll get comfortable
with it over time.
But if you're feeling a
little overwhelmed by,
oh my God, I just want to know about
upper, everyone feels this way too.
So control F or Command
F is your friend, upper.
Let me go ahead and search for this.
And it's not actually
on this page, is it?
String-- string methods.
Here we go.
String methods.
OK, so under string methods, let
me go ahead and search for upper.
And down here, indeed,
is the documentation.

Arabic: 
إذن سيكون التقليد هو اسم
نوع البيانات المطلوب--
str للسلسلة--
اسم الدالة هنا.
ستخبرك بين قوسين إذا كانت
تأخذ أي وسيطات، لكنها لا تأخذ.
وهكذا تقوم بإرجاع نسخة من السلسلة
مع جميع الأحرف المُصغرة
والتي تم تحويلها إلى أحرف كبيرة-- وهذا
يعني فقط الأحرف الأبجدية
بشكل أساسي--
ومن ثم بعض الوثائق
الإضافية، وما شابه ذلك.
يُصبح الأمر في مستوى منخفض جدًا بسرعة.
تُعد هذه الوثائق معادلة
لصفحات man.
ولا يوجد مرجع CS50
للغة Python.
كان ذلك فقط خاص بلغة C.
إذن يجب أن تدركوا أنه توجد
هذه الوثائق المتاحة.
وستلاحظون وجود
مجموعات من الدالات.
Strip هي في الواقع نوع من
أنواع الدالات الشائعة، أو Strip L أو Strip R.
إذا كانت لديكم مسافة في
بداية السطر أونهايته
لأن الشخص الموجود لديكم أصبح مهملاً قليلاً
أو توجد سطور جديدة في ملف ما،
يمكنكم استدعاء strip على سلسلة 
والتخلص من المسافة على اليسار
واليمين لتنظيفه إلى حد ما.
وهذا مفيد للغاية لأشياء
مثل تطبيقات علوم البيانات
وتحليل البيانات حيث تقومون
فقط بتنظيف البيانات الفوضوية إلى حد ما.
إذن تم إنشاء العديد من الدالات مثل 
هذه من أجلكم.
حسنًا، إذن دعونا نُلقي نظرة على
أمثلة أخرى قليلة تُذكرنا بالميزات
التي كانت لدينا في C، مثل هذه هنا.
لنفترض أنني أُريد أن أكتب
برنامجًا يأخذ

English: 
So the convention will be the name
of the data type in question--
str for string--
the name of the function here.
It would tell you in parentheses if it
takes any arguments, but it doesn't.
And so it returns a copy of the string
with all of the cased characters
converted to uppercase-- that just
means the letters of the alphabet
essentially--
and then some additional
documentation, and so forth.
It gets pretty low-level pretty quickly.
These are the equivalent
of the man pages.
And there is no CS50
reference for Python.
That was just for C. So
just realize that there's
this documentation available.
And you'll notice there's
bunches of functions.
Strip is actually kind of a
popular one, or L strip or R strip.
If you have whitespace at the
beginning or end of a line
because your human got a little
sloppy or there's new lines in a file,
you can call strip on a string and
get rid of whitespace to the left
and right to kind of clean it up.
Terribly useful for things
like data science applications
and analysis of data where you
just kind of clean up messy data.
So many functions like
that are built in for you.
All right, so let's take a look at a few
other examples reminiscent of features
we did have in C, such as this one here.
Suppose I want to write
a program that takes

Arabic: 
وسيطات سطر الأوامر،
التي تشبه إلى حد كبير تغيير الحجم،
والتي بدأنا بها قصة اليوم.
دعونا لا نستخدم مكتبة CS50.
لنقم بذلك.
إذا كنتم تريدون الوصول إلى argv، تذكرون
أنها في C كانت تبدو مثل هذه-- int،
argc، سلسلة، argv.
كانت تبدو مثل هذه في C.
حسنًا، لسوء الحظ، إذا
كنتم لا تستخدمون main،
سيكون أمرًا جيدًا إذا كان يمكنكم 
استخدام وسيطات سطر الأوامر.
ويمكنكم هذا بالفعل، ولكن
يجب أن تقوموا باستيرادها.
إنها كمكتبة توفر لكم
إمكانية الوصول.
من sys أو مكتبة النظام،
يمكنكم استيراد argv في Python.
وهذا يمنحكم الوصول إلى
وسيطات سطر الأوامر كميزة.
ثم يمكنكم قول شيء من هذا القبيل.
إذا كان طول argv--
وهي مجرد مصفوفة، تذكرون، في C--
يساوي يساوي 2، ثم
امضوا قدمًا وقولوا مرحبًا.
دعوني أمضي قدمًا وأطبع
ما قام المستخدم بكتابته أيًا كان، argv 1.
دعونا فقط بشكل افتراضي
أيًا نقول مرحبًا بالعالم.
إذن باللغة الإنجليزية، ما الذي يحدث؟

English: 
command line arguments,
much like resize,
with which we started today's story.
Let's not even use the CS50 library.
Let's do this.
If you want access to argv, recall
in C it looked like this-- int,
argc, string, argv.
It looked like this in C.
Well, unfortunately, if
you're not using main,
it would be nice if you can
still use command line arguments.
And you can, but you
have to import them.
It's a library that
provides you with access.
From the sys or system library,
you can import argv in Python.
And that gives you access to
command line arguments as a feature.
Then you can say something like this.
If the length of argv--
which is just an array, recall, in C--
equals equals 2, then
go ahead and say hello.
And let's go ahead and print out
whatever the user typed in, argv 1.
Else, let's just by
default say hello world.
So in English, what's happening?

Arabic: 
إذا كتب المستخدم وسيطة
سطر الأوامر-- لنقل مرحبًا ذاك وذاك.
وأيضًا إذا لم يكتب الشخص
وسيطة سطر أوامر واحدة بالضبط،
فقط لنقل، بشكل افتراضي، مرحبًا بالعالم.
لذا دعوني أقوم بحفظ هذا.
وأكتب Python من argv1، أو بالأحرى صفر.
Enter.
حسنًا، لم أكتب
كلمة بعد الأمر.
الآن دعونا نفعل ذلك مجددًا 
وسأكتب اسم براين.
Enter، مرحبًا براين.
دعونا نفعل هذا مجددًا.
فيرونيكا، Enter.
الآن، هناك شيء ليس تمامًا
نفسه كما في C. كم عدد الكلمات التي
كتبتُها للتو في المُحث؟
3.
إذن سيقترح ذلك أن هذه
هي argv0، وargv1، وargv2.
ومع ذلك، أقوم بطباعة
argv1، وليس argv2.
إذن كيف أفكر في هذا؟
التعليمة البرمجية صحيحة، 
ولكنها مختلفة عن C.
من الناحية الفنية ما الذي تقوم argv بتخزينه
عند تشغيل أمر كهذا؟
تذكرون، دعونا نسترجع ذلك.

English: 
If the user typed in a command line
argument-- say, hello so-and-so.
Else if the human did not type in
exactly one command line argument,
just say, by default, hello world.
So let me save this.
Do Python of argv1, or rather zero.
Enter.
OK, I didn't type in a
word after the command.
So now let's do it again and
I'll type in Brian's name.
Enter, hello Brian.
Let's do it again.
Veronica, enter.
Now, there's something that's not quite
the same as C. How many words did I
just type at the prompt?
3.
So that would suggest that this
is argv 0, argv 1, and argv 2.
And yet, I'm printing
argv 1, not argv 2.
So how do I think about this?
The code is correct, but
it's different from C.
What does argv technically store
when you run a command like these?
Remember, let's rewind.

Arabic: 
في C، ما الذي قامت argv0 بتخزينه؟
الجمهور: اسم الملف.
ديفيد مالان: اسم الملف أو
اسم البرنامج الذي قمتَ بتشغيله للتو.
لاحظوا، على الرغم من أن البرنامج
الذي قمتُ بتشغيله للتو يُسمى Python.
ولذا قد تعتقدون أن
argv0 قد تحتوي على Python،
لكنها لا تحتوي على ذلك لأنه لاحظوا
إذا قمتُ بطباعة argv1،
قد تعتقدون أنها 0، 1.
قد تعتقدون أنني قلتُ للتو
مرحبًا argv0.py، لكنني لم أفعل.
من الواضح أن argv1 تطبع فيرونيكا أو براين.
إذن من المنطقي أن
argv0 هي هذه، وهذا
يعني أن هذا، مثل، argv -1.
يتم استبعاد Python من وسيطة 
vector، كما يُطلق عليها.
لا تتضمن وسيطات سطر
الأوامر اسم المُترجم.
ولكن بخلاف ذلك، هي تعمل بالضبط
ما كانت تقوم به من قبل.
ولاحظوا، أيضًا، باستخدام
علامة التبويب الجديدة هذه للبناء،
لاحظوا ما يمكنكم القيام به كلما أمكنكم
الوصول إلى مصفوفة الأشياء.
إذا انتقلتُ إلى argv1.py و قمتُ باستيراد
argv مجددًا، دعوني أمضي قدمًا الآن
وأقوم فقط-- أتعلمون ماذا؟
For s في argv، وأمضي قدمًا وأطبع s.
هذا حقًا أمر موجز.

English: 
In C, argv 0 stored what?
AUDIENCE: Name of the file.
DAVID MALAN: The name of the file or
the name of the program you just ran.
Notice, though, the program
I just ran is called Python.
And so you would think that
argv 0 would have Python in it,
but it doesn't because notice
if I'm printing argv 1,
you would think that's 0, 1.
You would think I just said
hello argv 0 .py, But I didn't.
argv 1 clearly prints Veronica or Brian.
So it stands to reason
argv 0 is this, which
means this is, like, argv negative 1.
Python is excluded from the
argument vector, as it's called.
The command line arguments do not
include the name of the interpreter.
But otherwise, it works exactly the
same as it did once upon a time.
And notice, too, with
this new for construct,
notice what you can do whenever you
have access to an array of things.
If I go into argv1.py and import
argv again, let me go ahead now
and just-- you know what?
For s in argv, go ahead and print out s.
It's really succinct.

Arabic: 
ما الذي سيفعله هذا؟
دعوني أمضي قدمًا وأكتب
Python من enter ،argv1.
ويقوم فقط بطباعة
اسم الملف.
إذا مضيتُ قدمًا وقلتُ foo،
bar ،baz، ثلاث كلمات عشوائية،
إنه يطبع كل تلك الكلمات.
إذن الشيء القوي في Python
بصراحة هو هذا التكرار الحلقي.
لا يوجد int i، أقل من،
زائد زائد، أي من ذلك.
تقولون فقط، أعطني
متغير يُسمى s
وقم بتكرار الشيء بالكامل
على اليمين، وهو ما يُفترض أنه،
في هذه الحالة، يكون مصفوفة.
يمكنكم أن تكونوا أقوى بكثير من ذلك.
إذا قمتُ-- كما حدث في C منذ أسابيع--
بالنظر في الأحرف في هذه
السلاسل-- دعوني أكتب argv2.py--
لنفترض أن هذا التكرار
لكل سلسلة في argv،
ومن ثم هنا التكرار كل حرف
في s، يمكنني كتابة for c في s
ومن ثم طباعة الحرف.
إذن الآن عندما أقوم بتشغيل الأمر
نفسه ولكن على argv2.py،
لاحظوا ما الذي سيحدث.
دعوني أرفع هذا قليلاً.
Enter.

English: 
What is this going to do?
Let me go ahead and do
Python of argv1, enter.
And it just prints out
the name of the file.
If I go ahead and say foo,
bar, baz, three random words,
it prints out all of those words.
And so what's powerful about
Python is honestly this for loop.
There's no int i, less than,
plus plus, any of that.
You just say, give me
a variable called s
and iterate over the entirety of the
thing on the right, which is presumed,
in this case, to be an array.
You can be even more powerful than that.
If I-- just like in C weeks ago--
look at characters in these
strings-- let me do argv2.py--
suppose that this iterate
over each string in argv,
and then here iterate over each
character in s, I can do for c in s
and now print out the character.
So now when I run this same
command but on argv2.py,
notice what's going to happen.
Let me raise this a little bit.
Enter.

Arabic: 
يطبع كل حرف
من كل كلمة واحدة كل مرة.
لكنه فعل ذلك هذه المرة بناء
على استخدام هذين التكرارين الحلقيين.
إذن ماذا يعني هذا؟
عندما تكون لديكم مصفوفة،
كما أطلقنا عليها،
يمكنكم تكرار
كل شيء في المصفوفة.
عندما تكون لديكم سلسلة، يمكنكم تكرار
كل حرف في السلسلة.
وهنا حيث تصبح Python
مرنة بشكل رائع
للقيام بذلك مرارًا وتكرارًا.
حسنًا، لنُلقي نظرة على--
دعونا نرى-- سلاسل تمت مُقارنتها بالفعل.
قمنا بنسخ سلاسل.
دعونا نمضي قدمًا ونقوم بذلك في Python.
تذكرون أننا واجهنا 
حد أساسي في C،
ويبدو متعلقًا بالبرمجة، 
عندما كان لدينا مثال يُسمى تبديل
وno swap مجددًا
عندما كنت فقط
أحاول تبديل قيمتين، x وy.
وتذكرون أنني قمتُ ضمنيًا
بشيء مثل x هو 1 وy هو 2.
وكان الهدف من كل هذا ببساطة هو أن
أقول أولاً، x هو كذا وكذا،
وy هو كذا وكذا.
دعوني أمضي قدمًا وأجعل
ذلك سلسلة تنسيق.
ثم أردتُ طباعة هذا مجددًا.
لكن في مكان ما هنا، أردتُ
تبديل x وy.

English: 
It prints every character
from every word one at a time.
But it did so this time based
on using these two for loops.
So what does this mean?
When you have an array,
as we've called it,
you can iterate over
everything in the array.
When you have a string, you can iterate
over every character in the string.
And this is where Python
just gets wonderfully
flexible to do this again and again.
All right, let's take a look at--
let's see-- compared strings already.
We copied strings.
Let's go ahead and do this in Python.
Recall that we ran into a
fundamental limitation of C,
and it would seem programming,
when we had example called swap
and no swap back in the
day where I was just
trying to swap two values, x and y.
And recall that I hardcoded
something like x is 1 and y is 2.
And the whole goal was simply to
first say, x is such and such,
y is such and such.
Let me go ahead and make
that a format string.
Then I wanted to print this again.
But somewhere in here, I
wanted to swap x and y.

English: 
So to punctuate our sort of
exploration of just what Python can do,
if you want to swap two variables,
x and y, that's fine, just do it.
And it's this magical shell
game that just works in Python.
Now, technically these are what
are called tuples on the left.
It's a x comma y pair.
It's latitude comma longitude.
So there's an actual underlying
mental model for what's going on here.
But in effect, you're
literally switching them
and you don't need the
temporary variable.
Python the language takes
care of that for you.
All right, let's look at
a more powerful feature
still, this time using what's
actually called a list.
So a moment ago I was using
argv 0, 1, 2, as our examples.
And I was calling them arrays.
They're not arrays anymore.
Python does not have arrays.
Python has lists.
And lists sounds
reminiscent of linked lists.
And indeed, they are.
In Python, you have
lists that are resizable.
You don't have to decide in advance
how big they are or how small they are.
They will just grow and shrink for
you just like a linked list will,
but you don't have to write
the linked list yourself.

Arabic: 
إذن، لنستخلص من استكشافنا 
لما يمكن أن تقوم به Python،
إذا أردتم تبديل متغيرين،
x وy، فلا بأس، فقط افعلوا ذلك.
وهذا مثل لعبة shell السحرية
التي تعمل فقط في Python.
الآن، من الناحية الفنية هذه 
تُسمى صفوف على اليسار.
إنه زوج من x فاصلة y.
إنه خط الطول فاصلة خط العرض.
إذن يوجد فعليًا نموذج 
عقلي كامن لما يحدث هنا.
ولكن في الواقع، فأنتم
حرفيًا تقومون بتبديلها
ولا تحتاجون إلى
المتغير المؤقت.
تهتم لغة Python 
بهذا من أجلكم.
حسنًا، دعونا نُلقي نظرة على
ميزة قوية أكثر
ومع ذلك، هذه المرة في الواقع
باستخدام ما تُسمى قائمة.
إذن منذ لحظة كنت استخدم 
argv0 ،1 ،2، كأمثلة.
وكنت أُطلق عليها مصفوفات.
إنها ليست مصفوفات بعد الآن.
لا تحتوي Python على مصفوفات.
تحتوي Python على قوائم.
وتُذكرنا القوائم 
بالقوائم المرتبطة.
وبالفعل، هي كذلك.
فيPython، لديكم
قوائم قابلة لتغيير حجمها.
لا يجب أن تتخذوا قرارًا مسبقًا
عن مدى كبر أو صغر حجمها.
ستكبر وتصغر من تلقاء نفسها
تمامًا كما ستفعل قائمة مرتبطة،
ولكن لا يجب أن تكتبوا
القائمة المرتبطة بأنفسكم.

Arabic: 
أجل؟
الجمهور: [INAUDIBLE]
ديفيد مالان: بالتأكيد.
الجمهور: [INAUDIBLE]
ديفيد مالان: أوه، بالتأكيد.
دعوني أفتح هذا الملف في argv1.
هذا هنا؟
الجمهور: لقد كان مثل، [INAUDIBLE].
ديفيد مالان: أوه، هذا هو هنا.
الجمهور: نعم.
[INAUDIBLE] قوس
تدوين [INAUDIBLE]..
ديفيد مالان: نعم، يمكنك--
إذن argv، أطلقتُ عليها مصفوفة،
لكن كانت هذه كذبة بيضاء منذ لحظة.
إنها في الواقع قائمة، قائمة مرتبطة.
ولكن بينما لا تتيح أي قائمة مرتبطة في C
لكم استخدام الأقواس المربعة،
يجب أن تستخدموا for
loop أو while loop
لتكرار الشيء بأكمله للعثور
علي ما تبحثون عنه، في Python،
إذا كان هناك شيء في قائمة، فيمكنكم
فقط استخدام، حسنًا، الأقواس المربعة
للحصول على هذا العنصر المحدد.
الجمهور: أو أقول أنه
يمكنك استخدام f مباشرة قبل--
ديفيد مالان: أوه، كان من الممكن ذلك، نعم.
لم أستخدم F، فقط لأنه
بصراحة يصبح قبيحًا في النهاية.
ولكن نعم، يمكنني أيضًا أن أفعل هذا
لتحقيق التأثير نفسه بالضبط.
ولكن ستبدو فقط مشفرة.

English: 
Yeah?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Sure.
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Oh, sure.
Let me open that file up in argv1.
This one here?
AUDIENCE: No, it was, like, [INAUDIBLE].
DAVID MALAN: Oh, this one here.
AUDIENCE: Yeah.
[INAUDIBLE] bracket
notation [INAUDIBLE]..
DAVID MALAN: Yes, you can still--
so argv, I called it an array,
but that was a white lie a moment ago.
It's actually a list, a linked list.
But whereas a linked list in C does
not allow you to use square brackets,
you have to use a for
loop or a while loop
to iterate over the whole thing to find
what you're looking for, in Python,
if something is in a list, you can
just use, yes, the square brackets
to get at that specific element.
AUDIENCE: Or I'm saying you
could use the f right before--
DAVID MALAN: Oh, I could have, yes.
I didn't use the F, just because
frankly it just gets ugly eventually.
But yes, I could have also done this
to achieve the exact same effect.
It just starts to look cryptic.

English: 
OK, so let's actually introduce a list,
which itself is a data type in Python,
as well as in languages
like C++ and Java,
if some of you have that
background, as well.
So here, in list.py, let me
go ahead and do the following.
Let me first import from
the CS50 library getInt
so that we can get some
ints from the user.
Let me give myself an array, a.k.a.
now a list in Python.
So in C you can't really
express quite this idea.
In Python, if you want a
variable called numbers
and you want to initialize
it to an empty list,
you just literally do open
bracket, close bracket.
No number in between them.
And as before, no semi-colon.
Let's now do the following
forever until I break out of this.
Let me go ahead and get
a number from the user,
just by asking them for some number.
Then let me say, if not number,
go ahead and break out of this.
This is going to, as an
aside, just let me quit out
of this by hitting Control D as we
discussed ever so briefly a while back.
But that's just a UI feature.
So this is what's kind of cool.

Arabic: 
حسنًا، دعونا نقدم بالفعل قائمة،
وهي نفسها نوع بيانات في Python،
وكذلك في لغات
مثل ++C وJava،
إذا كان لدى البعض منكم
تلك الخلفية أيضًا.
إذن هنا، في list.py، دعوني
أمضي قدمًا وأقوم بما يلي.
دعوني أولاً أستورد getInt
من مكتبة CS50
بحيث يُمكننا الحصول على بعض
الأعداد الصحيحة من المستخدم.
دعوني أعطي نفسي مصفوفة والمعروفة أيضًا بأنها
قائمة في Python الآن.
إذن في C لا يمكنكم حقًا
التعبير عن هذه الفكرة تمامًا.
في Python، إذا كنتم تريدون
متغير يُسمى أرقام
وتريدون تهيئته
إلى قائمة فارغة،
فقط تقومون حرفيًا بفتح
قوس، ثم قوس مغلق.
لا يوجد رقم بينهما.
وكما فعلنا من قبل، لاتوجد فاصلة منقوطة.
دعونا الآن نقوم بما يلي
للأبد حتى أقوم بتقسيم هذا.
دعوني أمضي قدمًا وأحصل
على رقم من المستخدم،
فقط من خلال سؤاله عن رقم.
ثم دعوني أقول، إذا لم يكن رقمًا،
وأمضي قدمًا وأقوم بتقسيم هذا.
سيقوم هذا، كملاحظة جانبية،
فقط بالسماح لي أن أخرج
من هذا عن طريق الضغط على Control D كما 
ناقشنا من قبل.
ولكن هذه ميزة واجهة المستخدم فقط.
إذن يُعد ذلك أمرًا رائعًا إلى حد ما.

Arabic: 
لنفترض أنني أُريد تنفيذ
فكرة التحقق
إذا كان الرقم الذي قد كتبه المستخدم 
موجودًا في القائمة بالفعل، وإذا كان كذلك،
فلا تضيفوه.
سأمضي قدمًا وأفعل هذا.
لكن أولاً، دعونا نفعل هذا--
numbers.append number.
وهذه ميزة جديدة.
إذن ماذا أريد أن أفعل هنا؟
for number في numbers--
سأوضح هذا خلال ثانية--
دعوني أمضي قدمًا وأطبع number.
إذن ما الذي يتطلع هذا البرنامج لفعله؟
في الأعلى، سأستورد getInt.
في الأعلى أسفل ذلك، 
سأمنح نفسي فقط مصفوفة فارغة،
والتي تُسمى الآن قائمة، تُسمى أرقام.
ثم أفعل ما يلي للأبد.
أمضي قدمًا وأحصل على
الرقم من المستخدم.
إذا لم يقم هو أو هي بالفعل بكتابة
رقم، فقط قم بتقسيم هذا.
انتهى البرنامج من عمله.
لكن ها هي الميزة الجديدة.
كما هو الحال باستخدام السلاسل، فهي
كائنات، إذا جاز التعبير.
إنها بنيات بيانات
تحتوي على دالات مُدمجة.
إذن تحتوي القوائم على دالات مُدمجة.
هناك حرفيًا دالة
داخل كل قائمة في Python
وتُسمى append وحرفيًا تقوم بذلك.
تستدعون append ثم
تقوم هي بإلحاق أيًا كان مدخلها
إلى القائمة نفسها أيًا كانت.

English: 
Suppose I want to implement
the notion of checking
if the number the user's typed in
is in the list already, and if so,
not add it.
I'm going to go ahead and do that.
But first, let's just do this--
numbers.append number.
And this is a new feature.
So what do I want to do here?
For number in numbers--
I'll explain this in a second--
let me go ahead and print number.
So what is this program aspiring to do?
At the very top, I'm importing getInt.
At the very top below that, I'm
just giving myself an empty array,
now called a list, called numbers.
Then I do the following forever.
Go ahead and get the
number from the user.
If he or she did not actually type
in a number, just break out of this.
The program is done.
But here's the new feature.
Just as with strings, they
are objects, so to speak.
They are data structures
that have functions built in.
So do lists have functions built in.
There is literally a function
inside of every Python list
called append that literally does that.
You call append and it
appends whatever its input
is to whatever the list itself is.

English: 
So in C, you might have
had to use realloc.
You might have had to add
something to the end of the list.
None of that happens anymore.
Just at a high level, you
say append this to the list
and let the language
take care of it for you.
Then down here, left-aligned
all the way at the end,
is just saying, for number in numbers.
Like, iterate over all of the numbers
in the list and print out one at a time.
So let's try this.
Let me go down here and do Python of--
this is list.py-- and let me go ahead
and type in a number like 13, 42, 50.
And I'm going to hit Control D,
which means that's it, I'm done.
And there we see the three numbers.
It looks a little stupid
because you know what?
I think I need a print here.
Let's fix this.
Let me rerun this.
13, 42, 50, Control D, there we go.
One per line.
But what this program has is
honestly kind of a bug, potentially.
Suppose I want unique
numbers, now I have three 13s.
But I'd ideally just want one copy
of every number for whatever reason.
I want uniqueness.

Arabic: 
إذن في C، قد تضطرون 
إلى استخدام realloc.
قد تضطرون إلى إضافة
شيء إلى نهاية القائمة.
لكن لن يحدث أي من هذا بعد الآن.
فقط في مستوى عالٍ، تقولون
قومي بإلحاق هذا إلى القائمة
ودعوا اللغة تهتم
بهذا من أجلكم.
ثم هنا بالأسفل، تتم المحاذاة
إلى اليسار حتي النهاية،
فقط تقول، for number في numbers.
مثلًا، قم بالتكرار على جميع الأرقام
في القائمة وطباعة واحد في كل مرة.
إذن دعونا نجرب هذا.
دعوني أنتقل إلى هنا وأقوم بهذا--
python list.py-- ودعوني أمضي قدمًا
وأكتب رقمًا مثل 13، و42، و50.
وسأضغط على Control D،
والذي يعني أن هذا كل شيء، لقد انتهيت.
وهناك نرى الأرقام الثلاثة.
هذا يبدو غبيًا قليلاً
لأنه أتعلمون ماذا؟
أعتقد أنني بحاجة إلى طباعة هنا.
دعونا نُصلح هذا.
دعوني أعيد تشغيل هذا.
13، و42، و50، Control D، ها نحن ذا.
واحد كل سطر.
ولكن بصراحة هذا البرنامج لديه
خطأ نوعًا من، احتمالاً.
لنفترض أنني أريد أرقام فريدة، 
والآن لديّ ثلاثة من الرقم 13.
لكني وبشكل مثالي أريد نسخة واحدة
فقط من كل رقم لأيّ سبب من الأسباب.
أريد الطابع الفريد.

English: 
Well, notice how easily
you can express that.
If my goal is to only conditionally
add a number to the numbers list
if it's not already there,
how would you do this in C?
You have an array called numbers
and you want to first check
is a number in that array.
What would you do in English?
AUDIENCE: A for loop.
DAVID MALAN: A for loop, right?
You'd probably start at
the left, iterate over
the whole array looking for the number
and then conclude true or false,
it's in there.
It's not hard but it's
a little annoying.
You have to write more code, a couple
of lines, four lines for a for loop.
In Python, just say what you mean.
If number not in numbers, append it.
And it reads much more like English.
At the end of the day, some human wrote
the for loop that does that operation.
But we, the more modern programmers, can
just now say, if number not in numbers,
append it.
And so it is meant to
read more English-like.
So let's try this now.
13, 13, 50, done.
Now I just get one copy of the 13
because it's checking that for me.
Now, running time is still an issue.

Arabic: 
حسنًا، لاحظوا مدى سهولة
 تعبيركم عن ذلك.
إذا كان هدفي هو فقط إضافة
رقم إلى قائمة الأرقام بطريق مشروطة
إذا لم يكن هناك بالفعل،
كيف يمكنكم القيام بذلك بلغة C؟
لديكم مصفوفة تُسمى الأرقام
وتريدون التحقق أولاً
من وجود رقم في هذه المصفوفة.
ماذا كنتم ستفعلون بالإنجليزية؟
الجمهور: تكرار حلقي من النوع for.
ديفيد مالان: تكرار حلقي من النوع for، صحيح؟
على الأرجح ستبدأون من
اليسار، ثم تقومون بالتكرار على
المصفوفة بأكملها بحثًا عن الرقم
ثم تستنتجون إن كان صحيحًا أم خاطئًا،
إنه هناك.
هذا ليس صعبًا لكنه
مزعج قليلاً.
عليكم كتابة المزيد من التعليمات البرمجية،
سطرين، أربعة أسطر لتكرار حلقي من النوع for.
في Python، فقط قولوا ما تقصدونه.
If number not in numbers, append it.
ويبدو مشابهًا للغة الإنجليزية بصورة كبيرة.
في نهاية المطاف، كتب شخصًا ما
 التكرار الحلقي for الذي يقوم بهذه العملية.
لكن يُمكننا نحن، المبرمجين الأكثر حداثة،
الآن فقط القول، if number not in numbers،
append it.
إذن من المفترض
أن يبدو هذا شبيهًا باللغة الإنجليزية.
إذن دعونا نجرب هذا الآن.
13، و13، و50، تم.
الآن أحصل فقط على نسخة واحدة من الرقم 13
لأنه يقوم بالتحقق من ذلك لأجلي.
حاليًا، لا يزال وقت التشغيل يُمثل مشكلة.

English: 
Consider this,
theoretically, you're still
wasting some time looking for
a number because someone wrote
code that's probably linear search.
Maybe it's binary search if it's sorted.
But someone wrote that code.
But the point is, with these
higher level languages,
these more modern languages like Python,
that is not our problem, necessarily.
It only becomes our problem
if the program is just
too slow for some reason and we really
need to get into the weeds of why.
All right, let's look at a
final feature syntactically
before we try this to a
more generalized problem.
Let me go ahead and save
a file called struct0.py,
which is reminiscent of
struct0.c a few weeks back.
And let me go ahead and from the
CS50 library import getString.
Let me go ahead and give myself an array
this time called students that's empty,
or a list called students.
And then let me just get three
students for the sake of discussion.
So for i in range 3, that
just iterates three times,
let me go ahead and ask
the user for their name.
So getString, ask them for their name.
Then let me go ahead and
ask them for their dorm

Arabic: 
فكروا في هذا،
نظريًا، مازلتم
تضيعون بعض الوقت بحثًا عن رقم
لأن شخصًا ما كتب
تعليمة برمجية هي على الأرجح بحثًا خطيًا.
وربما تكون بحثًا ثنائيًا إذا تم ترتيبها.
لكن شخصًا ما كتب تلك التعليمة البرمجية.
لكن المغزى هو أنه، مع هذه 
اللغات عالية المستوى،
هذه اللغات الأكثر حداثة مثل Python،
هذه ليست مشكلتنا، بالضرورة.
تُصبح فقط مشكلتنا
إذا كان البرنامج
بطيئًا جدًا فقط لسببٍ ما، ونحن حقًا
بحاجة للوصول إلى تعقيدات السبب.
حسناً، دعونا ننظر إلى 
ميزة أخيرة من حيث الصياغة
قبل أن نحاول هذا على
مشكلة أعم.
دعوني أمضي قدمًا وأحفظ
ملفًا باسم struct0.py،
والذي يُذكرنا بـ struct0.c
منذ أسابيع قليلة.
دعوني أمضي قدمًا وأقوم
باستيراد getString من مكتبة CS50.
دعوني أمضي قدمًا وأعطي نفسي مصفوفة
هذه المرة تُسمى students وتكون فارغة،
أو قائمة تُسمى students.
ثم دعوني فقط أحصل على
ثلاثة طلاب من أجل المناقشة.
إذن for i in range 3، مما يعني أنه
يتكرر ثلاث مرات،
دعوني أمضي قدمًا وأسأل
المستخدمين عن أسمائهم.
إذن getString، اسألهم عن أسمائهم.
ثم دعوني أمضي قدمًا 
وأسأل عن سكنهم

English: 
and go ahead and get string for dorm.
And then that's enough.
Let me now go ahead and
append the student to my list.
So students dot append.
But I don't really have
a student structure yet.
Now, there's many ways we
can solve this, but let
me propose the simplest one.
It turns out in Python you can declare
hash tables so wonderfully simply.
A hash table is just a
collection of key value pairs.
And I would argue at this point in
my example I have keys and values.
I have a name which is a key and
the value, like David or whatever,
another key called dorm, and then
a value which is like Matthews
or wherever.
And so keys and values.
So it would be kind of nice if I
could create for myself a hash table--
or even a try, for that matter--
that allows me to store this data.
Well, it turns out in
Python, I can do just that.
I can go ahead and create
an object called student
using curly bracket notation.
And you can literally do this.
The name shall be one key.
And now it's going to
take on that value.
Dorm shall be another key and
it's going to take on that value.

Arabic: 
وأمضي قدمًا وأحصل على سلسلة للسكن.
ثم هذا كاف.
دعوني أمضي قدمًا وأقوم
بإلحاق الطالب بقائمتي.
إذن students.append.
ولكن حقًا ليس لديّ 
بنية student حتى الآن.
الآن، هناك العديد من الطرق
لحل هذا، ولكن دعوني
أقترح أبسط حل.
اتّضح أن في Python يُمكنكم إعلان
جداول علامات التجزئة بطريقة رائعة وبسيطة.
يُعد جدول علامات التجزئة مجرد
مجموعة من أزواج القيم الرئيسية.
ويُمكنني القول عند هذه المرحلة في
مثالي أنه لديّ كلمات رئيسية وقيم.
لديّ اسم وهو كلمة رئيسية وقيمته، 
مثل ديفيد أو أيًّا كان،
كلمة رئيسية أخري تُسمى سكن، ثم
قيمة وهي مثلاً Matthews
أو أيًّا كان.
إذن كلمات رئيسية وقيم.
لذلك سيكون لطيفًا نوعًا ما إذا تمكنت 
من إنشاء جدول علامة تجزئة--
أو حتى حاولت، لهذا الأمر--
والذي يسمح لي بتخزين هذه البيانات.
حسنًا، اتّضح في
Python، أنه يُمكنني القيام بذلك بالضبط.
يُمكنني أن أمضي قدمًا وأنشئ
كائنًا يُسمى student
باستخدام رمز القوس المتعرج.
ويمكنكم حرفيًا فعل هذا.
سيكون الاسم كلمة رئيسية.
والآن ستأخذ
هذه القيمة.
سيكون سكن كلمة رئيسية أخرى
وستأخذ هذه القيمة.

Arabic: 
إذن يُمكنني أن أُسمي هذا
أي شيء أريده-- x وy
وأعطيهم القيم ديفيد وMatthews
أو أيًّا كان ما سأقوم بكتابته.
ولكن إذا كنتم ترغبون في
بنية بيانات مُعمَّمة للغاية
بحيث لا تكون مجرد قائمة قيم من
من اليسار إلى اليمين، ولكن تحتوي على بيانات تعريف--
كلمة رئيسية، أو إذا كنتم تفكرون في 
جدول بيانات، أو اسم عمود
يُسمى اسمًا وعمود آخر يُسمى
سكنًا، وكلاهما لديه قيم--
فقط استخدموا أقواسًا متعرجة.
ثم قوموا بوضع الكلمات الرئيسية بين
علامات اقتباس ثم نقطتين.
ثم إذا كان لديكم كلمات رئيسية
متعددة، فقوموا فقط بوضع فاصلة.
إذن إنه مشفر قليلاً، لكن يبدو هذا
تماماً مثل حاوية، جدول علامة التجزئة،
يحتوي على كلمات وقيم.
الآن، في Python المجموعة الرابعة، عندما
قُمتم بتنفيذ المدقق الإملائي،
في الواقع كنتم فقط تقولون نعم أو لا،
هل الكلمة موجودة في القاموس؟
لكن بالتأكيد كان بإمكانكم
تخزين مزيد من المعلومات
بدلاً من القيم المنطقية فقط.
أنتم لستم بحاجة لفعل هذا كثيرًا.
إذن ما الذي يعنيه هذا لي؟
في هذه المرحلة من الموضوع،
لديّ كائن،
كما يُسمى في Python، والذي 
يُخزن هذه الكلمات الرئيسية وهذه القيم.
إذن إذا أردتُ لاحقًا التكرار 
عليهم، يُمكنني ذلك.

English: 
So I could call this
anything I want-- x and y
and have the values David and Matthews
or whatever it is I'm going to type in.
But if you want a very
generalized data structure
that isn't just a list of values from
left to right, but has metadata--
a key, or if you think of a
spreadsheet, a column name
called name and a column name called
dorm, each of which has values--
you just use curly braces.
And you put the keys in
quotes and then a colon.
And then if you've got multiple
keys, you just put a comma.
So it's a little cryptic, but this is
just like a container, a hash table,
that contains words and values.
Now, in p set 4, when
you implemented speller,
you actually just said yes or no,
is the word in the dictionary?
But you certainly could
have stored more information
instead of just Boolean values.
You just tended to not need to do that.
So what does this mean for me?
At this point in the
story, I have an object,
as it's called in Python, that
stores these keys and these values.
So if later on I want to iterate
over them, I can do this.

English: 
For student in-- oh,
you have to append it--
so student.append student.
Let's add the student to the list.
So for student in
students, which is just how
you iterate over every one
of the things in that list.
Let me just go ahead and say a
sentence like, I want to say so and so
is in this dorm.
So how do express that?
Well, so and so, I need to get
access to the student's name.
And the way I can do this is as follows.
I could say, let's go ahead and
say curly brace student bracket
name close bracket.
And then here, I can go ahead and say--
oops, let me put quotes in here--
and then here I can say student
bracket quote unquote dorm.
So this is admittedly the most
cryptic example we've done thus far.
But let's tease it apart
as a format string.
So if I zoom in on
this, what am I doing?
The curly braces and the f
just means format this string.
So you can ignore the curly braces
as part of our story from earlier.
Student is the name of the
variable in the for loop.
So it's the current student.

Arabic: 
For student in-- أوه، 
عليكم إلحاقه--
إذن student.append student.
دعونا نُضيف student إلى القائمة.
إذن for student in
students، وهذا كيف
تقومون بالتكرار على جميع 
الأشياء في هذه القائمة.
دعوني أمضي قدمًا وأقول 
جملة مثل، أريد أن أقول فلان
في هذا السكن.
كيف يمكن التعبير عن ذلك؟
حسنًا، فلان، أُريد الوصول 
إلى اسم الطالب.
والطريقة التي يُمكنني فعل هذا بها كما يلي.
يُكنني القول، دعوني أمضي قدمًا
وأقول قوس متعرج student قوس
name قوس مُغلق.
ثم هنا، يٌمكنني أن أمضي قدمًا وأقول--
عذرًا، دعوني أضع علامة اقتباس هنا--
ثم هنا يُمكنني أن أقول student قوس
ثم بين علامتي اقتباس dorm.
إذن في الحقيقة هذا أكثر
مثالاً مُشفرًا قمنا به حتى الآن.
لكن دعونا نُقسّم هذا
كسلسلة مُنسقة.
إذن إذا قُمت بتكبير هذا،
ما الذي أفعله؟
تعني الأقواس المتعرجة وحرف f
تنسيق هذه السلسة فقط.
إذن يُمكنكم تجاهُل الأقواس المتعرجة
كجزء من موضوعنا في وقت سابق.
student هو اسم المتغير
في التكرار الحلقي for.
إذن هذا هو الطالب الحالي.

English: 
The square brackets are new.
In C, the only time we used square
brackets was in what context?
AUDIENCE: Arrays.
DAVID MALAN: Arrays.
And what did we always put
in those square brackets?
A number.
Yeah, so 0, 1, 2.
You can index into an array.
What's cool about an object--
or a hash table more generally,
as we're now defining it--
is you can index into the variable
using not numbers, but words.
So you could think of student
as being like a list or an array
with two values-- name and dorm.
But it's nice to be able to refer
to those not as zero and one
or some stupid arbitrary
number, but rather by keys--
name and dorm.
So this syntax here, though
cryptic, says go inside the student
object and get me the value
of the key called name.
And this says the same thing about dorm.
So an object in Python--
or more generally a hash table-- allows
you to associate keys with values.
And this is quite simply
the syntax you use for that.
So let me go ahead and run this.

Arabic: 
لكن الأقواس المربعة جديدة.
في لغة C، المرة الوحيدة التي استخدمنا فيها
 الأقواس المربعة كانت في أي سياق؟
الجمهور: المصفوفات.
ديفيد ج. مالان: المصفوفات.
ومالذي كُنا نقوم بوضعه دائمًا في 
تلك الأقواس المربعة؟
رقم.
نعم، إذن 0، و1، و2.
يُمكنكم فهرستها إلى مصفوفة.
الشيء الرائع بشأن الكائن--
أو جدول علامة تجزئة بشكل أعمّ،
كما نقوم بتعريفه الآن--
هو أنه يُمكنكم الفهرسة إلى المتغير
عبر استخدام كلمات، وليس أرقام.
إذن يُمكنكم التفكير في student
كقائمة أو مصفوفة
ذات قيمتين-- name وdorm.
لكن من الجيد أن أكون قادرًا علي الإشارة
إليهم ليس كصفر وواحد
أو رقم اعتباطي غبي،
 لكن ككلمات رئيسية--
name وdorm.
إذن هذه الصيغة هنا، علي الرغم من أنها 
مُشفرة، تقول امضوا داخل كائن
student واحصلوا علي قيمة
الكلمة الرئيسية التي تُسمى name.
وهذا ينطبق أيضًا على dorm.
إذن يسمح لكم الكائن في Python--
أو بشكل أعم جدول علامة التجزئة--
بربط الكلمات الرئيسية بالقيم.
وهذه بكل بساطة
الصيغة المستخدمة لذلك.
إذن دعوني أمضي قدمًا وأُشغل هذا.

English: 
Struct0.py, type in my name.
Let's say Matthews.
Let's do, like, Veronica, Weld.
Let's do Brian.
Brian, where did you live?
AUDIENCE: Which year?
DAVID MALAN: Freshman year.
AUDIENCE: Pennypacker.
DAVID MALAN: Pennypacker, enter.
Not that these specifics
really matter, but now we
have expressed all of these sentences.
So the short of it now is we
didn't quite see this in C,
but we did see a hint of this
when we implemented our own hash
table in C so that we can actually
access keys and values arbitrarily.
So let's do a-- actually, let
me pause here for any questions
before we bring back Mario.
All right.
So let's now not just do examples
for the sake of demonstration,
but rewind to an old friend
that we've seen a few times
and just look at a
few different screens.
So in Super Mario Bros,
running left to right
you might recall or have seen that
there's stuff like this in the sky.
And Mario's supposed to
run under it and jump up
and he gets coins or whatever by jumping
up and hitting these question marks.

Arabic: 
Struct0.py-- اكتب اسمي.
لنقل ماثيوس.
دعونا نكتب، مثل، فيرونيكا، ويلد.
دعونا نكتب بريان.
بريان، أين كنت تعيش؟
الجمهور: أي سنة؟
ديفيد مالان: طالب فى السنة الأولى.
الجمهور: Pennypacker.
ديفيد مالان: Pennypacker, enter.
لم تكن هذه التفاصيل
مهمة حقًا، لكننا الآن قد
عبرنا عن جميع تلك الجمل.
إذن باختصار الآن لم
نر هذه تمامًا في لغة C،
لكننا رأينا لمحة عن هذه
عندما نفذنا جدول التجزئة
الخاص بنا في لغة C حتى يمكننا في الواقع 
الوصول إلى الكلمات الأساسية والقيم بشكل اعتباطي.
إذن دعونا نقوم بـ-- في الواقع، دعوني
أتوقف هنا لأتلقى أسئلتكم
قبل أن نُعيد لعبة ماريو.
حسنًا.
إذن دعونا الآن نقدم أمثلة
ليس فقط من أجل التوضيح،
لكن لنعود بالذاكرة إلى صديقنا القديم
الذي رأيناه بضع مرات
وننظر فقط على بعض
اللقطات المختلفة.
إذن في لعبة Super Mario Bros،
الركض من اليسار إلى اليمين
قد تتذكرون أو قد رأيتم أنه
يوجد شيء كهذا في سماء اللعبة.
ويُفترض أن يركض ماريو
تحتها ثم يقفز للأعلى
ثم يحصل على قطع نقدية أو أيًا كان
بالقفز عاليًا وإصابة علامات الاستفهام تلك.

English: 
So this is mostly a very
contrived way of saying,
suppose we want to
print out four question
marks on the screen just like Super
Mario Bros, how could we do it?
It's going to be a little black
and white, a little textual,
but how do I print out
four question marks?
Well, let me go over here and
let me create a file called,
let's say, Mario0.py.
And how do I do this?
What's the simplest way to do
this, print four question marks?
OK, I heard print.
OK, four question marks.
Very good.
So let's go ahead and run Mario0.
Correct, that's right.
So this is not bad.
It's one string, not a huge deal.
Let's do it at least with a
loop, as we've been often doing,
just to improve the
design, even though this
is a very tiny, tiny, tiny example.
So Mario1.py, let's go ahead and print
this out with a loop, for instance.
So how do I do this?
How do I print four question
marks, but one at a time?
For i in range four,
print, question mark.
Save, all right.
So Python, Mario.

Arabic: 
إذن تُعد هذه في الغالب
طريقة مُستنبطة لقول،
لنفترض أننا نريد
طباعة أربع علامات
استفهام على الشاشة تمامًا مثل
لعبة Super Mario Bros، كيف يمكننا القيام بذلك؟
ستبدو باللون الأبيض
والأسود قليلاً، نصية قليلاً،
ولكن كيف يمكنني طباعة
أربع علامات استفهام؟
حسنًا، دعوني أنتقل هنا
ودعوني أنشئ ملفًا باسم،
لنقل، Mario0.py.
وكيف يمكنني القيام بذلك؟
ما هي الطريقة الأبسط للقيام
بذلك، طباعة أربع علامات استفهام؟
حسنًا، سمعت طباعة.
حسنًا، أربع علامات استفهام.
جيد جدًا.
إذن دعونا نمضي قدمًا ونشغل Mario0.
صحيح، هذا صائب.
إذن هذا ليس سيئًا.
إنها سلسلة واحدة، لم يبدُ أن هذا أمر مهم.
دعونا نقوم بفعلها باستخدام 
تكرار حلقي على الأقل، كما نفعل في كثير من الأحيان،
فقط لكي نُحسن
التصميم، رغم أن هذا
يُعد مثالاً صغيرًا للغاية.
إذن Mario1.py، دعونا نمضي قدمًا ونطبع
هذا باستخدام تكرار حلقي، على سبيل المثال.
إذن كيف أفعل ذلك؟
كيف أطبع أربع علامات
استفهام، ولكن واحدة في كل مرة؟
For i in range four,
print, question mark.
حفظ، حسنًا.
إذن Python, Mario.

Arabic: 
هل يريد أحد منكم الصراخ
لا، لا تفعل هذا؟
حسنًا، شكرًا.
هذا رائع.
حسنًا،لمَ لا تريدون
أن أفعل ذلك؟
لأن جميعها عمودية.
إذن كان يمكننا إصلاح هذا الأمر الآن.
كيف أخبر الطباعة، لا تنهي
سطورك بالسطر الجديد الافتراضي؟
إذن ويساوي فقط علامة الاقتباس وإنهاء الاقتباس
لتجاوز قيمة الخط المائل العكسي n الافتراضية.
إذن الآن يمكنني إعادة تشغيل هذا.
حسنًا، يبدو أمرًا خاطئًا قليلاً.
إذن كيف يمكنني إصلاح ذلك بحيث
أضع سطرًا جديدًا فقط بعد آخر سطر؟
الجمهور: [INAUDIBLE]
ديفيد مالان: نعم، بصراحة،
أنا لا أطبع أي شيء فقط.
وهذا سيشتمل على تأثير
طباعة سطر جديد مجانًا.
إذن دعونا نفعل هذا.
حسنًا.
الآن لدينا مثال جيد هناك.
حسنًا، إذن يتضح أننا
طبعنا بالفعل على طول الطريق
مثالاً منفصلاً، بدا
مثل هذا، وإن كانت هناك أربع كتل.
إذن لن نفعل-- دعونا نمضي قدمًا
ونفعل ذلك بشكل رأسي،
ليس باستخدام علامات الاستفهام،
ولكن باستخدام علامات التجزئة مثل الكتل.
إذن إذا أردنا طباعة
علامات التجزئة الثلاث تلك،
دعوني أستحضر بعض الإلهام
من هذه ودعونا نقول في Mario2.py،
دعوني أمضي قدمًا وأقول
فقط for i في النطاق 3،

English: 
Does anyone want to yell
out, no, don't do that?
OK, thanks.
That's great.
All right, so why did you
not want me to do that?
Because they're all vertical.
So we did have a fix for this how.
Do I tell print, don't end your
lines with the default new line?
So and equals just quote unquote to
override the default backslash n value.
So now I can rerun this.
All right, it's a little buggy.
So how can I fix this and only
put a newline after the last one?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Yeah, honestly,
just do print nothing.
And that will have the effect
of printing a new line for free.
So let's do this.
OK.
Now we've got a good example there.
All right, so it turns out we
actually printed along the way
a separate example, which looked
like this, albeit with four blocks.
So we won't-- let's go ahead
and do this now vertically,
not with question marks,
but with hashes like bricks.
So if we want to print
out those three hashes,
allow me to draw some inspiration
from this and let's say in Mario2.py,
let me go ahead and just
say for i in range of three,

Arabic: 
امضي قدمًا واطبع كتلة واحدة.
وكما كنتم 
تنصحون، فقط أفعل ذلك--
أو لا، بدلاً من ذلك، دعونا
نستخدم الافتراضي لطباعة
شريط عمودي مكون من ثلاث كتل.
إذن هذا هو Mario2.py.
والآن قمنا بشيء 
يذكرنا بذلك.
لكن الآن تصبح الأمور مثيرة
للاهتمام قليلاً إذا انتقلنا إلى الأسفل.
ودعونا نركز على هذا المربع.
إذن ثلاثة بثلاثة، على سبيل المثال،
لكننا لم نرى
شيئًا تمامًا كهذا.
إذن في مثالنا الأخير هنا، لنرى.
هل لدينا متطوع شجاع يأتي إلى
الأعلى، لربط بعض هذه الأفكار
معًا؟
هل هذه يد مرفوعة في الخلف؟
تعالي إلى هنا.
إذن سيكون هذا Mario3.py،
هدفه هو طباعة قالب،
قالب أكبر--
إنه مثل ثلاثة بثلاثة-- مرحبًا مجددًا.
أندريا: مرحبًا.
ديفيد مالان: من أجل الجمهور، ما هو اسمك؟
أندريا: أندريا.
ديفيد ج. مالان: أندريا، سررتُ بلقائك.
أندريا: سررتُ بلقائك.
ديفيد مالان: حسنًا،
إذن الهدف المنشود
هو طباعة شبكة ثلاثة
بثلاثة فقط من
علامات التجزئة للتذكرنا بهذه الكتل.
حسنًا، أنتِ المسؤولة.
أندريا: حسنًا.
هل يجب أن أقوم، مثلاً، بتكرار حلقي أو شيء من هذا القبيل؟

English: 
go ahead and print out just one block.
And as you've been
advising, just do this--
or rather, no, let's use
the default to print out
a vertical bar of three blocks.
So this is Mario2.py.
And now we've done something
reminiscent of that.
But now things get a little
interesting if we go underground.
And let's focus on this square.
So three by three, for instance,
because we've not quite
seen something like this.
So in our last example here, let's see.
Could we get maybe a brave volunteer
to come on up, tie some of these ideas
together?
Is that a hand back there?
Come on down.
So this will be Mario3.py, the
goal of which is to print a brick,
a bigger brick--
it's like 3 by 3-- hello again.
ANDREA: Hello.
DAVID MALAN: For the
audience, what's your name?
ANDREA: Andrea.
DAVID MALAN: Andrea, nice to see you.
ANDREA: Nice to see you.
DAVID MALAN: All right,
so the goal at hand
is to print a three
by three grid of just
hashes reminiscent of those bricks.
All right, you're in charge.
ANDREA: All right.
Should I do, like, a loop or something?

English: 
DAVID MALAN: Whatever gets the job done.
All right, for.
OK, good.
OK, interesting.
OK, print, quote
unquote, print, yeah, OK.
ANDREA: OK.
Oh, right.
DAVID MALAN: Key detail.
ANDREA: What was it, a hash?
DAVID MALAN: A hash is fine, yeah.
ANDREA: OK.
DAVID MALAN: All right.
And before we do this, does everyone
want her to run this program
and be correct?
AUDIENCE: Don't do it.
DAVID MALAN: No, why?
Someone who claims no, what?
What's your concern?
AUDIENCE: N equals--
it'll do it [INAUDIBLE]
DAVID MALAN: Good, OK.
So you fixed that.
Good.
Any other concerns?
Yeah?

Arabic: 
دايفيد مالان: أيًّا كان ما يؤدي المهمة.
حسنًا، for.
حسنًا، جيد.
حسنًا، هذا أمر مثير للاهتمام.
حسنًا، طباعة، علامة الاقتباس 
وإنهاء الاقتباس، طباعة، نعم، حسنًا.
أندريا: حسنًا.
أوه، حسنًا.
دايفيد مالان: تفصيل الكلمة الرئيسية.
أندريا: ماذا كانت هذه، علامة تجزئة؟
دايفيد مالان: علامة التجزئة جيدة، نعم.
أندريا: حسنًا.
ديفيد مالان: حسنًا.
وقبل القيام بهذا، هل يُريد الجميع منها
أن تقوم بتشغيل هذا البرنامج
على أن يكون صحيحًا؟
الجمهور: لا تقومي بهذا.
ديفيد مالان: لا، لماذا؟
الشخص الذي صرح بالرفض، ماذا؟
ما هو سبب رفضك؟
الجمهور: N يساوي--
سيقوم بهذا [INAUDIBLE]
ديفيد مالان: جيد، حسنًا.
إذن قُمتَ بإصلاح ذلك.
جيد.
أي أسباب أخرى؟
أجل؟

Arabic: 
الجمهور: [INAUDIBLE]
ديفيد مالان: حسنًا.
هل سيكون هذا بالأعلى والأسفل؟
حسنًا، دعونا نرى.
هل يُمكنكِ إخبارنا لفظيًا-- 
هل يجب--
هل يُمكنكِ إخبارنا
ما الذي يقوم به البرنامج؟
[LAUGHTER]
أندريا: for i في النطاق 3،
إذن هذا سيحدث ثلاث مرات، ثم j
في النطاق 3، سيحدث الشيء
التالي أيضًا ثلاث مرات.
إذن نطبع علامة تجزئة.
ثم علامة تجزئة أخرى وهكذا
لأن النهاية هي علامات الاقتباس.
دايفيد مالان: حسنًا.
أندريا: ثم يحدث هذا 
ثم نقوم بطباعة سطر جديد.
ثم سيقوم بتنفيذ ذلك ثلاث مرات.
ديفيد مالان: حسنًا.
ما هو رأيكم؟
هل أنتم-- اقتنعت البطة.
حسنًا، لمَ لا تمضي قدمًا وتقومي بحفظ الملف.
دعونا نحاول.
لا ضرر في المحاولة، لذا
صحيح أم خاطئ، دعونا نرى.
هذا يُدعى Mario3.py، وأعتقد
أننا سنصفق لها إذا أمكننا.
عمل رائع للغاية.
حسنًا.
إذن دعونا-- وإذا كنتم تريدون واحدًا آخر.

English: 
AUDIENCE: [INAUDIBLE]
DAVID MALAN: OK.
Is it going to go up and down?
Well, let's see.
Can you walk us through
verbally-- do we have--
can you walk us through
what the program does?
[LAUGHTER]
ANDREA: For i in range 3, so this
will happen three times, then j
in range three, the next thing
will also happen three times.
So we print a hash.
And then we another
hash and another hash
because the end is the quotation marks.
DAVID MALAN: OK.
ANDREA: And then that happens
and then we print a new line.
And then it should
execute that three times.
DAVID MALAN: All right.
What do you think?
Do you-- the duck is convinced.
All right, why don't you
go ahead and save the file.
Let's try.
No harm in trying, so
right or wrong, let's see.
This is called Mario3.py, and I think
we have round of applause if we could.
Very nicely done.
All right.
So let's-- and if you'd like one more.

Arabic: 
إذن دعونا نلقي
نظرة على مثال واحد أخير،
قادم من دائرة كاملة من حيث بدأنا.
ألقينا نظرة بالطبع على تغيير الحجم.
ودعونا نفتح ذلك، فقط لنرى
كيف أكتب التعليمة البرمجية قليلاً
وأقوم بإنجاز هذا العمل بالفعل.
لذا في resize.py،
من حيث بدأنا،
لاحظوا أن لدي سطور قليلة
والتي آمل أن تكون مألوفة أكثر من ذلك قليلاً
الآن.
لكننا لم نقدم بالضبط
كل هذه الميزات بأنفسنا.
لذا يتضح أن في السطر
الأول والسطر الثاني لدينا
سطر واحد مألوف وسطر واحد غير مألوف.
يتيح لنا السطر الثاني الوصول إلى
وسيطات سطر الأوامر فقط، والتي
نحتاج إليها لتغيير حجم
الصورة النقطية.
تأتي القوة من
السطر الأول.
يتضح أن هناك مكتبة
في Python تُسمى pillow
والتي يمكنكم تثبيتها عن طريق كتابة
أمر معين في النافذة الطرفية الخاصة بي.
لا تأتي بالضرورة
مع جهاز Mac أو الكمبيوتر الشخصي الخاص بك.
يجب أن تقوم بتنزيلها
وتثبيتها باستخدام أمر.
ثم إذا كنتَ تقرأ
وثائقها، فستقول
من pil
لصورة استيراد pillow.
الآن، هذه ليست صورة محددة.
هذا اسم مكتبة
تُسمى مكتبة الصورة
التي تأتي مع هذا البرنامج
الذي جعله شخص ما متوفرًا مجانًا.

English: 
So let's take a look
at one final example,
coming full circle from where we began.
We of course looked at resize.
And let's open that up, just to see how
I got away with writing so little code
and actually getting that job done.
So in resize.py, which
is where we began,
notice that I had a few lines that
hopefully look a little more familiar
now.
But we didn't exactly introduce
all of these features ourselves.
So it turns out in line
one and line two we have
one unfamiliar and one familiar line.
Line two just gives us access to
a command line arguments, which
we needed for resizing the bitmap.
Line one is where a lot of
the power is coming from.
It turns out there's a library
in Python called pillow
that you can install by typing a
certain command at your terminal.
It doesn't necessarily
come with your Mac or PC.
You have to download it and
install it with a command.
And then if you read
its documentation, it
will say, from pill for
pillow import image.
Now, that's not a specific image.
That's the name of a
library called the image
library that comes with that software
that someone freely made available.

English: 
So that's just saying, give me
access to an image-related library.
And undoubtedly, there could exist
similar things in C. But we of course
did things very hands-on low-level.
All right, if the length of argv is
not 4, yell at the user with the usage.
And that's just if they don't cooperate
by typing in as they should, this.
It's a little more verbose
now because we have Python
and we have the file extension.
But we could technically clean
that up if we really wanted.
Lines 7, 8, and 9, there's
nothing really new there.
I'm just declaring three
variables implicitly typed.
I don't have to bother
saying int or string.
I'm accessing argv 1, 2,
and 3, which is 1, 2, and 3.
And then I'm doing one thing line 7.
What is line 7 doing that's important?
AUDIENCE: [INAUDIBLE]
DAVID MALAN: I'm changing the
argument from what is technically
a string by default-- because
indeed, it came from the human hands
at a keyboard-- and
converting it into a number.
Now, as an aside, if the user does
not provide a number like 2 or 10,
this code could break.
To be fair, I should really
have some error checking

Arabic: 
لذا هي تقول فقط، أمنحني حق
الوصول إلى المكتبة المتعلقة بالصورة.
ومما لا شك فيه، يمكن أن توجد
أشياء متشابهة في C. لكننا بالطبع
قمنا بأشياء على مستوى منخفض جدًا.
حسنًا، إذا كان طول argv ليس 4،
فسيخبر المستخدم بالاستخدام.
وهذا فقط إذا لم يتعاونوا
عن طريق الكتابة كما يجب، هذا.
إن الأمر أكثر إطنابًا قليلاً
الآن لأن لدينا Python
ولدينا ملحق الملف.
لكن يمكننا تنظيف ذلك
من الناحية الفنية إذا أردنا ذلك حقًا.
السطور 7 و8 و9، لا يوجد
شيء جديد هناك حقًا.
سأُعلن فقط عن ثلاثة
متغيرات مكتوبة ضمنيًا.
لا داعي للقلق حول
قول int أو سلسلة.
أصل إلى argv1 و2
و3، وهي 1 و2 و3.
ثم أقوم بشيء واحد السطر 7.
ما هو الشيء الذي يقوم به السطر 7 ويُعد مهمًا؟
الجمهور: [INAUDIBLE]
ديفيد مالان: أقوم بتغيير الوسيطة
من الناحية الفنية
سلسلة بشكل افتراضي-- لأنه
بالفعل، كتبتُه أيدي الأشخاص
على لوحة المفاتيح--
وتم تحويله إلى رقم.
الآن، كملاحظة جانبية، إذا لم يقدم المستخدم
رقمًا مثل 2 أو 10،
قد تنقسم هذه التعليمة البرمجية.
لنكن منصفين، يجب أن أتحقق
حقًا من الخطأ

Arabic: 
للتأكد إذا كان المستخدم قد كتب
مرحبًا وليس 2 أو 10،
أريد العثور على هذا الخطأ.
لذا أنا مهمل قليلاً.
لكن كان من المفترض حقًا
إظهار تعليمة برمجية موجزة.
لذا الآن لدينا infile وoutfile
محددين بالضبط كما كان من قبل.
لذا لدينا فقط ثلاثة سطور متبقية
وهي في الواقع تقوم بتنفيذ معظم السحر.
نعم.
الجمهور: [INAUDIBLE]
ديفيد مالان: انتظر، قل
الجزء الأخير مرة أخرى.
الجمهور: [INAUDIBLE]
ديفيد مالان: نعم.
الجمهور: كان هناك تقريبًا [INAUDIBLE]
ديفيد مالان: ملاحظة جيدة.
إذن هذا ليس مجرد تحويل
مدخلات المستخدم إلى قيمة ASCII معادلة
لأن هذا ليس ما نريده.
تم تحويل هذا int المُستخدَم هنا
بالفعل
كما عبر A2I، وهي دالة ربما
كنت تستخدمها منذ بضعة أسابيع،
انها مجرد تسمية
موجزة أكثر قليلاً.
هناك دالة تستطيع من خلالها
تحويل حرف أو سلسلة
إلى ما يعادلها من ASCII.
لكن ما يحدث هنا ليس هذا.
إنه يحول هذا إلى عدد
صحيح بطريقة أكثر بديهية

English: 
to make sure if the user typed
in hello and not 2 or 10,
I need to catch that error.
So I'm being a little sloppy.
But it was really meant to
demonstrate succinct code.
So now we have infile and outfile
defined exactly as before.
So we have just three lines left that
actually implement most of the magic.
Yeah.
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Wait, say
the last part again.
AUDIENCE: [INAUDIBLE]
DAVID MALAN: Yes.
AUDIENCE: There was almost [INAUDIBLE]
DAVID MALAN: Good observation.
So this is not just converting the
user's input to the equivalent ASCII
value because that's not what we want.
This int used here is
actually converting it
as via a2i, a function that you've
probably used a couple of weeks ago,
it's just named a
little more succinctly.
There is a function via which you
could convert a character or a string
to its ASCII equivalent.
But that's not what's going on here.
It does the more intuitive
turn this into an integer

Arabic: 
دون استخدام دالة
مسماة بطريقة مشفرة مثل a2i.
لذلك دعونا ننتقل إلى الأسفل
أكثر قليلاً إلى هذه الأسطر القليلة الأخيرة
ونرى ما الذي يحدث.
ستعرف كيفية القيام ببعضهم
فقط من خلال قراءة
الوثائق كما فعلنا تمامًا.
هذا يقول أعطني
متغيرًا يُسمى صورة.
يمكن أن يطلق عليه أي شيء.
أنا أحاول فقط أن أكون
متجانس داخل الملف.
هذا يقول، استخدم مكتبة الصور.
استخدم الدالة المفتوحة
التي تأتي معها.
إذن الصورة هي نوع من البنية،
والتي يوجد في داخلها
بعض الدالات المفيدة
المتعلقة بالصور.
لذا أطلق وظيفتها المفتوحة
على اسم الملف،
ثم امضِ قدمًا واستخرج
ارتفاعه وعرضه.
لذا يتضح أن هذا
صفًا آخر، إذا صح التعبير.
تشبه الصفوف، مرة أخرى، x فاصلة
y، خط الطول فاصلة خط العرض.
ستعرف فقط أنها صفوف
من خلال الوثائق.
لذا عندما أقول ارتفاع فاصلة، فإن هذا
يأخذ ما يعد تقنيًا قائمة
من الحجم اثنين-- أو حقًا، صف--
ويستخرج لي فقط
العرض والطول.
لكن دعوني لا ألقي بالاً
لهذه الصيغة المعينة.
المتبقي من هذا
يقول ما يلي.
أعطني متغيرًا جديدًا يُسمى الصورة.
قم باستدعاء دالة تغيير حجم صورة المدخلات،
وهي دالة أخرى
مضمنة فيه، تمامًا
مثل open، وقم بتغييرها

English: 
without using a cryptically
named function like a2i.
So let's scroll down just a little
further to these last few lines
and see what's going on.
Some of them you would only
know how to do from having
read the documentation just as we did.
This says give me a
variable called in image.
Could have called it anything.
I'm just trying to be
consistent with in file.
This says, use the image library.
Use its open function
that comes with it.
So image is some kind of
structure, inside of which
is some useful
image-related functionality.
So call its open function
on the name of the file,
then go ahead and extract
its height and width.
So turns out this is
another tuple, if you will.
Tuples, again, are like x comma
y, latitude comma longitude.
You'd only know that it is a
tuple from the documentation.
So when I say width comma height, this
is taking what's technically a list
of size two-- or really, a tuple--
and it's just extracting for
me the width and the height.
But let me wave my hands
at that particular syntax.
The rest of this just
says the following.
Give me a new variable called out image.
Call the input image's resize function,
another piece of functionality
built into it, just
like open, and change it

English: 
by this width and this height--
the original width times n,
the original height times n.
No padding manipulation, that's all
the responsibility of the library.
Some other human dealt
with all of that for us.
And this last line,
perhaps not surprisingly,
saves the output image
to that file name.
So in just, what, 15
lines of code and fewer
if we get rid of some of
the whitespace can you
implement the entirety of resize.
But really focusing on
the logic of the problem,
I want to take an input from the user.
I want to scale it up by a factor of n.
And I want to save out the file.
That's what you care about.
You don't necessarily care about getting
into the weeds of exactly what it
was you had to do when you did it in C.
So let's do one final example here.
You'll recall from problem set four
you implemented your own spell checker.
And odds are you did a try
or a hash table or the like.
And it turns out that is
non-trivial, certainly in C.
And it's non-trivial certainly for
the first time in any language.
But let me take a stab at
doing this now in Python.
Let me go into source 6 where
I have a speller example.

Arabic: 
بهذا الطول وهذا الارتفاع--
العرض الأصلي ضرب n،
الارتفاع الأصلي ضرب n.
لا يوجد تلاعب بالحشو،
هذا كله مسئولية المكتبة.
تعامل أشخاص آخرون
مع هذا الأمر لنا.
وهذا السطر الأخير،
ربما هذا ليس مفاجئًا،
يحفظ صورة المخرج
إلى اسم الملف هذا.
إذن في، تقريبًا، 15 سطرًا
من التعليمات البرمجية وأقل
إذا تخلصنا من بعض
المسافات، يمكنك
تنفيذ تغيير الحجم بالكامل.
لكن لنركز حقًا على
منطق المشكلة،
أرغب في أخذ مدخل من المستخدم.
أريد تكبيره باستخدام عامل n.
وأريد حفظ الملف.
هذا ما يهمك.
أنت لا تهتم بالضرورة بالدخول في
تعقيدات ما كان يجب عليك
القيام به عندما قمت به في C.
لذا لنقم بمثال واحد أخير هنا.
ستتذكر من مجموعة المشاكل الرابعة
أنك قمت بتطبيق مدقق التهجئة الخاص بك.
والاحتمالات هي أنك قمت بتجربة
أو جدول علامة تجزئة أو ما شابه ذلك.
ويتضح أن هذا ليس
تافهًا، بالتأكيد في C.
وهو غير تافه بالتأكيد
لأول مرة في أي لغة.
لكن دعوني أغتنم الفرصة
وأقوم بذلك الآن في Python.
اسمحوا لي بالانتقال إلى source 6 حيث
لديّ مثال على مدقق إملائي.

Arabic: 
ولاحظوا أن في هذا المجلد اليوم
أحضرت بعض الملفات معي.
لذا أحضرت نسخة
من القواميس
من المجموعة الرابعة 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 هذه.

English: 
And notice that in this folder today
I've brought a few files with me.
So I've brought a copy
of the dictionaries
from p set four, a copy of the text
files, like la-la land and the like
in text.
And then I brought two files--
dictionary.py and speller.py--
the latter of which is an
implementation of speller.c in Python.
And I'm not going to pull that one
up because we wrote that one entirely
for you.
But let me go ahead and write, for
instance, just my own dictionary.
So dictionary.py is the
analog of dictionary.c.
And let's go ahead and set this up.
Let me go ahead and create
this file in a separate folder
for now, so dictionary.py.
And there's a few
functions in dictionary.c
which we should probably
get around to implementing.
What are those functions?
AUDIENCE: Load.
DAVID MALAN: Load was
one, and load takes
the name of a file or a dictionary.
So let's do this.
And I'll just say to do.
Come back to that.
What other functions
were in dictionary.c?
Check, so def check.
And what did check take as an input?
A word, yep.
So we'll come back to this and
just come back to that to do.

English: 
What other functions?
AUDIENCE: Size.
DAVID MALAN: Size was one, so def size.
This did not take input, but it just
returned the size of the structure.
So we'll come back to that.
And lastly?
AUDIENCE: Unload.
DAVID MALAN: OK, so unload.
All right, so this is the Python
version of the distribution code
for speller for your dictionary file.
So unload also didn't take an argument.
So that's something for us to do, too.
So what's the gist of
making a spell checker?
You are loading words in your load
function from a dictionary file.
And the goal is to load
those somehow into memory.
You had a design decision
for the p set in C,
where you could make
a hash table or a try
or even a linked list or even an array.
But odds are the first of those
two were probably more efficient.
So it turns out that in
Python, you have the ability
to store words pretty readily in
any number of data structures.
You have not just ints
and floats and strings,
but you clearly have
lists, as we've seen.
We call them objects
or hashes, hash tables.
And there's other
things, too, even called
sets, where a set is kind of
just a collection of words

Arabic: 
ما هي الدالات الأخرى؟
الجمهور: Size.
ديفيد مالان: Size كان واحدًا، لذا def size.
هذا لم يأخذ مدخلاً، لكنه أعاد فقط
حجم البنية.
إذن سنعود إلى ذلك.
وأخيرًا؟
الجمهور: Unload.
ديفيد مالان: حسنًا، إذن unload.
حسنًا، هذا هو إصدار Python
من التعليمات البرمجية الخاص بالتوزيع
للمدقق الإملائي لملف القاموس الخاص بك.
لذا لا يأخذ unload أيضًا وسيطًا.
لذا هذا شيء علينا القيام به، أيضًا.
إذن ما هو مضمون
إنشاء مدقق إملائي؟
أنت تقوم بتحميل كلمات في دالة load
من ملف القاموس.
والهدف هو تحميل
تلك الكلمات بطريقة ما في الذاكرة.
كان لديك قرار تصميم
لمجموعة p في C،
حيث يمكنك أن تصنع
جدول علامة تجزئة أو محاولة
أو حتى قائمة مرتبطة أو حتى مصفوفة.
لكن الاحتمالات هي أن أول هؤلاء
الاثنين هو الأكثر كفاءة.
لذا يتضح أنه في
Python، لديك القدرة
لتخزين كلمات بسهولة في أي
عدد من بنيات البيانات.
ليس لديك فقط ints
وfloats وstrings،
ولكن لديك بوضوح
قوائم، كما رأينا.
نحن ندعوها كائنات
أو علامات تجزئة، أو جداول علامات التجزئة.
وهناك أشياء غيرها،
أيضًا، تُدعى حتى
مجموعات، حيث أن المجموعة هي
مجرد مجموعة من الكلمات

Arabic: 
والتي ستكون قابلة للبحث بسهولة.
أتعلمون ماذا؟
إذا كنت أريد في النهاية
تحميل بعض الكلمات، اسمحوا
لي بإعطاء نفسي متغير
عالمي يُدعى كلمات
وتهيئته إلى مجموعة فارغة.
إذن لدي متغير عالمي يُسمى
كلمات ولا شيء فيه حتى الآن.
لكنه مجموعة من الكلمات.
كيف يمكنني تحميل
كلمات في هذا القاموس؟
حسنًا، دعونا نمضي قدمًا
ونقوم بتنفيذ التحميل هنا.
لذا اسمحوا لي بالمضي قدمًا وإعلان
متغير يُسمى file وافتح
هذا القاموس في وضع القراءة،
تمامًا، كما هو الحال في C.
ثم كيف يمكنني دمج
السطور في ملف؟
لم نرَ ذلك.
لكنني أعرف كيفية تكرار
السلاسل في مصفوفة
والأرقام في سلسلة.
اسمحوا لي باتباع غريزتي
for line in file.
في الواقع، هذا سيفعل بالضبط
ما تريده أن يفعل.
ثم اسمحوا لي بالمضي قدمًا وإضافة السطر
التالي إلى بنية بيانات الكلمات الخاصة بي.
ثم دعوني أغلق الملف.
ثم اسمحوا لي أن أقول return
true لأن كل شيء على ما يرام.
تم.
حسنًا، أنا أختصر بعض
الأمور، من الناحية الفنية.
واسمحوا لي باستخدام تلك الدالة
التي ألمحت إليها في وقت سابق.
اسمحوا لي بالمضي قدمًا واستدعاء
r strip وstrip off

English: 
which would be very nicely searchable.
And so you know what?
If I want to ultimately
load some words, let
me give myself a global
variable called words
and just initialize it to an empty set.
So I have a global variable called
words and nothing is in it just yet.
But it's a set of words.
How do I go about loading
words into that dictionary?
Well, let's go ahead
and implement load here.
So let me go ahead and declare
a variable called file and open
this dictionary in read
mode, just as in C.
And then how do I integrate
over the lines in a file?
We've not seen that.
But I do know how to iterate
over the strings in an array
and the characters in a string.
So let me go with my
instinct for line in file.
Indeed, this will do exactly
what you want it to do.
Then let me go ahead and add to my
words data structure the following line.
And then let me close the file.
And then let me just say return
true because all is well.
Done.
All right, so I'm cutting
a few corners, technically.
Let me use that function
I alluded to earlier.
Let me go ahead and call
r strip and strip off

English: 
the new line because in
the file, technically,
when you're reading in those words,
every line ends with a backslash zero.
That's now part of the word.
So a minor correction there
that I'm stripping off the line.
But that's it for load.
How do I now check if a
given word is in that set?
Well, I can just say, if
word in words return true.
Else, return false.
Done with check.
How do I return the size
of this data structure?
How about I just return the length
of that structure, words, and then
unload--
heck, Python's doing this all for me--
done.
Let me shrink this.
And you know what?
This is a little verbose.
I don't actually need
to do this if else.
I could just return word in words and
that will return a Boolean for me.
And honestly, if I want to
lower case it, that's easy.
I can just do this
and take care of that.
Now it's even better.
That's p set 4.
Excited?
Wish we had done this in C?
So what is the whole
point of all of this,

Arabic: 
السطر الجديد لأنه في الملف،
تقنيًا،
عندما تقرأ في هذه الكلمات،
ينتهي كل سطر بخط مائل عكسي صفر.
هذا الآن جزء من الكلمة.
لذا تصحيح طفيف هنا
أنني سأتخلص من السطر.
لكن هذا كل شيء بشأن load.
كيف يمكنني الآن معرفة ما إذا كانت
كلمة معينة في هذه المجموعة؟
حسنًا، يمكنني فقط القول، if
word in words return true.
Else, return false.
تم التحقق.
كيف أعيد حجم
بنية البيانات هذه؟
ماذا عن مجرد إعادة طول
تلك البنية، والكلمات، ثم
unload--
سحقًا، يقوم Python بكل هذا من أجلي--
تم.
دعوني أُقلص هذا.
وأتعلمون ماذا؟
هذا أكثر إطنابًا قليلاً.
أنا لا أحتاج بالفعل
للقيام بـ if else هذه.
يمكنني فقط إعادة كلمة في كلمات
وهذا سيعيد تعبيرًا منطقيًا لي.
وبصراحة، إذا كنت أرغب في
كتابتها بأحرف صغيرة، هذا سهل.
أستطيع فقط فعل هذا
والاعتناء بذلك.
الآن إنه أفضل.
هذة المجموعة الرابعة p.
هل أنتم متحمسون؟
هل تتمنون أننا قمنا بهذا في C؟
إذن ما هو الهدف
الأساسي من كل هذا،

Arabic: 
لأن الهدف ليس خلق
نوعًا من الهموم الثقيلة والتساؤلات الآن.
لكن الهدف الأساسي من تقديم C
خلال هذه الأسابيع القليلة الماضية هو،
أولاً، لا شيء من هذا الآن
تأخذه على نحو مسلم به.
أعني، قد تتوق إلى
تنفيذ هذا في Python.
وربما كان عليك
قراءة بعض الوثائق
واكتشاف صيغ مختلفة.
لكن يا إلهي.
لقد قللنا مما يأخذ على الأرجح
الكثير من ساعاتك إلى ثوانٍ فقط
بمجرد كونك أكثر اطلاعًا
على اللغة.
لكن أيضًا، بالنسبة إلى أول
موضوع لدينا اليوم،
بمجرد حصولك على اللغة الصحيحة
والأداة المناسبة لهذه المهمة.
الآن، لا يعني هذا أن هذا
مثالي، لأنه في الواقع،
دعونا نمضي قدمًا ونقوم ببعض الاختبارات.
دعوني أنتقل إلى النافذة الطرفية الخاصة بي هنا.
وفي الواقع أحضرت الحل الخاص بي
في مجلد C الخاص بي هنا.
لنرَ.
لدي التعليمات البرمجية الخاصة بي
للمدقق الإملائي الذي تم تنفيذه في C هنا.
ودعوني أمضي قدمًا وأجرى اختبارًا.
دعوني أمضي قدمًا وأشغل
المدقق الإملائي على، لنقل، النص شكسبير.
هذا مدخل كبير جدًا.
دعونا نمضي قدمًا وننقر فوق Enter.
وها هو المدقق الإملائي الخاص بي يعمل.
ويتم إخرج كل الكلمات.
وكان الوقت الإجمالي لتشغيل المدقق الإملائي
في C، لنقل، 0.9 ثانية.

English: 
because the goal wasn't to create
sort of great angst and wonder now.
But the whole point of having introduced
C over these past few weeks is to,
one, none of this now
do you take for granted.
I mean, you might be longing for
having implemented this in Python.
And you might have had to
read some documentation
and figure out the various syntax.
But my God.
We whittled down what probably took
most of you hours into just seconds
once you're more comfortable
with the language.
But also, to our very
earliest point today,
once you have the right language
and the right tool for the job.
Now, it's not to say that this
is perfect, because in fact,
let's go ahead and do some tests.
Let me go into my terminal window here.
And I actually brought my own
solution in my C folder here.
Let's see.
I have my own code to speller
implemented in C here.
And let me go ahead and run a test.
Let me go ahead and run speller
on, say, the text Shakespeare.
That's a pretty big input.
Let's go ahead and hit Enter.
And this is my spell checker running.
And all the words are outputting.
And the time total to run speller
in C was, say, 0.9 seconds.

English: 
So that's actually pretty good.
In a second window, let me go up
here in another terminal window.
And let me go into today's code and
into the speller folder where I have
a Python version that I'm going
to run as follows-- speller.py--
let me go ahead and
run it on Shakespeare.
So we've not looked at speller.py.
But it is essentially line for line a
port, a translation, from C to Python.
But you're welcome to
look at that online.
And it's using my dictionary.py file.
Let me go ahead and run that.
It's running through all the words.
Top is Python, bottom is C. Here we go.
Here we go.
Here we go.
Now, this is a bit misleading because
again, the internet is the way.
We're using a web-based IDE, and so it's
funny that that appears so many times.
And you'll see it's not 10, 20
seconds, however long that was.
That was just the internet being slow.
And all we're timing is your
functions in both C and Python.
But what's the takeaway
between Python and C?

Arabic: 
هذا جيد في الواقع.
في نافذة ثانية، دعوني أذهب
لأعلى هنا في نافذة طرفية أخرى.
ودعوني أدخل في التعليمات البرمجية لهذا اليوم
وإلى مجلد المدقق الإملائي حيث لدي
إصدار Python سأشغله
كالتالي-- speller.py--
دعوني أمضي قدمًا
وأقوم بتشغيله على شكسبير.
إذن لم ننظر إلى speller.py.
لكنه في الأساس سطر لسطر،
منفذ، ترجمة، من C إلى Python.
لكنه مرحب بك للنظر
في ذلك عبر الإنترنت.
وتستخدم ملف dictionary.py الخاص بي.
دعوني أمضي قُدمًا وأشغل ذلك.
إنها تعمل خلال جميع الكلمات.
في الأعلى Python، في الأسفل C. ها نحن ذا.
ها نحن ذا.
ها نحن ذا.
الآن، هذا مضلل بعض الشيء لأنه
مجددًا، الإنترنت هو الوسيلة.
نستخدام IDE يعتمد على شبكة الإنترنت، وذلك
مضحك أنه يظهر مرات عديدة.
وسترى أنها ليست 10، 20
ثانية، مهما كان طول هذا الوقت.
هذا مجرد بطء في الإنترنت.
وكل ما نقوم بتوقيته هو
دالاتك في C وPython.
لكن ما هي الفروق بين
 Python وC؟

Arabic: 
المدخلات نفسها.
ماذا ترى؟
أجل؟
الجمهور: كونها أكثر إيجازًا [INAUDIBLE].
ديفيد مالان: نعم،
لن أقول الإيجاز.
إنها أكثر جمالية.
إنها أكثر--
الجمهور: [INAUDIBLE] تحديدًا.
ديفيد مالان: حسنًا، ليس حتى
هذا، على ما أعتقد.
هذه الإجابات صحيحة.
كلاهما صحيح.
جميع الأرقام الهامة
في الأعلى متطابقة.
ولكن ما هو المختلف بطريقة واضحة، على الرغم من ذلك؟
إنها أبطأ.
إذن، تبدو Python أبطأ، صحيح؟
يستغرق الأمر إجماليًا-- إذا
نظرنا فقط إلى رقمين--
1.55 ثانية في Python،
إذا تجاهلت سرعة الإنترنت
وألقِ نظرة على أداء التعليمات
البرمجية، مقابل 0.9.
إذن إنها أبطأ مرتين من
C. ما هو الفارق هناك؟
حسنًا، نعم، استغرق الأمر مني، ماذا، 10،
20، 30 ثانية لكتابة التعليمات البرمجية.
لكنها تستغرق مني ضعف
الوقت لتشغيلها.
الآن، هذا ليس بالأمر الجلل،
بالطبع، عندما نتحدث
عن بضعة ثواني هنا وهناك.
ولكن إذا كانت هذه مجموعة بيانات كبيرة
تقوم بتحليلها لبعض المشاريع
أو للعمل أو لأي نوع من مشاريع
التحليل والبيانات أكبر بكثير
من هذا-- خاصة في المجال
الطبي أو ما شابه--
ربما لا تريد استخدام Python.

English: 
Same inputs.
What do you see?
Yeah?
AUDIENCE: Be more concise [INAUDIBLE].
DAVID MALAN: Yeah, I
wouldn't say concise.
That's more aesthetic.
It's more--
AUDIENCE: Specific [INAUDIBLE].
DAVID MALAN: Well, not
even that, I think.
These are correct.
Both of them are correct.
All the important numbers
at the top are identical.
But what is clearly different, though?
It's slower.
So Python seems to be slower, right?
It takes in total-- if we
just look at two numbers--
1.55 seconds in Python, if
you ignore the internet speed
and just look at the code
performance, versus 0.9.
So it's almost twice as slow as
C. So what's the takeaway there?
Well, yes, it took me, what, 10,
20, 30 seconds to write the code.
But it's taking me
twice as long to run it.
Now, not a big deal,
of course, when we're
talking a few seconds here and there.
But if this were a big data set that
you're analyzing for some project
or for work or for any kind of analysis
project and the data is much larger
than even this-- especially in
the medical field or the like--
maybe you don't want to use Python.

English: 
Sure, you can bang out the code in
just a few minutes, maybe a few hours.
But once you run it, damn, it's
slower than using something like C.
Whereas in C, might take
you more time upfront.
And you might not even
have the comfort with C
anymore so it's going to take an even
longer because you have to go relearn
the language.
But when you run it, wow,
it runs twice as fast.
You therefore need
less RAM, potentially,
less hardware or less expensive hardware
because you can get away with more.
So again, this theme we keep seeing
in data structures and algorithms
is trade-offs.
Like, developer time is a resource
and it is wonderful that I
and now you would be able to
write code so much more quickly.
But you do have to
pay a price somewhere.
And there's clearly a price with Python.
And it's not because Python
is poorly implemented.
But what is the fundamental
difference between the paradigm
of programming in C versus in
Python as we've seen it today?
What's different?
Yeah?
AUDIENCE: [INAUDIBLE] line by
line, whereas C, it essentially--
[INAUDIBLE] optimize running
it, it will run [INAUDIBLE]..
DAVID MALAN: Indeed.
And let me flip it around.

Arabic: 
بالتأكيد، يمكنك إخراج التعليمات البرمجية في
دقائق معدودة، ربما بضع ساعات.
لكن بمجرد تشغيلها، اللعنة، تكون
أبطأ من استخدام شيء مثل C.
في حين أنه في C، قد يأخذ الأمر
مزيدًا من الوقت مقدمًا.
وقد لا ترتاح
مع C بعد الآن
لذا ستستغرق وقتًا أطول
لأنك يجب أن تعيد تعلم
اللغة.
لكن عند تشغيلها، رائع،
فإنها تعمل مرتين أسرع.
لذا، من المحتمل، أنك
تحتاج ذاكرة وصول عشوائي أقل،
أجهزة أقل أو أجهزة أقل تكلفة
لأنه يمكنك الوصول إلى المزيد بأجهزة أفضل.
إذن مجددًا، هذا الموضوع الذي نواصل رؤيته
في بنيات البيانات والخوارزميات
هو نوع من المقايضات.
مثل، وقت المطور هو مورد
ومن الرائع أنني
والآن أنتم سنكون قادرين على
كتابة التعليمات البرمجية بسرعة أكبر بكثير.
لكن عليك دفع
الثمن بمكان ما.
ومن الواضح أن هناك ثمنًا مع Python.
وليس بسبب أن Python
تم تنفيذها بشكل سيئ.
ولكن ما هو الفرق
الأساسي بين نموذج
البرمجة في C مقابل
Python كما رأيناها اليوم؟
ما هو الفرق؟
أجل؟
الجمهور: [INAUDIBLE] سطر بسطر،
بينما C، بشكل أساسي--
[INAUDIBLE] تحسين تشغيله،
فإنه سيتم تشغيل [INAUDIBLE]..
ديفيد مالان: بالفعل.
ودعوني أقلبه.

English: 
So with C, you're compiling
down to zeros and ones.
And that compiler is super smart.
And it's going to move
things around in memory.
It's going to talk the computer's
native language of zeros and ones.
Python is, indeed, reading your code, by
contrast, line by line, top to bottom,
left to right.
And even though technically underneath
the hood there is a compilation step,
there is nonetheless
some overhead involved.
The mere fact that we're no
longer running clang and then
getting 0's and 1's or running make and
getting zeros and ones, that's great.
But we have to pay the price somewhere.
So this is going to be thematic.
Like, there is no holy grail among
languages or tools or techniques.
There's going to be trade-offs
among your comfort, your familiarity
or recollection of a language,
how easy it is to use,
how succinctly you can type it, and
then how efficiently you can actually
run it on the screen.
And with C, hopefully now-- we
will not write any more C-code--
you have an appreciation in
Python of when you create a hash--
or a list, rather--
or if you create a set or a hash
table or the like, what you're really
getting access to is someone
else's implementation of p
set four and p set three and p set
two and p set one, in some form,

Arabic: 
لذا، باستخدام C، تقوم بالتجميع
إلى الأصفار والآحاد.
وهذا المجمع ذكي جدًا.
وسيحرك الأمور
في الذاكرة.
سيتحدث لغة الكمبيوتر
الأصلية من الأصفار والآحاد.
في الواقع، تقرأ Python التعليمات البرمجية الخاصة بك، على النقيض،
سطر بسطر، من الأعلى إلى الأسفل،
من اليسار إلى اليمين.
وعلى الرغم من أنه من الناحية التقنية تحت
الغطاء يوجد خطوة تجميع،
ومع ذلك هناك
بعض التجاوزات المضمنة.
مجرد حقيقة أننا لم نعد نشغّل
clang ومن ثم
نحصل على 0 و1 أو نشغّل make
ونحصل على أصفار وآحاد، هذا أمر عظيم.
لكن علينا دفع
الثمن بمكان ما.
إذن هذا سيكون موضوعيًا.
مثل، ليس هناك كأسًا مقدسة بين
اللغات أو الأدوات أو التقنيات.
سيكون هناك مقايضات
بين راحتك، أو معرفتك
أو تذكرك للغة،
أو مدى سهولة استخدامها،
و مدى سهولة كتابتها،
ومدى كفاءتك في
تشغيلها على الشاشة.
ومع C، نأمل الآن--
أننا لن نكتب أي تعليمات برمجية أكثر متعلقة بـ C--
لديكم تقدير في
Python عند إنشاء علامة تجزئة--
أو قائمة، بدلاً من ذلك--
أو إذا قمتم بإنشاء مجموعة أو جدول 
علامة تجزئة أو ما شابه ذلك، ما يمكنك الوصول إليه حقًا
هو تنفيذ شخص آخر
للمجموعة
الرابعة p والمجموعة الثالثة p والمجموعة الثانية p
والمجموعة الأولى p، في شكل ما،

English: 
but now exposed to you in a more
powerful and more modern language.
So let's end there officially today.
And next week, we'll do the same thing,
but in the context of web programming.

Arabic: 
ولكن الآن يتم عرضهم لك في لغة
أكثر قوة وحداثة.
إذن دعونا ننتهي هنا رسميًا اليوم.
وفي الأسبوع المقبل، سنقوم بالشيء ذاته،
ولكن في سياق برمجة الويب.
