سؤال

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

ما هي سياسة رسمية بشأن تمديد الوظيفية منتديات وظيفة امدا الذهاب الى البقاء؟

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

المحلول

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

from functools import reduce

واستخدامها.

ومن المتوقع أن تظل إلى الوراء متوافقة مع 3.0 و 3.1 في هذا الصدد

والمستقبل الإصدارات 3.X.

نصائح أخرى

في بيثون 3.x و تواصل بيثون لدينا مجموعة غنية من الأدوات الفنية العش بنيت في: comprehensions القائمة، عبارات مولد، المكررات والمولدات الكهربائية، وظائف مثل any() وall() التي لديها تقييم ماس كهربائى حيثما كان ذلك ممكنا <. / P>

وبايثون "الخيرية الدكتاتور من أجل الحياة" طرحت فكرة إزالة map() لأنك يمكن أن تتكاثر بشكل مسلي آثاره بقائمة الفهم:

lst2 = map(foo, lst)

lst3 = [foo(x) for x in lst]

lst2 == lst3  # evaluates True

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

وdef سهل من العمر المعايير بايثون يعرف كائن وظيفة، والتي يمكن أن تنتقل حول بسهولة مثلما ككائن lambda. يمكنك حتى إلغاء توثيق اسم وظيفة بعد تحديد ذلك، إذا كنت تريد حقا أن تفعل ذلك.

مثال:

# NOT LEGAL PYTHON
lst2 = map(lambda x: if foo(x): x**2; else: x, lst)

# perfectly legal Python
def lambda_function(x):
    if foo(x):
        return x**2
    else:
        return x

lst2 = map(lambda_function, lst)

del(lambda_function) # can unbind the name if you wish

وتجدر الإشارة إلى أنك يمكن فعلا استخدام "المشغل الثلاثي" في lambda ذلك المثال أعلاه هو مفتعلة بعض الشيء.

lst2 = map(lambda x: x**2 if foo(x) else x, lst)

ولكن بعض الوظائف متعدد الأسطر من الصعب إجبار إلى lambda ويتم التعامل معها بشكل أفضل وظائف بسيطة متعدد العادية.

لقد فقدت بيثون 3.X أيا من السلطة الوظيفية. هناك بعض الشعور العام بأن القوائم المضمنة والعبارات مولد هي على الأرجح أفضل من map(). على وجه الخصوص، يمكن التعبير عن مولد أحيانا استخدامها للقيام يعادل map() ولكن من دون تخصيص القائمة ثم تخليصه مرة أخرى. على سبيل المثال:

total = sum(map(lst, foo))

total2 = sum(foo(x) for x in lst)

assert total == total2  # same result

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

في بيثون 3.x و map() هو "كسول" لذلك كلاهما عن كفاءة على حد سواء. ولكن نتيجة لذلك، في بيثون 3.X المثال امدا الثلاثي يحتاج إلى أن اضطر للتوسع في قائمة:

lst2 = list(map(lambda x: x**2 if foo(x) else x, lst))

وأسهل لمجرد كتابة الفهم القائمة!

lst2 = [x**2 if foo(x) else x for x in lst]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top