الفرق بين المراجعتين ل"Python/deque"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'تعدّ Deques تعميمًا للأكداس والطوابير stacks and queues (يقرأ الاسم هكذا "deck" وهو اختصار للعبارة "double-ended...')
 
سطر 1: سطر 1:
تعدّ Deques تعميمًا للأكداس والطوابير stacks and queues (يقرأ الاسم هكذا "deck" وهو اختصار للعبارة "double-ended queue").  
+
تعدّ <code>deques</code> صورة عامة للأكداس والطوابير stacks and queues (يقرأ الاسم هكذا "deck" وهو اختصار للعبارة "double-ended queue").  
  
تدعم deques عمليات الإضافة والحذف من طرفي كائن deque مع ضمان سلامة الخيوط thread-safe ودون استهلاك كبير للذاكرة وبأداء مقارب لأداء O(1)‎ في كلا الاتجاهين.
+
تدعم <code>deques</code> عمليات الإضافة والحذف من طرفي الطابور مع ضمان سلامة الخيوط thread-safe ودون استهلاك كبير للذاكرة وبأداء مقارب لأداء <code>O(1)</code>‎ في كلا الاتجاهين.
  
صحيح أن القوائم تدعم مثل هذه العمليات، إلا أنّها مصمّمة للعمليات السريعة ذات الطول الثابت وتكلّف الذاكرة بمقدار O(n)‎ للعمليتين pop(0)‎ و insert(0, v)‎ واللتان تغيران حجم وموقع البيانات الضمنية الممثلة.
+
صحيح أن [[Python/list|القوائم]] تدعم مثل هذه العمليات، إلا أنّها مصمّمة للعمليات السريعة ذات الطول الثابت وتكلّف الذاكرة بمقدار <code>O(n)</code>‎ للعمليتين <code>[[Python/list/pop|pop(0)]]</code>‎ و [[Python/list/insert|insert(0, v)]]‎ واللتان تغيران حجم وموقع البيانات الضمنية الممثلة.
  
 
== البنية العامة ==
 
== البنية العامة ==
سطر 11: سطر 11:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
تعيد الدالة البانية كائن deque جديدًا مهيّئًا من اليسار إلى اليمن (باستخدام التابع append()‎) مع البيانات القادمة من الكائن المكرِّر iterable المعطى. وف يحال عدم تحديد الكائن المكرِّر يكون كائن deque الجديد فارغًا.
+
تعيد الدالة البانية كائن <code>deque</code> جديدًا مهيّئًا من اليسار إلى اليمن (باستخدام التابع [[Python/list/append|append()]]‎) مع البيانات القادمة من الكائن المكرِّر iterable المعطى. وف يحال عدم تحديد الكائن المكرِّر يكون كائن <code>deque</code> الجديد فارغًا.
  
في حال عدم تحديد قيمة maxlen أو أخذ هذا المعامل القيمة None، فيمكن لكائن deque أن يصل إلى طول غير محدّد. وفيما عدا ذلك، فإنّ كائن deque يكون محدّدًا بالطول المعطى.
+
في حال عدم تحديد قيمة <code>maxlen</code> أو أخذ هذا المعامل القيمة <code>None</code>، فيمكن لكائن <code>deque</code> أن يصل إلى طول غير محدّد. وفيما عدا ذلك، يكون كائن <code>deque</code> محدّدًا بالطول المعطى.
  
تؤدي إضافة عناصر جديدة إلى كائن deque الممتلئ إلى حذف نفس عدد العناصر المضافة من الطرف المقابل. تؤدي كائنات deque ذات الطول المحدد نفس وظيفة المرشح tail في نظام Unix.  
+
تؤدي إضافة عناصر جديدة إلى كائن <code>deque</code> الممتلئ إلى حذف نفس عدد العناصر المضافة من الطرف المقابل. تؤدي كائنات <code>deque</code> ذات الطول المحدد نفس وظيفة المرشح <code>tail</code> في أنظمة يونكس.  
  
