У вас уже есть ответы, которые объясняют более хорошие или более современные способы выразить это, но я хотел бы точно продемонстрируйте, что делают лямбда и карта с точки зрения более основных функций. Прежде всего, вот ваш пример:
inverted_list = map(lambda i: (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
,range(0, (len(numbers) - 2)/3))
Чтобы сделать вещи немного яснее, я отделяю аргументы для сопоставления. Это эквивалентно; все, что я изменил, чтобы вычислить каждый из аргументов для отображения в отдельном заявлении:
func = lambda i:(int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)
lambda
это просто способ выразить простую функцию внутри выражения.Мы можем заменить его на регулярной функции без изменения эффекта:
def func(i):
return (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)
map
является то, что называется «функций высшего порядка», функция, которая принимает другую функцию в качестве аргумента. map
будет цикл по каждому элементу sequence
, вызовите func
с этим элементом в качестве аргумента, принять все функциональные возвращения и добавить его в новый список. *
Если вы хотите, чтобы сделать то же самое без функций высшего порядка или генератора выражения, вы могли бы написать на это длинный путь:
def func(i):
return (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = []
for item in sequence:
inverted_list.append(func(item))
преимущество лямбда является то, что вы можете выразить в одном выражении что-то, что в противном случае потребовало бы введения временных переменных, и, возможно, объявив функцию некоторый путь до точки вы хотите использовать его. Преимущество карты аналогично тому, что вы можете написать в одном выражении что-то, что в противном случае требовало бы временных переменных и цикла.
(*) Из Python 3 карта фактически возвращает итератор, а не список.
Потому что первые 2 числа не являются частью последовательности. Я думаю, что он эффективно запускает цикл, начиная с третьего элемента серии. Я был просто смущен тем, что карта/лямбда выполняет любую другую операцию здесь. –