كيفية العثور على القيمة المطلقة في بايثون

تعلّم كيفية التعامل مع القيم المطلقة في بايثون باستخدام دالة ()abs المدمجة للأرقام والمصفوفات والكائنات المخصصة. يوضح لك هذا الدرس كيفية تنفيذ دالة القيمة المطلقة من الصفر، واستخدامها مع الأرقام، وتخصيص سلوكها لأنواع البيانات مثل مصفوفات NumPy وسلاسل pandas.

لا تقلق إذا كانت معرفتك الرياضية بدالة القيمة المطلقة ضعيفة بعض الشيء. ستبدأ بتنشيط ذاكرتك قبل التعمق في شيفرة بايثون. مع ذلك، لا تتردد في تخطي القسم التالي والانتقال مباشرةً إلى التفاصيل الدقيقة التي تليها.

تعريف القيمة المطلقة

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

ملاحظة: عندما تأخذ القيمة المطلقة لرقم ما، فإنك تفقد معلومات حول إشارته أو بشكل عام، اتجاهه.

لنأخذ قياس درجة الحرارة مثالاً. إذا كانت قراءة مقياس الحرارة -١٢ درجة مئوية، فيمكن القول إنها تحت الصفر باثنتي عشرة درجة مئوية. لاحظ كيف حللتَ درجة الحرارة في الجملة الأخيرة إلى مقدار، واثني عشر، وإشارة. تعني عبارة “تحت الصفر” نفس معنى “تحت الصفر” (درجة مئوية تحت الصفر). حجم درجة الحرارة أو قيمتها المطلقة مطابق للقيمة المطلقة لـ +١٢ درجة مئوية، وهي درجة أكثر دفئًا.

باستخدام الصيغة الرياضية، يُمكن تعريف القيمة المطلقة لـ 𝑥 كدالة متعددة التعريف، والتي يختلف سلوكها تبعًا لنطاق قيم المدخلات. يتكون الرمز الشائع للقيمة المطلقة من خطين رأسيين:

القيمة المطلقة المحددة كدالة متقطعة

تُرجع هذه الدالة قيمًا أكبر من أو تساوي الصفر دون تغيير. أما القيم الأصغر من الصفر، فتُقلب إشارتها من سالب إلى موجب. جبريًا، يُعادل هذا حساب الجذر التربيعي لعدد مُربع:

القيمة المطلقة المعرفة جبريًا

عند تربيع عدد حقيقي، ستحصل دائمًا على نتيجة موجبة، حتى لو كان العدد الذي بدأت به سالبًا. على سبيل المثال، مربع -١٢ ومربع ١٢ لهما القيمة نفسها، أي ١٤٤. لاحقًا، عند حساب الجذر التربيعي لـ ١٤٤، ستحصل فقط على ١٢ بدون علامة الطرح.

من الناحية الهندسية، يمكنك التفكير في القيمة المطلقة باعتبارها المسافة من الأصل، والتي تكون صفرًا على خط الأعداد في حالة قراءة درجة الحرارة من قبل:

القيمة المطلقة على خط الأعداد

لحساب هذه المسافة، يُمكن طرح نقطة الأصل من قراءة درجة الحرارة (-١٢ درجة مئوية – ٠ درجة مئوية = -١٢ درجة مئوية) أو العكس (٠ درجة مئوية – (-١٢ درجة مئوية) = +١٢ درجة مئوية)، ثم حذف إشارة النتيجة. لا يُحدث طرح الصفر فرقًا كبيرًا هنا، ولكن قد تُزاح نقطة المرجع أحيانًا. هذا هو الحال بالنسبة للمتجهات المرتبطة بنقطة ثابتة في الفضاء، والتي تُصبح نقطة أصلها.

المتجهات، كالأرقام، تنقل معلومات عن اتجاه ومقدار كمية فيزيائية، ولكن بأكثر من بُعد. على سبيل المثال، يمكنك التعبير عن سرعة ندفة ثلجية متساقطة كمتجه ثلاثي الأبعاد:

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