كائنات deque مفيدة أيضًا في تعقب الإجراءات ومجموعات (pools) البيانات الأخرى حيث يكون المطلوب التعامل مع الأنشطة الحديثة فقط.
+
كائنات <code>deque</code> مفيدة أيضًا في تعقب الإجراءات ومجموعات (pools) البيانات الأخرى حيث يكون المطلوب التعامل مع الأنشطة الحديثة فقط.
  
 
== توابع كائنات <code>deque</code> ==
 
== توابع كائنات <code>deque</code> ==
  
تدعم كائنات deque التوابع التالية:
+
تدعم كائنات <code>deque</code> التوابع التالية:
  
=== التابع <code>append(x)‎</code> ===
+
=== التابع <code>append()‎</code> ===
  
إضافة العنصر x إلى الجانب الأيمن من كائن deque.
+
يضيف التابع العنصر المعطى إلى الجانب الأيمن من كائن <code>deque</code>.
  
=== التابع <code>appendleft(x)‎</code> ===
+
=== التابع <code>appendleft()‎</code> ===
إضافة العنصر x إلى الجانب الأيسر من كائن deque.
+
يضيف التابع العنصر المعطى إلى الجانب الأيسر من كائن <code>deque</code>.
  
 
=== التابع <code>clear()‎</code> ===
 
=== التابع <code>clear()‎</code> ===
  
حذف جميع العناصر من كائن deque ويصبح طول الكائن 0.
+
يحذف جميع العناصر من كائن <code>deque</code>.
  
 
=== التابع <code>copy()‎</code> ===
 
=== التابع <code>copy()‎</code> ===
  
إنشاء نسخة سطحية من كائن deque.
+
ينشئ التابع نسخة سطحية من كائن <code>deque</code>.
  
ملاحظة: هذا التابع جديد في الإصدار 3.5.
+
=== التابع <code>count()‎</code> ===
  
=== التابع <code>count(x)‎</code> ===
+
يحسب التابع عدد عناصر <code>deque</code> المساوية للقيمة المعطاة.
  
يحسب التابع عدد عناصر deque المساوية للمعامل x.
+
=== التابع <code>extend()‎</code> ===
 +
يمدّد الجانب الأيمن من كائن <code>deque</code> بإضافة العناصر المعطاة.
  
ملاحظة: هذا التابع جديد في الإصدار 3.2.
+
=== التابع <code>extendleft()‎</code> ===
 +
يمدّد الجانب الأيسر من كائن <code>deque</code> بإضافة العناصر المعطاة.
  
=== التابع <code>extend(iterable)(x)‎</code> ===
+
=== التابع <code>index()‎</code> ===
يمدّد الجانب الأيمن من كائن deque بإضافة العناصر من المعامل iterable.
+
يعيد التابع موقع العنصر المعطى في كائن <code>deque</code>.  
  
extendleft(iterable)‎
+
=== التابع <code>insert()‎</code> ===
 +
يدرج التابع القيمة المعطاة في الكائن <code>deque</code> في الموقع المحدّد.
  
يمدّد الجانب الأيسر من كائن deque بإضافة العناصر من المعامل iterable. لاحظ أنّ إضافة العناصر من الجانب الأيسر يؤدي إلى عكس ترتيب العناصر في معامل iterable.
+
=== التابع <code>pop()‎</code> ===
 +
يحذف التابع ويعيد عنصرًا واحدًا من الجانب الأيمن في الكائن <code>deque</code>.
  
index(x[, start[, stop]])‎
+
=== التابع <code>popleft()‎</code> ===
 +
يحذف التابع ويعيد عنصرًا واحدًا من الجانب الأيسر في الكائن <code>deque</code>.
  
يعيد موقع x في كائن deque (عند أو بعد الموقع start و قبل الموقع stop). يعيد التابع أول حالة تطابق، ويطلق الخطأ ValueError في حال عدم العثور على حالة التطابق.  
+
=== التابع <code>remove()‎</code> ===
 +
