У вас уже есть ответы, которые объясняют более приятные или более современные способы выразить это, но я хотел бы продемонстрировать, что именно делают лямбда и карта с точки зрения более основных функций.Прежде всего, вот ваш пример:
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))
Преимущество лямбды заключается в том, что вы можете выразить в одном выражении то, что в противном случае потребовало бы введения временных переменных и, возможнообъявив функцию каким-то образом до точки, которую вы хотите использовать.Преимущество map заключается в том, что вы можете написать в одном выражении что-то, что в противном случае потребовало бы временных переменных и цикла.
(*) В Python 3 map фактически возвращает итератор, а не список.