طول المتجه، المعروف أيضًا بمقداره، هو المسافة بين نقطتيه الابتدائية والنهائية، 𝐴 و𝐵، والتي يمكنك حسابها باستخدام القاعدة الإقليدية:

طول المتجه المقيد كمعيار إقليدي

تحسب هذه الصيغة طول المتجه 𝐴𝐵 ذي الأبعاد 𝑛، بجمع مربعي الفرق بين إحداثيات النقطتين 𝐴 و𝐵 في كل بُعد ذي مؤشر 𝑖. في المتجه الحر، تصبح نقطة البداية 𝐴 هي نقطة الأصل لنظام الإحداثيات – أو الصفر – مما يُبسط الصيغة، حيث يكفي تربيع إحداثيات المتجه.

تذكر التعريف الجبري للقيمة المطلقة. بالنسبة للأعداد، كانت القيمة المطلقة هي الجذر التربيعي لعدد مُربع. الآن، بإضافة أبعاد أخرى إلى المعادلة، نحصل على صيغة القاعدة الإقليدية، الموضحة أعلاه. لذا، القيمة المطلقة لمتجه تعادل طوله!

حسنًا. الآن بعد أن عرفتَ متى تكون القيم المطلقة مفيدة، حان وقت تطبيقها في بايثون!

تنفيذ دالة القيمة المطلقة في بايثون

لتنفيذ دالة القيمة المطلقة في بايثون، يمكنك استخدام أحد التعريفات الرياضية السابقة وترجمته إلى شيفرة برمجية. على سبيل المثال، قد تبدو الدالة المتقطعة كما يلي:

def absolute_value(x):
    if x >= 0:
        return x
    else:
        return -x

تستخدم عبارة شرطية للتحقق مما إذا كان الرقم المعطى، المشار إليه بالحرف x، أكبر من أو يساوي صفرًا. إذا كان كذلك، فستُرجع الرقم نفسه. وإلا، فستُقلب إشارة الرقم. نظرًا لوجود نتيجتين محتملتين فقط هنا، يمكنك إعادة كتابة الدالة أعلاه باستخدام تعبير شرطي يناسب سطرًا واحدًا بسهولة:

def absolute_value(x):
    return x if x >= 0 else -x

إنه نفس السلوك السابق تمامًا، مع تطبيقه بطريقة أكثر إيجازًا. تُعدّ التعبيرات الشرطية مفيدة عندما لا يكون هناك الكثير من المنطق في الفرعين البديلين في الكود.

التعريف الجبري للقيمة المطلقة سهل التنفيذ أيضًا في بايثون:

from math import sqrt

def absolute_value(x):
    return sqrt(pow(x, 2))

أولاً، استورد دالة الجذر التربيعي من وحدة math، ثم استدعِها على العدد المعطى مرفوعًا للقوة اثنين. دالة القوة مُدمجة مباشرةً في بايثون، لذا لا داعي لاستيرادها. كبديل، يمكنك تجنب جملة الاستيراد تمامًا باستخدام مُعامل الأسس (**) في بايثون، والذي يُحاكي دالة الجذر التربيعي:

def absolute_value(x):
    return (x**2) ** 0.5

هذه خدعة رياضية نوعًا ما، لأن استخدام أس كسري يعادل حساب الجذر النوني لعدد. في هذه الحالة، نرفع مربع عدد إلى القوة نصف (0.5) أو واحد على اثنين (½)، وهو ما يعادل حساب الجذر التربيعي. لاحظ أن كلا تطبيقي بايثون المبنيين على التعريف الجبري يعانيان من عيب طفيف:

>>> def absolute_value(x):
...     return (x**2) ** 0.5

>>> absolute_value(-12)
12.0

>>> type(12.0)
<class 'float'>