يحذف التابع أوّل عنصر يحمل القيمة المعطاة.  
  
'''ملاحظة:''' هذا التابع جديد في الإصدار 3.5.
+
=== التابع <code>reverse()‎</code> ===
 +
يعكس التابع ترتيب عناصر الكائن <code>deque</code> في نفس المكان.
  
insert(i, x)‎
+
=== التابع <code>rotate()‎</code> ===
 +
يدوّر التابع كائن <code>deque</code> إلى جهة اليمين بعدد الخطوات المعطاة.
  
يدرج التابع القيمة x في الكائن deque عند الموقع i.
+
== خصائص كائنات <code>deque</code> ==
 +
تقدّم كائنات <code>deque</code> خاصية واحدة للقراءة فقط:
  
إن أدّت عملية الإضافة إلى تجاوز الحد الأقصى للكائن deque والمقرّر عن طريق maxlen، فإنّ التابع يطلق الخطأ IndexError.
+
=== الخاصية <code>maxlen</code> ===
 +
تحمل هذه الخاصية قيمة الحجم الأقصى لكائن <code>deque</code> إن كان الكائن ذا طول محدّد، أو القيمة <code>None</code> إن كان الكائن غير محدّد الطول.
  
ملاحظة: هذا التابع جديد في الإصدار 3.5.
+
'''ملاحظة:''' هذه الخاصية جديدة في الإصدار 3.1.
  
pop()‎
+
تدعم <code>deques</code> إضافة إلى ما سبق عمليات التكرار iteration، وpickling، ويمكن معرفة طول كائن <code>deque</code> (عدد العناصر فيه) باستخدام الدالة <code>[[Python/len|len(d)‎]]</code>، وقلب ترتيب العناصر بواسطة <code>[[Python/reversed|reversed(d)‎]]</code>، وإجراء عمليات النسخ السطحية والعميقة بواسطة <code>copy.copy(d)‎</code> و <code>copy.deepcopy(d)</code>‎، والتأكد من وجود عنصر ما بواسطة العامل <code>in</code>، والإشارات الخلفية subscript references مثل <code>d[-1]</code>.
  
يحذف التابع عنصرًا واحدًا من الجانب الأيمن في الكائن deque ويعيده. في حال عدم وجود أي عنصر، يطلق التابع الخطأ IndexError.
+
تكون عملية الوصول المفهرس إلى العناصر بسرعة <code>O(1)</code>‎ ولكنّها تصبح أبطأ لتصل إلى سرعة <code>O(n)</code>‎ في الوسط. يمكن استخدام القوائم بدلًا من كائنات <code>deque</code> للحصول على أداء أسرع في الوصول العشوائي.
  
popleft()‎
+
بدءًا من الإصدار 3.5 من بايثون، أصبحت كائنات <code>deque</code> تدعم التوابع <code>‎__add__()‎</code> و <code>‎__mul__()</code>‎ و <code>‎__imul__()‎</code>.
  
يحذف التابع عنصرًا واحدًا من الجانب الأيسر في الكائن deque ويعيده. في حال عدم وجود عناصر، يطلق التابع الخطأ IndexError.
+
== أمثلة ==
 
+
يبين المثال التالي طريقة إنشاء كائن <code>deque</code>:<syntaxhighlight lang="python3">
remove(value)
+
>>> from collections import deque
 
+
>>> d = deque('ghi')                 # إنشاء كائن جديد يمتلك ثلاثة عناصر
يحذف التابع أوّل عنصر يحمل القيمة المعطاة. في حال عدم العثور على العنصر المطلوب، يطلق التابع الخطأ ValueError.
+
>>> for elem in d:                   # deque المرور على عناصر
 
+
...     print(elem.upper())
reverse()‎
+
G
 
