[python] فهم وظيفة الخريطة


1 Answers

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

map في Python 3 تعادل هذا:

def map(func, iterable):
    for i in iterable:
        yield func(i)

والفرق الوحيد في بايثون 2 هو أنه سيبني قائمة كاملة بالنتائج لإرجاعها دفعة واحدة بدلاً من yield على yield .

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

[func(i) for i in iterable]

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

 >>> a = "hello, world"
 >>> list(a)
['h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']
>>> tuple(a)
('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd')

سيكون استخدام map هنا إذا بدأت بقائمة من السلاسل بدلاً من سلسلة واحدة - يمكن map أن تضع كل منها على حدة:

>>> a = ["foo", "bar", "baz"]
>>> list(map(list, a))
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

لاحظ أن map(list, a) متساوية في Python 2 ، ولكن في Python 3 ، تحتاج إلى استدعاء list إذا كنت تريد القيام بأي شيء آخر غير إطعامها في حلقة for (أو دالة معالجة مثل sum يحتاج فقط إلى iterable وليس تسلسلًا). ولكن لاحظ أيضًا مرة أخرى أن الفهم بالقائمة يُفضل عادةً:

>>> [list(b) for b in a]
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]
Question
map(function, iterable, ...)

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

إذا كان أحد المتكررين أقصر من الآخر ، فمن المفترض أن يتم تمديده باستخدام عناصر بدون.

إذا كانت الوظيفة هي None ، فستفترض وظيفة الهوية ؛ إذا كانت هناك وسيطات متعددة ، map() تُرجع map() قائمة تتكون من مجموعات تحتوي على العناصر المقابلة من جميع المتكررات (نوع من عملية التحويل).

قد تكون الوسائط المتكرّرة عبارة عن تسلسل أو أي كائن قابل للتكرار ؛ والنتيجة هي دائما قائمة.

ما الدور الذي تلعبه هذه اللعبة في صنع منتج ديكارت؟

content = map(tuple, array)

ما هو تأثير وضع مجموعة الصفوف في أي مكان؟ كما أنني لاحظت أنه بدون وظيفة الخريطة يكون الإخراج هو abc ومعه ، إنه a, b, c .

أريد أن أفهم تماما هذه الوظيفة. التعريفات المرجعية يصعب فهمها أيضًا. زغب كثير جدا.




تبسيط قليلا ، يمكنك تخيل map() القيام بشيء من هذا القبيل:

def mymap(func, lst):
    result = []
    for e in lst:
        result.append(func(e))
    return result

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

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

بالنسبة للجزء الثاني من السؤال: ما الدور الذي تلعبه هذه اللعبة في صنع منتج ديكارت؟ كذلك ، يمكن استخدام map() لتوليد المنتج الديكارتية لقائمة مثل هذه:

lst = [1, 2, 3, 4, 5]

from operator import add
reduce(add, map(lambda i: map(lambda j: (i, j), lst), lst))

... لكن قول الحقيقة ، إن استخدام product() هو طريقة أبسط وطبيعية لحل المشكلة:

from itertools import product
list(product(lst, lst))

في كلتا الحالتين ، والنتيجة هي المنتج الديكارتية ل lst النحو المحدد أعلاه:

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
 (2, 1), (2, 2), (2, 3), (2, 4), (2, 5),
 (3, 1), (3, 2), (3, 3), (3, 4), (3, 5),
 (4, 1), (4, 2), (4, 3), (4, 4), (4, 5),
 (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]



Related