سؤال

أساليب dict dict.keys () ، dict.items () و dict.values ​​() إرجاع "طرق العرض" بدلاً من القوائم. http://docs.python.org/dev/3.0/whatsnew//3.0.html

بادئ ذي بدء ، كيف يختلف العرض عن المكرر؟ثانيا ما فائدة هذا التغيير؟هل هو فقط لأسباب الأداء؟

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

هل كانت مفيدة؟

المحلول

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

هذه هي نفس الطريقة التي يتم تنفيذها بها في Java (وربما العديد من اللغات/البيئات الأخرى أيضًا).

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

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

نصائح أخرى

تشرح إجابة يواكيم سوير جيدًا لماذا أ list لم يتم إرجاعها.لكن هذا يترك السؤال لماذا لا تقوم هذه الوظائف بإرجاع التكرارات، تمامًا مثل iteritems إلخ.فعلت في بيثون 2.

المكرر أكثر تقييدًا من الحاوية.على سبيل المثال، لا يسمح المُكرِّر بأكثر من مرور واحد؛إذا حاولت تمريرة ثانية، ستجد أنها فارغة.ولذلك، فإن عمليات مثل elem in cont مدعومة بالحاويات، ولكن لا يمكن دعمها بواسطة التكرارات:بمجرد التحقق مما إذا كان العنصر "موجودًا" في المكرِّر، يتم تدمير المكرِّر!

من ناحية أخرى، الحصول على حاوية عادة يتطلب عمل نسخة مثل إنشاء قائمة من مفاتيح القاموس.

ال view الكائن لديه أفضل ما في العالمين:فهو يتصرف كحاوية، ومع ذلك لا يقوم بعمل نسخة من القاموس!إنها في الواقع عبارة عن حاوية افتراضية للقراءة فقط تعمل عن طريق الارتباط بالقاموس الأساسي.لا أعرف ما إذا كان قد تم رؤيته في أي مكان آخر في لغة بايثون القياسية.

يحرر:

@ أنتوني هاتشكينز:سبب عدم إرجاع وظيفة المولد هو أنها لن تسمح بالصيام in عملية.نعم، in يعمل على وظائف المولد (عند الاتصال بهم).أي أنه يمكنك القيام بذلك:

def f():
  for i in range(10):
    yield i

5 in f() # True

ولكن حسب تعريف in, ، إذا كان الجانب الأيمن عبارة عن مولد، فسوف تمر بايثون بكل شيء n عناصر المولد - مما يؤدي إلى O(n) تعقيد الوقت.لا يوجد شيء يمكنك فعله حيال ذلك لأن هذا هو السلوك الوحيد ذو المعنى للمولد التعسفي.

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

>>> d = dict(zip(range(50000000), range(50000000)))
>>> 49999999 in d
True
>>> 49999999 in iter(d) # kinda how generator function would work
True
>>>

وملاحظة مدى سرعة الأول in تتم مقارنتها بالثانية in.

كما ذكرنا سابقًا في السؤال ذي الصلة، تم عرض العرض len() الطريقة التي يفتقر إليها المكرر (لكن القائمة بها).

فائدة أخرى لإرجاع طريقة عرض بدلاً من القائمة هي أنه على الأقل بالنسبة للمفاتيح لديها اختبار عضوية محسّن في عمليات O(1) بدلاً من O(N) للقائمة (أو المكرر).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top