+
H
يعكس التابع ترتيب عناصر الكائن deque في نفس المكان ويعيد القيمة None.
+
I
 
+
</syntaxhighlight>
'''ملاحظة:''' هذا التابع جديد في الإصدار 3.2.
 
 
 
rotate(n=1)‎
 
 
 
يدوّر التابع كائن deque إلى جهة اليمين بعدد الخطوات المعطاة. إن كانت قيمة n سالبة، فإنّ التابع يدوّر الكائن إلى جهة اليسار.
 
 
 
عندما لا يكون كائن deque فارغًا، فإنّ عملية التدوير خطوة واحدة إلى اليمين تكون مكافئة للتعبير d.appendleft(d.pop())‎، وعملية التدوير خطوة واحدة إلى اليسار مكافئة للتعبير d.append(d.popleft())‎.
 
 
 
تقدّم كائنات deque أيضًا خاصية واحدة للقراءة فقط:
 
 
 
maxlen
 
 
 
الحجم الأقصى لكائن deque أو القيمة None إن كان الكائن غير محدّد الطول.
 
 
 
'''ملاحظة:''' هذه الخاصية جديدة في الإصدار 3.1.
 
 
 
تدعم deques إضافة إلى ما سبق عمليات التكرار iteration، وpickling، ويمكن معرفة طول كائن deque باستخدام الدالة len(d)‎، وقلب ترتيب العناصر بواسطة reversed(d)‎، وإجراء عمليات النسخ السطحية والعميقة بواسطة copy.copy(d)‎ و copy.deepcopy(d)‎، والتأكد من وجود عنصر ما بواسطة العامل in، والإشارات الخلفية subscript references مثل d[-1]‎.
 
  
تكون عملية الوصول المفهرس إلى العناصر بسرعة O(1)‎ ولكنّها تصبح أبطأ لتصل إلى سرعة O(n)‎ في الوسط. يمكن استخدام القوائم بدلًا من كائنات deques للحصول على أداء أسرع في الوصول العشوائي.
+
== انظر أيضًا ==
 +
* [[Python/list|القوائم في بايثون.]]
  
بدءًا من الإصدار 3.5 من بايثون، أصبحت كائنات deques تدعم التوابع ‎__add__()‎ و ‎__mul__()‎ و ‎__imul__()‎.
+
== مصادر ==
 +