ستحصل دائمًا على عدد عشري، حتى لو بدأت بعدد صحيح. لذا، إذا كنت ترغب في الحفاظ على نوع البيانات الأصلي للعدد، فقد تُفضل التنفيذ القائم على القطع.

طالما بقيت ضمن الأعداد الصحيحة والأرقام العشرية، يمكنك أيضًا كتابة تنفيذ سخيف إلى حد ما لوظيفة القيمة المطلقة من خلال الاستفادة من التمثيل النصي للأرقام في Python:

def absolute_value(x):
    return float(str(x).lstrip("-"))

يمكنك تحويل وسيطة الدالة، x، إلى سلسلة نصية بايثون باستخدام الدالةstr() المدمجة. يتيح لك هذا إزالة علامة الطرح السابقة، إن وُجدت، بسلسلة نصية فارغة. ثم، يمكنك تحويل النتيجة إلى عدد عشري باستخدام ()float. تجدر الإشارة إلى أن هذه الدالة تحوّل الأعداد الصحيحة دائمًا إلى أعداد عشرية.

يُعدّ تطبيق دالة القيمة المطلقة من الصفر في بايثون تمرينًا تعليميًا مفيدًا. ومع ذلك، في التطبيقات العملية، يُنصح بالاستفادة من دالة ()abs المُدمجة في بايثون. ستكتشف السبب في القسم التالي.

استخدام الدالة المضمنة ()abs مع الأرقام

ربما كانت آخر دالة طبقتها أعلاه هي الأقل كفاءةً نظرًا لتحويلات البيانات وعمليات السلاسل النصية، والتي عادةً ما تكون أبطأ من معالجة الأرقام مباشرةً. ولكن في الحقيقة، جميع تطبيقاتك اليدوية للقيمة المطلقة لا تُقارن بدالة ()abs المدمجة في اللغة. ذلك لأن ()abs تُترجم إلى شيفرة آلية فائقة السرعة، بينما شيفرتك المكتوبة بلغة بايثون الصرفة ليست كذلك.

يُفضّل دائمًا استخدام ()abs على الدوال المُخصّصة. فهي تعمل بسرعة أكبر بكثير، وهي ميزة تُعزّز بشكل كبير عند معالجة كميات كبيرة من البيانات. كما أنها أكثر تنوعًا، كما ستكتشف لاحقًا.

الأعداد الصحيحة والأعداد العشرية

دالة ()abs هي إحدى الدوال المضمنة في لغة بايثون. هذا يعني أنه يمكنك البدء باستخدامها فورًا دون الحاجة إلى استيراد:

>>> abs(-12)
12

>>> abs(-12.0)
12.0

كما ترى، تحافظ الدالة ()abs على نوع البيانات الأصلي. في الحالة الأولى، مررتَ عددًا صحيحًا حرفيًا وحصلتَ على نتيجة عدد صحيح. عند استدعائها بعدد عشري، أعادت الدالة عددًا عشريًا في بايثون. لكن هذين النوعين من البيانات ليسا النوعين الوحيدين اللذين يمكنك استدعاء الدالة ()abs عليهما. النوع الرقمي الثالث الذي تتعامل معه الدالة ()abs هو نوع البيانات المركب في بايثون، والذي يمثل الأعداد المركبة.

الأعداد المركبة

يمكنك اعتبار العدد المركب زوجًا من قيمتين عشريتين، تُعرفان عادةً بالجزء الحقيقي والجزء التخيلي. إحدى طرق تعريف العدد المركب في بايثون هي استدعاء الدالة المُدمجة ()complex:

>>> z = complex(3, 2)

يقبل هذا البرنامج وسيطتين. الأولى تمثل الجزء الحقيقي، والثانية تمثل الجزء التخيلي. يمكنك في أي وقت الوصول إلى سمتي real. و imag. للعدد المركب لاستعادة هذين الجزأين:

>>> z.real
3.0

