Интерполяция лямбда трудно понять - PullRequest
0 голосов
/ 24 мая 2018

poly1 и poly2 - оба списка, содержащие координаты (x, y).

Теперь эта функция предварительно реализована, что мне трудно понять:

def interpolate():
    # This function returns a list of tuples (x, y).
    return map(lambda a, b: (a[0] + b[0], a[1] + b[1]), poly_1,
               [(time * x[0], time * x[1]) for x in map(lambda p, q: (q[0] - p[0], q[1] - p[1]), poly_1, poly_2)])

Но можете ли вы на самом деле объяснить, что происходит в interpolate?

Все, что я могу извлечь из этого, - это (насколько лямбды)

def func_a(a, b):
    return (a[0] + b[0], a[1] + b[1])

и

def func_b(p, q):
    return (q[0] - p[0], q[1] - p[1]), poly_1, poly_2)

Но все эти карты сбивают меня с толку.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

примечание:

def interpolate(poly_1, poly_2):
    return map(lambda p, q: (p[0] + t*(q[0]-p[0]), p[1] + t*(q[1]-p[1])), poly_1, poly_2)

выполняет ту же работу.намного быстрее

0 голосов
/ 24 мая 2018

map просто применяет функцию к каждому элементу в одном или нескольких массивах

Давайте посмотрим:

return map(lambda a, b: (a[0] + b[0], a[1] + b[1]), poly_1,
           [(time * x[0], time * x[1]) for x in map(lambda p, q: (q[0] - p[0], q[1] - p[1]), poly_1, poly_2)])

Это map функция, которая принимает 3 аргумента:

  1. lambda a, b: (a[0] + b[0], a[1] + b[1]) можно перевести как

def foo(a,b) : return (a[0] + b[0], a[1] + b[1])

Вы примените его в следующих двух списках

Первый список poly_1

Второй список [(time * x[0], time * x[1]) for x in map(lambda p, q: (q[0] - p[0], q[1] - p[1]), poly_1, poly_2)]:

Сначала это список кортежей с двумя аргументамиtime * x[0], time * x[1]

«x» берется из списка, возвращаемого из map(lambda p, q: (q[0] - p[0], q[1] - p[1]), poly_1, poly_2)

Позволяет перевести это:

  1. map применяет функцию lambda к каждому элементуPoly_1 и Poly_2
  2. lambda p, q: (q[0] - p[0], q[1] - p[1]) равно

def foo2(p,q) : return (q[0] - p[0], q[1] - p[1])

...