* [https://docs.python.org/3/library/collections.html#deque-objects قسم deque Objects في صفحة Container Datatypes في توثيق بايثون الرسمي.]
 +
[[تصنيف:Python]]
 +
[[تصنيف:Python Modules]]
 +
[[تصنيف:Python Types]]

مراجعة 07:48، 1 أغسطس 2018

تعدّ deques صورة عامة للأكداس والطوابير stacks and queues (يقرأ الاسم هكذا "deck" وهو اختصار للعبارة "double-ended queue").

تدعم deques عمليات الإضافة والحذف من طرفي الطابور مع ضمان سلامة الخيوط thread-safe ودون استهلاك كبير للذاكرة وبأداء مقارب لأداء O(1)‎ في كلا الاتجاهين.

صحيح أن القوائم تدعم مثل هذه العمليات، إلا أنّها مصمّمة للعمليات السريعة ذات الطول الثابت وتكلّف الذاكرة بمقدار O(n)‎ للعمليتين pop(0)‎ و insert(0, v)‎ واللتان تغيران حجم وموقع البيانات الضمنية الممثلة.

البنية العامة

class collections.deque([iterable[, maxlen]])

تعيد الدالة البانية كائن deque جديدًا مهيّئًا من اليسار إلى اليمن (باستخدام التابع append()‎) مع البيانات القادمة من الكائن المكرِّر iterable المعطى. وف يحال عدم تحديد الكائن المكرِّر يكون كائن deque الجديد فارغًا.

في حال عدم تحديد قيمة maxlen أو أخذ هذا المعامل القيمة None، فيمكن لكائن deque أن يصل إلى طول غير محدّد. وفيما عدا ذلك، يكون كائن deque محدّدًا بالطول المعطى.

تؤدي إضافة عناصر جديدة إلى كائن deque الممتلئ إلى حذف نفس عدد العناصر المضافة من الطرف المقابل. تؤدي كائنات deque ذات الطول المحدد نفس وظيفة المرشح tail في أنظمة يونكس.

كائنات deque مفيدة أيضًا في تعقب الإجراءات ومجموعات (pools) البيانات الأخرى حيث يكون المطلوب التعامل مع الأنشطة الحديثة فقط.

توابع كائنات deque

تدعم كائنات deque التوابع التالية:

التابع append()‎

يضيف التابع العنصر المعطى إلى الجانب الأيمن من كائن deque.

التابع appendleft()‎

يضيف التابع العنصر المعطى إلى الجانب الأيسر من كائن deque.

التابع clear()‎

يحذف جميع العناصر من كائن deque.

التابع copy()‎

ينشئ التابع نسخة سطحية من كائن deque.

التابع count()‎

يحسب التابع عدد عناصر deque المساوية للقيمة المعطاة.

التابع extend()‎

يمدّد الجانب الأيمن من كائن deque بإضافة العناصر المعطاة.

التابع extendleft()‎

يمدّد الجانب الأيسر من كائن deque بإضافة العناصر المعطاة.

التابع index()‎

يعيد التابع موقع العنصر المعطى في كائن deque.

التابع insert()‎

يدرج التابع القيمة المعطاة في الكائن deque في الموقع المحدّد.

التابع pop()‎

يحذف التابع ويعيد عنصرًا واحدًا من الجانب الأيمن في الكائن deque.

التابع popleft()‎

يحذف التابع ويعيد عنصرًا واحدًا من الجانب الأيسر في الكائن deque.

التابع remove()‎

يحذف التابع أوّل عنصر يحمل القيمة المعطاة.

التابع reverse()‎

يعكس التابع ترتيب عناصر الكائن deque في نفس المكان.

التابع rotate()‎

يدوّر التابع كائن deque إلى جهة اليمين بعدد الخطوات المعطاة.

خصائص كائنات deque

تقدّم كائنات deque خاصية واحدة للقراءة فقط:

الخاصية maxlen

تحمل هذه الخاصية قيمة الحجم الأقصى لكائن deque إن كان الكائن ذا طول محدّد، أو القيمة None إن كان الكائن غير محدّد الطول.

ملاحظة: هذه الخاصية جديدة في الإصدار 3.1.

تدعم deques إضافة إلى ما سبق عمليات التكرار iteration، وpickling، ويمكن معرفة طول كائن deque (عدد العناصر فيه) باستخدام الدالة len(d)‎، وقلب ترتيب العناصر بواسطة reversed(d)‎، وإجراء عمليات النسخ السطحية والعميقة بواسطة copy.copy(d)‎ و copy.deepcopy(d)‎، والتأكد من وجود عنصر ما بواسطة العامل in، والإشارات الخلفية subscript references مثل d[-1]‎.

تكون عملية الوصول المفهرس إلى العناصر بسرعة O(1)‎ ولكنّها تصبح أبطأ لتصل إلى سرعة O(n)‎ في الوسط. يمكن استخدام القوائم بدلًا من كائنات deque للحصول على أداء أسرع في الوصول العشوائي.

بدءًا من الإصدار 3.5 من بايثون، أصبحت كائنات deque تدعم التوابع ‎__add__()‎ و ‎__mul__()‎ و ‎__imul__()‎.

أمثلة

يبين المثال التالي طريقة إنشاء كائن deque:

>>> from collections import deque
>>> d = deque('ghi')                 # إنشاء كائن جديد يمتلك ثلاثة عناصر
>>> for elem in d:                   # deque المرور على عناصر 
...     print(elem.upper())
G
H
I

انظر أيضًا

مصادر