>>> z.imag
2.0

كلاهما للقراءة فقط، ويُعبَّر عنهما دائمًا بقيم عشرية. كذلك، القيمة المطلقة لعدد مركب تُرجعه الدالة ()abs هي عدد عشري:

>>> abs(z)
3.605551275463989

قد يفاجئك هذا إلى أن تكتشف أن الأعداد المركبة لها تمثيل مرئي يشبه المتجهات ثنائية الأبعاد الثابتة عند أصل نظام الإحداثيات:

أنت تعرف بالفعل صيغة حساب طول هذا المتجه، والتي تتطابق في هذه الحالة مع الرقم المُرجع بواسطة ()abs. تجدر الإشارة إلى أن القيمة المطلقة للعدد المركب تُعرف عادةً بمقداره أو معامله أو نصف قطره.

في حين أن الأعداد الصحيحة، والأعداد العشرية، والأعداد المركبة هي الأنواع الرقمية الوحيدة التي يدعمها بايثون أصلاً، ستجد نوعين رقميين إضافيين في مكتبته القياسية. ويمكنهما أيضًا التفاعل مع الدالة ()abs.

الكسور والأعداد العشرية

تقبل دالة ()abs في بايثون جميع أنواع البيانات الرقمية المتاحة، بما في ذلك الكسور والأعداد العشرية الأقل شيوعًا. على سبيل المثال، يمكنك الحصول على القيمة المطلقة لثلث أو ناقص ثلاثة أرباع، كما هو موضح في أمثلة الكسور:

>>> from fractions import Fraction

>>> abs(Fraction("1/3"))
Fraction(1, 3)

>>> abs(Fraction("-3/4"))
Fraction(3, 4)

في كلتا الحالتين، ستحصل على كائن كسر آخر، ولكنه بدون إشارة. قد يكون هذا مناسبًا إذا كنت تخطط لمواصلة حساباتك على الكسور، التي توفر دقة أعلى من الأعداد العشرية.

إذا كنت تعمل في مجال التمويل، فربما ترغب في استخدام كائنات عشرية لتخفيف خطأ تمثيل الفاصلة العائمة. لحسن الحظ، يمكنك أخذ القيمة المطلقة لهذه الكائنات:

>>> from decimal import Decimal

>>> abs(Decimal("0.3333333333333333"))
Decimal('0.3333333333333333')

>>> abs(Decimal("-0.75"))
Decimal('0.75')

مرة أخرى، تقوم الدالة ()بإرجاع نفس نوع البيانات الذي قدمته بشكل ملائم، ولكنها تعطيك قيمة موجبة مناسبة.

يا إلهي، تستطيع دالة ()abs التعامل مع مجموعة متنوعة من أنواع البيانات الرقمية! بل تبيّن أن ()abs أذكى من ذلك. يمكنك حتى استدعاؤها على بعض الكائنات المُقدّمة من مكتبات خارجية، كما ستُجرّب في القسم التالي.

استدعاء ()abs على كائنات بايثون الأخرى

لنفترض أنك تريد حساب القيم المطلقة لمتوسط ​​قراءات درجة الحرارة اليومية خلال فترة زمنية معينة. للأسف، بمجرد محاولة استدعاء الدالة ()abs على قائمة بايثون تحتوي على هذه الأرقام، يظهر لك خطأ:

>>> temperature_readings = [1, -5, 1, -4, -1, -8, 0, -7, 3, -5, 2]
>>> abs(temperature_readings)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'list'

ذلك لأن دالة ()abs لا تتعرف على كيفية معالجة قائمة من الأرقام. للتغلب على ذلك، يمكنك استخدام فهم القائمة أو استدعاء دالة ()map في بايثون، كما يلي:

>>> [abs(x) for x in temperature_readings]
[1, 5, 1, 4, 1, 8, 0, 7, 3, 5, 2]

