{"id":"l-pda-1-2","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"خزّن القيم في متغيّرات، وميّز بين الأعداد الصحيحة والعشرية والنصوص والقيم المنطقية و None، وحوّل نصًا مثل &quot; $129.00&quot; إلى رقم تستطيع الحساب به.","html":"<p>يصلك بند طلب من ملف مُصدَّر فوضوي: سعر الوحدة فيه <code dir=\"ltr\">$129.00</code>، والكمية <code dir=\"ltr\">2</code>، وطُبّق عليه كوبون خصم 15%. الإنسان يقرأ ذلك ويحسب إيراد هذا البند في ذهنه. أما Python فلا تستطيع ذلك بعد: بالنسبة إليها، <code dir=\"ltr\">&quot;$129.00&quot;</code> قطعة من النص، ليست رقمًا أكثر من كلمة <code dir=\"ltr\">&quot;skillet&quot;</code>. أن تعرف نوع القيمة التي بين يديك هو أول مهارة في العمل على البيانات.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">القيم والمتغيّرات</h2>\n<p>القيمة قطعة من البيانات: <code dir=\"ltr\">2</code> أو <code dir=\"ltr\">129.0</code> أو <code dir=\"ltr\">&quot;Cast Iron Skillet&quot;</code> أو <code dir=\"ltr\">True</code>. والمتغيّر اسم تربطه بقيمة باستخدام <code dir=\"ltr\">=</code> لتستعملها لاحقًا.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">product </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Cast Iron Skillet 26cm\"</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">unit_price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 39</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">quantity </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 2</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">line_total </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> unit_price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> quantity</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(product, line_total)</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>اقرأ <code dir=\"ltr\">line_total = unit_price * quantity</code> من اليمين إلى اليسار: تحسب Python الطرف الأيمن أولًا، ثم تجعل الاسم الذي على اليسار يشير إلى النتيجة. أسماء المتغيّرات كلمات بأحرف صغيرة تربط بينها شرطة سفلية (<code dir=\"ltr\">unit_price</code>، لا <code dir=\"ltr\">UnitPrice</code> ولا <code dir=\"ltr\">unitprice</code>)؛ يُسمّى هذا العُرف snake_case، وكل كود Python ستقرؤه يلتزم به.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">لكل قيمة نوع</h2>\n<p>النوع يحدّد ما يمكنك فعله بالقيمة، والدالة <code dir=\"ltr\">type()</code> تكشفه:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"1\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">type</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))            </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># int: whole numbers</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">type</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">129.0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))        </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># float: numbers with a decimal point</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">type</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"129.00\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># str: text, in single or double quotes</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">type</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">True</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))         </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># bool: True or False</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">type</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">None</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))         </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># NoneType: \"no value here\"</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<p>لاحظ أن <code dir=\"ltr\">&quot;129.00&quot;</code> من النوع <code dir=\"ltr\">str</code>. علامات التنصيص تصنع نصًا، حتى لو بدت الحروف التي بداخلها أرقامًا. هذه الحقيقة وحدها تفسّر عائلة كاملة من أخطاء البيانات: عمود يبدو رقميًا لكنه قُرئ نصًا، فيضع <code dir=\"ltr\">&quot;100&quot;</code> قبل <code dir=\"ltr\">&quot;20&quot;</code> عند الترتيب ويرفض الجمع.</p>\n<h3 id=\"sec-3\" tabindex=\"-1\">العمليات الحسابية</h3>\n<p>تدعم الأرقام العوامل التي تتوقّعها، إضافة إلى ثلاثة عوامل مهمة في التحليل:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"2\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">10</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> /</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 2.5  true division, always a float</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">10</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> //</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 2    floor division: whole boxes of 4</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">10</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> %</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 2    remainder: items left over</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> **</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 8    power</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> +</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0.2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 0.30000000000000004</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>السطر الأخير ليس خطأ في Python. الحواسيب تخزّن الأعداد العشرية بالنظام الثنائي، لذلك تُخزَّن معظم الكسور العشرية كتقريب صغير جدًا. مع المبالغ المالية تقرّب في النهاية باستخدام <code dir=\"ltr\">round(value, 2)</code>، ولا تقارن أبدًا بين عددين عشريين بـ <code dir=\"ltr\">==</code> بعد عملية حسابية إلا إذا قرّبت الاثنين. سيعود القسم 4 إلى هذه النقطة حين لا تتطابق المجاميع تمامًا.</p>\n<p>وهناك مفاجأة أخرى مختبئة في <code dir=\"ltr\">round()</code> نفسها. تقرّب Python الأنصاف التامة إلى أقرب رقم زوجي، فتكون <code dir=\"ltr\">round(0.5)</code> مساوية لـ <code dir=\"ltr\">0</code> و<code dir=\"ltr\">round(2.5)</code> مساوية لـ <code dir=\"ltr\">2</code>، كما أن قيمة مثل <code dir=\"ltr\">2.675</code> تُخزَّن أقل قليلًا مما تبدو، فتعطي <code dir=\"ltr\">round(2.675, 2)</code> النتيجة <code dir=\"ltr\">2.67</code>. في التحليل وإعداد التقارير لا يهم هذا أبدًا. أما في الفواتير، حيث يجب أن يتبع كل سنت قاعدة محاسبية، فتوجد الوحدة <code dir=\"ltr\">decimal</code> في Python؛ لن تحتاجها في هذه الدورة، لكنك الآن تعرف أين تبحث حين يسألك زميل من قسم المالية.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">النص سلسلة من الحروف</h2>\n<p>تأتي النصوص (strings) مع methods: دوال مرتبطة بالقيمة تستدعيها بنقطة. هذه هي التي ستستخدمها باستمرار:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"3\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">raw </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"  united KINGDOM \"</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(raw.strip())                 </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># remove spaces at both ends</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(raw.strip().title())         </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># \"United Kingdom\"</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(raw.upper())                 </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># all capitals</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"$129.00\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">.replace(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"$\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))  </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># swap one substring for another</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Cartwheel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))            </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># number of characters: 9</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n<p>كل واحدة من هذه تعيد نصًا <strong>جديدًا</strong>. النصوص غير قابلة للتعديل (immutable): <code dir=\"ltr\">raw.strip()</code> لا تغيّر <code dir=\"ltr\">raw</code>. إذا أردت الاحتفاظ بالنسخة المنظّفة، فأسندها إلى متغيّر: <code dir=\"ltr\">country = raw.strip().title()</code>.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">التحويل بين الأنواع</h2>\n<p>الدوال <code dir=\"ltr\">int()</code> و<code dir=\"ltr\">float()</code> و<code dir=\"ltr\">str()</code> تحوّل القيم، لكن فقط حين يكون للتحويل معنى:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"4\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">quantity </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> int</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"2\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> float</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"129.00\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">label </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Qty: \"</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> +</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> str</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(quantity)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(quantity </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> price, label)</span></span></code></pre><div class=\"run-output\" data-run-output=\"4\" hidden></div></div>\n<p>تفشل <code dir=\"ltr\">float(&quot;$129.00&quot;)</code> برسالة <code dir=\"ltr\">ValueError: could not convert string to float: '$129.00'</code>. الحل أن تنظّف أولًا ثم تحوّل. تستطيع تسلسل الـ methods من اليسار إلى اليمين، فتعمل كل واحدة على نتيجة التي قبلها:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"5\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"5\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">price_text </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \" $129.00\"</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> float</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(price_text.strip().replace(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"$\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">discount </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0.15</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">line_revenue </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> round</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> *</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> -</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> discount), </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(price, line_revenue)</span></span></code></pre><div class=\"run-output\" data-run-output=\"5\" hidden></div></div>\n<p>هذه هي معادلة الإيراد التي تستخدمها Cartwheel لكل بند في الطلب: الكمية مضروبة في سعر الوحدة مضروبًا في واحد ناقص الخصم. ستطبّقها على آلاف الصفوف دفعة واحدة في القسم 2؛ وهنا تراها على صف واحد.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>جمع نص مع رقم</span></p>\n<p>الكود <code dir=\"ltr\">&quot;Qty: &quot; + 2</code> يسبّب <code dir=\"ltr\">TypeError: can only concatenate str (not &quot;int&quot;) to str</code>. لا تخمّن Python أبدًا إن كنت تقصد نصًا أم حسابًا. حوّل صراحةً، <code dir=\"ltr\">&quot;Qty: &quot; + str(2)</code>، أو استخدم f-string، وهو ما يشرحه الدرس 1.5.</p>\n</aside>\n<h2 id=\"sec-6\" tabindex=\"-1\">القيم المنطقية والمقارنات</h2>\n<p>تنتج المقارنات <code dir=\"ltr\">True</code> أو <code dir=\"ltr\">False</code>، وبها تجيب عن أسئلة نعم/لا حول بياناتك:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"6\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"6\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">line_revenue </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 219.3</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(line_revenue </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">>=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 200</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)       </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># True</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(line_revenue </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">==</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 219.3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># True: equal values</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"web\"</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> !=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"mobile_app\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># True: not equal</span></span></code></pre><div class=\"run-output\" data-run-output=\"6\" hidden></div></div>\n<p>علامة <code dir=\"ltr\">=</code> واحدة للإسناد؛ وعلامتان <code dir=\"ltr\">==</code> للمقارنة. الخلط بينهما أشهر خطأ كتابي عند المبرمجين الجدد، وتساعدك Python برفض <code dir=\"ltr\">if x = 3:</code> كخطأ في الصياغة (syntax error).</p>\n<p>أما <code dir=\"ltr\">None</code> فقيمة مستقلة تعني “لا شيء هنا”. كود كوبون مفقود أو درجة رضا غير معروفة تكون <code dir=\"ltr\">None</code> في Python العادية. ولـ pandas علاماتها الخاصة للبيانات المفقودة، والقسم 3 مخصّص للتعامل معها بعناية.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>افحص الأنواع حين تبدو النتائج غريبة</span></p>\n<p>حين يتصرّف رقم بشكل غريب (لا يقبل الجمع، أو يُرتَّب خطأً، أو يُطبع بين علامتي تنصيص)، اطبع <code dir=\"ltr\">type(value)</code> قبل أي شيء آخر. في تسع مرات من كل عشر، يكون الرقم نصًا متخفّيًا.</p>\n</aside>\n<p>التمرين التالي يحوّل صفًا واحدًا من الملف الفوضوي إلى أرقام حقيقية. وفي الدرس القادم تخزّن قيمًا كثيرة دفعة واحدة في القوائم والقواميس.</p>\n","toc":[{"id":"sec-1","text":"القيم والمتغيّرات","level":2},{"id":"sec-2","text":"لكل قيمة نوع","level":2},{"id":"sec-3","text":"العمليات الحسابية","level":3},{"id":"sec-4","text":"النص سلسلة من الحروف","level":2},{"id":"sec-5","text":"التحويل بين الأنواع","level":2},{"id":"sec-6","text":"القيم المنطقية والمقارنات","level":2}],"takeaways":["المتغيّر اسم يشير إلى قيمة؛ <code dir=\"ltr\">=</code> تُسند القيمة، و<code dir=\"ltr\">==</code> تقارن.","لكل قيمة نوع، والدالة <code dir=\"ltr\">type()</code> تخبرك به؛ ومعظم الأخطاء في العمل على البيانات سببها قيمة نوعها غير الذي توقّعته.","العامل <code dir=\"ltr\">/</code> يعيد دائمًا عددًا عشريًا (float)، و<code dir=\"ltr\">//</code> يُسقط الباقي، و<code dir=\"ltr\">%</code> يعطيك الباقي.","الـ methods الخاصة بالنصوص مثل <code dir=\"ltr\">strip()</code> و<code dir=\"ltr\">replace()</code> تعيد نصًا جديدًا، ولا تغيّر النص الأصلي أبدًا.","حوّل النص إلى رقم باستخدام <code dir=\"ltr\">int()</code> و<code dir=\"ltr\">float()</code> فقط بعد إزالة الرموز مثل <code dir=\"ltr\">$</code> والمسافات."],"further":[{"title":"An Informal Introduction to Python (numbers and text)","url":"https://docs.python.org/3/tutorial/introduction.html"},{"title":"Built-in Types - String Methods","url":"https://docs.python.org/3/library/stdtypes.html#string-methods"},{"title":"Floating-Point Arithmetic: Issues and Limitations","url":"https://docs.python.org/3/tutorial/floatingpoint.html"}],"quiz":[{"q":"<p>ماذا يطبع هذا الكود؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"39\"</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(price </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span></code></pre></div>\n","options":[{"text":"<code dir=\"ltr\">78</code>","why":"هذا يتطلّب <code dir=\"ltr\">int(price) * 2</code>. أما بالشكل المكتوب فـ <code dir=\"ltr\">price</code> نص."},{"text":"<code dir=\"ltr\">3939</code>","why":"صحيح. ضرب نص في عدد صحيح يكرّره. القيمة وصلت نصًا، فلم تحدث أي عملية حسابية."},{"text":"خطأ <code dir=\"ltr\">TypeError</code>","why":"الضرب <code dir=\"ltr\">str * int</code> مسموح في Python (يكرّر النص). الخطأ يحدث مع الجمع <code dir=\"ltr\">str + int</code>."}],"answer":1},{"q":"<p>أيّ سطر يحوّل <code dir=\"ltr\">&quot;$1,250.00&quot;</code> إلى العدد العشري <code dir=\"ltr\">1250.0</code>؟</p>","options":[{"text":"<code dir=\"ltr\">float(&quot;$1,250.00&quot;)</code>","why":"الدالة <code dir=\"ltr\">float()</code> تقبل الأرقام والفاصلة العشرية والإشارة والأُس والمسافات في الطرفين، لكنها لا تقبل الرمز <code dir=\"ltr\">$</code> ولا فاصلة الآلاف، لذا يسبّب هذا السطر خطأ <code dir=\"ltr\">ValueError</code>."},{"text":"<code dir=\"ltr\">int(&quot;$1,250.00&quot;.replace(&quot;$&quot;, &quot;&quot;))</code>","why":"الفاصلة ما زالت موجودة، و<code dir=\"ltr\">int()</code> سترفض <code dir=\"ltr\">.00</code> على أي حال."},{"text":"<code dir=\"ltr\">float(&quot;$1,250.00&quot;.replace(&quot;$&quot;, &quot;&quot;).replace(&quot;,&quot;, &quot;&quot;))</code>","why":"صحيح. أزِل كل رمز أولًا، ثم حوّل الأرقام النظيفة."},{"text":"<code dir=\"ltr\">str(&quot;$1,250.00&quot;).strip()</code>","why":"الـ method <code dir=\"ltr\">strip()</code> لا تزيل إلا المسافات في الطرفين، والنتيجة تبقى نصًا."}],"answer":2},{"q":"<p>ما قيمة <code dir=\"ltr\">10 / 4</code> وقيمة <code dir=\"ltr\">10 // 4</code>؟</p>","options":[{"text":"<code dir=\"ltr\">2.5</code> و <code dir=\"ltr\">2</code>","why":"صحيح. القسمة العادية تعيد دائمًا عددًا عشريًا، والقسمة الصحيحة (floor division) تُسقط الجزء الكسري."},{"text":"<code dir=\"ltr\">2</code> و <code dir=\"ltr\">2.5</code>","why":"العكس هو الصحيح. العامل <code dir=\"ltr\">//</code> هو الذي يقرّب إلى الأسفل."},{"text":"<code dir=\"ltr\">2.5</code> و <code dir=\"ltr\">2.5</code>","why":"العامل <code dir=\"ltr\">//</code> قسمة صحيحة ولا يحتفظ بالجزء الكسري أبدًا."}],"answer":0},{"q":"<p>كود الكوبون الخاص بأحد العملاء غير معروف. أيّ قيمة تمثّل ذلك بأفضل شكل في Python؟</p>","options":[{"text":"النص الفارغ <code dir=\"ltr\">&quot;&quot;</code>","why":"النص الفارغ قيمة حقيقية (نص بلا حروف). قد يعني “لا كوبون” أو “غير معروف”، وهذا بالضبط هو الغموض الذي تريد تجنّبه."},{"text":"الرقم <code dir=\"ltr\">0</code>","why":"الصفر رقم حقيقي، وسيُحسب في المجاميع والمتوسطات كأنه بيانات."},{"text":"<code dir=\"ltr\">None</code>","why":"صحيح. <code dir=\"ltr\">None</code> هي العلامة المدمجة في Python لمعنى “لا قيمة هنا”. ولـ pandas علاماتها الخاصة للقيم المفقودة، وستتعرّف عليها في القسم 3."}],"answer":2}],"exercise":{"kind":"python","files":[],"starter":"# One row from Cartwheel's messy export, exactly as it arrived\nprice_text = \" $129.00\"\nquantity_text = \"2\"\ndiscount = 0.15\n\n# 1. Turn price_text into a float\nprice = None\n\n# 2. Turn quantity_text into an int\nquantity = None\n\n# 3. Line revenue = quantity * price * (1 - discount), rounded to 2 decimals\nline_revenue = None\n\n# 4. True when line_revenue is 200 or more\nis_large = None\n","solution":"price_text = \" $129.00\"\nquantity_text = \"2\"\ndiscount = 0.15\n\nprice = float(price_text.strip().replace(\"$\", \"\"))\nquantity = int(quantity_text)\nline_revenue = round(quantity * price * (1 - discount), 2)\nis_large = line_revenue >= 200\n","checks":[{"id":"price-float","test":"type(price) is float and price == 129.0"},{"id":"quantity-int","test":"type(quantity) is int and quantity == 2"},{"id":"revenue","test":"isinstance(line_revenue, float) and line_revenue == 219.3"},{"id":"is-large","test":"is_large is True"}],"title":"حوّل صفًا فوضويًا إلى أرقام","prompt":"<p>يعطيك صف من الملف المُصدَّر الفوضوي القيم <code dir=\"ltr\">price_text = &quot; $129.00&quot;</code> و<code dir=\"ltr\">quantity_text = &quot;2&quot;</code> و<code dir=\"ltr\">discount = 0.15</code>. أنشئ <code dir=\"ltr\">price</code> (عددًا عشريًا float)، و<code dir=\"ltr\">quantity</code> (عددًا صحيحًا int)، و<code dir=\"ltr\">line_revenue</code> (الكمية × السعر × (1 − الخصم)، مقرّبًا إلى منزلتين عشريتين)، و<code dir=\"ltr\">is_large</code> (قيمة منطقية تساوي <code dir=\"ltr\">True</code> حين يكون <code dir=\"ltr\">line_revenue</code> مساويًا لـ 200 أو أكثر). احسب من المتغيّرات، ولا تكتب الإجابات بيدك.</p>\n","hints":["الدالتان <code dir=\"ltr\">float()</code> و<code dir=\"ltr\">int()</code> تحوّلان النص، لكن النص النظيف فقط: أرقام وفاصلة عشرية.","أزِل المسافة بـ <code dir=\"ltr\">.strip()</code> وعلامة الدولار بـ <code dir=\"ltr\">.replace(&quot;$&quot;, &quot;&quot;)</code> قبل استدعاء <code dir=\"ltr\">float()</code>.","<code dir=\"ltr\">line_revenue = round(quantity * price * (1 - discount), 2)</code> و<code dir=\"ltr\">is_large = line_revenue &gt;= 200</code>."],"explanation":"<p>ينتج <code dir=\"ltr\">price_text.strip().replace(&quot;$&quot;, &quot;&quot;)</code> النص <code dir=\"ltr\">&quot;129.00&quot;</code>، وهو نص تقبله <code dir=\"ltr\">float()</code>. وتعطي <code dir=\"ltr\">int(&quot;2&quot;)</code> العدد الصحيح 2. معادلة الإيراد تضرب ثلاثة أرقام؛ وبدون <code dir=\"ltr\">round()</code> ستحصل على <code dir=\"ltr\">219.29999999999998</code> بسبب طريقة تخزين الأعداد العشرية. والمقارنة مثل <code dir=\"ltr\">line_revenue &gt;= 200</code> تُقيَّم أصلًا إلى <code dir=\"ltr\">True</code> أو <code dir=\"ltr\">False</code>، فتُسندها مباشرة؛ لا حاجة إلى <code dir=\"ltr\">if</code>.</p>\n","checkLabels":{"price-float":"<code dir=\"ltr\">price</code> هو العدد العشري 129.0","quantity-int":"<code dir=\"ltr\">quantity</code> هو العدد الصحيح 2","revenue":"<code dir=\"ltr\">line_revenue</code> يساوي 219.3","is-large":"<code dir=\"ltr\">is_large</code> يساوي <code dir=\"ltr\">True</code>"}},"words":652,"readMinutes":4}