>>> list(map(abs, temperature_readings))
[1, 5, 1, 4, 1, 8, 0, 7, 3, 5, 2]

كلا التطبيقين يؤديان المهمة، لكنهما يتطلبان خطوة إضافية، وهو أمر قد لا يكون مرغوبًا فيه دائمًا. إذا كنت ترغب في تقصير هذه الخطوة الإضافية، يمكنك البحث عن مكتبات خارجية تُغيّر سلوك ()abs لتسهيل الأمر عليك. هذا ما ستستكشفه أدناه.

مصفوفات NumPy وسلسلة pandas

تُعد NumPy إحدى أشهر المكتبات لتوسيع بايثون باستخدام مصفوفات ومصفوفات عالية الأداء. وتُعد بنية بيانات المصفوفة ذات الأبعاد n، ndarray، حجر الأساس في الحوسبة العددية في بايثون، ولذلك تستخدمها العديد من المكتبات الأخرى كأساس.

بمجرد تحويل قائمة Python العادية إلى مصفوفة NumPy باستخدام ()np.array، ستتمكن من استدعاء بعض الدوال المضمنة، بما في ذلك ()abs، على النتيجة:

>>> import numpy as np
>>> temperature_readings = np.array([1, -5, 1, -4, -1, -8, 0, -7, 3, -5, 2])
>>> abs(temperature_readings)
array([1, 5, 1, 4, 1, 8, 0, 7, 3, 5, 2])

عند استدعاء دالة ()abs على مصفوفة NumPy، ستحصل على مصفوفة أخرى تحتوي على القيم المطلقة للعناصر الأصلية. يشبه الأمر تكرار قائمة قراءات درجة الحرارة بنفسك وتطبيق دالة ()abs على كل عنصر على حدة، تمامًا كما فعلت مع فهم القائمة سابقًا.

يمكنك تحويل مجموعة NumPy إلى قائمة Python مرة أخرى إذا وجدت أن ذلك أكثر ملاءمة:

>>> list(abs(temperature_readings))
[1, 5, 1, 4, 1, 8, 0, 7, 3, 5, 2]

مع ذلك، تجدر الإشارة إلى أن مصفوفات NumPy تشترك في معظم واجهة قوائم بايثون. على سبيل المثال، تدعم الفهرسة والتقطيع، وتتشابه أساليبها مع أساليب القوائم العادية، لذا يكتفي معظم الناس عادةً باستخدام مصفوفات NumPy دون الرجوع إلى القوائم.

pandas هي مكتبة خارجية أخرى تُستخدم على نطاق واسع في تحليل البيانات بفضل كائني السلسلة وإطار البيانات. السلسلة عبارة عن سلسلة من الملاحظات أو عمود، بينما إطار البيانات هو جدول أو مجموعة أعمدة. يمكنك استدعاء ()abs على كليهما.

افترض أن لديك قاموس بايثون يربط اسم المدينة بأدنى درجات الحرارة المتوسطة التي يتم رصدها شهريًا على مدار العام:

>>> lowest_temperatures = {
...     "Reykjav\xedk": [-3, -2, -2, 1, 4, 7, 9, 8, 6, 2, -1, -2],
...     "Rovaniemi": [-16, -14, -10, -3, 3, 8, 12, 9, 5, -1, -6, -11],
...     "Valetta": [9, 9, 10, 12, 15, 19, 21, 22, 20, 17, 14, 11],
... }

لكل مدينة اثنتي عشرة قراءة لدرجة الحرارة، تمتد من يناير إلى ديسمبر. الآن، يمكنك تحويل هذا القاموس إلى كائن إطار بيانات pandas لتتمكن من استخلاص بعض الأفكار المهمة مستقبلًا:

>>> import calendar
>>> import pandas as pd

>>> df = pd.DataFrame(lowest_temperatures, index=calendar.month_abbr[1:])
>>> df
     Reykjavík  Rovaniemi  Valetta
Jan         -3        -16        9
Feb         -2        -14        9
Mar         -2        -10       10
Apr          1         -3       12
May          4          3       15
Jun          7          8       19
Jul          9         12       21
Aug          8          9       22
Sep          6          5       20
Oct          2         -1       17
Nov         -1         -6       14
Dec         -2        -11       11

بدلاً من استخدام الفهرس الافتراضي الذي يبدأ من الصفر، يُفهرس إطار البيانات لديك بأسماء الأشهر المختصرة، والتي حصلت عليها بمساعدة وحدة calendar. يحتوي كل عمود في إطار البيانات على تسلسل درجات الحرارة من القاموس الأصلي، مُمَثَّلاً بكائن سلسلة.

>>> df["Rovaniemi"]
Jan   -16
Feb   -14
Mar   -10
Apr    -3
May     3
Jun     8
Jul    12
Aug     9
Sep     5
Oct    -1
Nov    -6
Dec   -11
Name: Rovaniemi, dtype: int64

>>> type(df["Rovaniemi"])
<class 'pandas.core.series.Series'>

من خلال استخدام صيغة القوس المربع ([]) واسم مدينة مثل Rovaniemi، يمكنك استخراج كائن سلسلة واحد من إطار البيانات وتضييق كمية المعلومات المعروضة.

يتيح لك pandas، تمامًا مثل NumPy، استدعاء العديد من دوال بايثون المضمنة على كائناته، بما في ذلك كائنات DataFrame وSeries. على وجه التحديد، يمكنك استدعاء ()abs لحساب أكثر من قيمة مطلقة دفعة واحدة:

>>> abs(df)
     Reykjavík  Rovaniemi  Valetta
Jan          3         16        9
Feb          2         14        9
Mar          2         10       10
Apr          1          3       12
May          4          3       15
Jun          7          8       19
Jul          9         12       21
Aug          8          9       22
Sep          6          5       20
Oct          2          1       17
Nov          1          6       14
Dec          2         11       11

>>> abs(df["Rovaniemi"])
Jan    16
Feb    14
Mar    10
Apr     3
May     3
Jun     8
Jul    12
Aug     9
Sep     5
Oct     1
Nov     6
Dec    11
Name: Rovaniemi, dtype: int64

يؤدي استدعاء ()abs على إطار البيانات بأكمله إلى تطبيق الدالة على كل عنصر في كل عمود. يمكنك أيضًا استدعاء ()abs على كل عمود على حدة.

كيف غيّرت NumPy وPandas سلوك دالة ()abs المدمجة في بايثون دون تعديل شيفرتها الأساسية؟ حسنًا، كان ذلك ممكنًا لأن الدالة صُممت مع مراعاة هذه الإضافات. إذا كنت تبحث عن استخدام متقدم لدالة ()abs، فتابع القراءة لإنشاء نوع بياناتك الخاص الذي يتوافق معها بشكل جيد.

أنواع البيانات الخاصة بك

اعتمادًا على نوع البيانات، سيتعامل Python مع حساب القيم المطلقة بشكل مختلف.

عند استدعاء دالة ()abs على عدد صحيح، ستستخدم شفرة برمجية مخصصة تشبه دالة القطع. مع ذلك، سيتم تنفيذ هذه الدالة بلغة البرمجة C لتحقيق الكفاءة. إذا مررتَ عددًا عشريًا، فسيُفوض بايثون هذه الاستدعاء إلى دالة ()fabs في لغة C. أما في حالة العدد المركب، فسيتم استدعاء دالة ()hypot بدلاً منها.

ماذا عن كائنات الحاوية مثل DataFrames، وSeries، والمصفوفات؟

من المفهوم أنه عند تعريف نوع بيانات جديد في بايثون، لن يعمل مع دالة ()abs لأن سلوكها الافتراضي غير معروف. مع ذلك، يمكنك اختياريًا تخصيص سلوك دالة ()abs على مثيلات فئتك من خلال تنفيذ دالة .__abs__() الخاصة باستخدام بايثون الخالص. هناك مجموعة محدودة من الدوال الخاصة المحددة مسبقًا في بايثون، والتي تتيح لك تجاوز كيفية عمل دوال ومعاملات معينة.

فكر في الفئة التالية التي تمثل متجهًا حرًا ذي أبعاد 𝑛 في الفضاء الإقليدي:

>>> import math

>>> class Vector:
...     def __init__(self, *coordinates):
...         self.coordinates = coordinates
...
...     def __abs__(self):
...         origin = [0] * len(self.coordinates)
...         return math.dist(origin, self.coordinates)

تقبل هذه الفئة قيمة إحداثية واحدة أو أكثر، تصف الإزاحة في كل بُعد من نقطة أصل نظام الإحداثيات. تحسب دالة .__abs__() الخاصة بك المسافة من نقطة الأصل، وفقًا لتعريف القاعدة الإقليدية الذي تعلمته في بداية هذا الدرس.

لاختبار فئتك الجديدة، يمكنك إنشاء متجه سرعة ثلاثي الأبعاد لتساقط ندفة الثلج، على سبيل المثال، والذي قد يبدو مثل هذا:

>>> snowflake_velocity = Vector(0.42, 1.5, 0.87)
>>> abs(snowflake_velocity)
1.7841804841439108

لاحظ كيف يُرجع استدعاء ()abs على مثيل فئة Vector القيمة المطلقة الصحيحة، والتي تساوي حوالي 1.78. سيتم التعبير عن وحدات السرعة بالأمتار في الثانية طالما تم قياس إزاحة ندفة الثلج بالأمتار في لحظتين زمنيتين مختلفتين، بفارق ثانية واحدة. بمعنى آخر، تستغرق ندفة الثلج ثانية واحدة للانتقال من النقطة أ إلى النقطة ب.

استخدام الصيغة المذكورة يُلزمك بتحديد نقطة الأصل. مع ذلك، ولأن فئة المتجه لديك تُمثل متجهًا حرًا وليس متجهًا مُقيدًا، يُمكنك تبسيط الكود بحساب الوتر متعدد الأبعاد باستخدام دالة ()math.hypot في بايثون:

>>> import math

>>> class Vector:
...     def __init__(self, *coordinates):
...         self.coordinates = coordinates
...
...     def __abs__(self):
...         return math.hypot(*self.coordinates)

>>> snowflake_velocity = Vector(0.42, 1.5, 0.87)
>>> abs(snowflake_velocity)
1.7841804841439108

ستحصل على نفس النتيجة مع عدد أقل من أسطر التعليمات البرمجية. لاحظ أن ()hypot دالة متغيرة تقبل عددًا متغيرًا من الوسائط، لذا يجب عليك استخدام عامل النجمة (*) لفك ضغط مجموعة الإحداثيات إلى تلك الوسائط.

رائع! يمكنك الآن إنشاء مكتبتك الخاصة، وستتمكن دالة ()abs المدمجة في بايثون من التعامل معها. هذا يمنحك دوال مشابهة لما تحصل عليه عند العمل مع NumPy أو pandas!

تنفيذ صيغ القيمة المطلقة في بايثون سهل للغاية. ومع ذلك، يأتي بايثون مزودًا بالفعل بدالة ()abs متعددة الاستخدامات، والتي تتيح لك حساب القيمة المطلقة لأنواع مختلفة من الأرقام، بما في ذلك الأعداد الصحيحة، والأعداد العشرية، والأعداد المركبة، وغيرها. يمكنك أيضًا استخدام ()abs على نسخ من الفئات المخصصة وكائنات مكتبات الجهات الخارجية.

بفضل هذه المعرفة، أصبحت الآن مجهزًا بأداة فعالة لحساب القيم المطلقة في Python.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading