Ссылки:
Синтаксический сахар
В документации по Power Query указано, что ключевое слово each является синтаксическим сахаром для сигнатуры функции, которая принимает параметр «()=>…».
Вспоминаем функции
В скобках нужно перечислить параметры, а после «=>» вводится тело функции.
Создадим функцию, которая принимает рост и массу тела в качестве параметров и возвращает индекс массы тела.
(height as number, weight as number)=>
Number.Round( weight / Number.Power(height, 2), 2 )
Функция — это тоже тип данных
В Power Query есть тип данных function. С помощью функции Value.Type() можно определить тип данных любого значения. Попробуем передать любую функцию в качестве параметра. Вернется тип данных function.
= Value.Type(List.MatchesAny)
Тестируем
С помощью пользовательского интерфейса подключимся к источнику, изменим тип данных, отберем нужные строки, создадим столбец и извлечем текст после разделителя.
Если мы это сделаем с помощью пользовательского интерфейса, то Power Query применит функции Table.SelectRows, Table.AddColumn, Table.TransformColumns. Эти функции принимают функцию в качестве одного из параметров. Power Query использует ключевое слово each. Код будет выглядеть примерно так:
let
cols_types =
Table.TransformColumnTypes(src,
{{"duration", type time},
{"video_date", type date}}),
rows_select =
Table.SelectRows(cols_types,
each [Course] = "Power Query"),
tab_add_col =
Table.AddColumn(rows_select,
"duration_minutes",
each Number.Round(Time.Minute([duration]) +
Time.Second([duration]) / 60, 2),
Number.Type),
col_transform =
Table.TransformColumns(tab_add_col,
{{"playlist_name",
each Text.AfterDelimiter(_, ". "),
type text}})
in
col_transform
Теперь попробуем везде вместо each использовать (_)=>. Теперь мы можем убедиться в том, что все также работает, ничего не сломалось.
let
cols_types =
Table.TransformColumnTypes(src,
{{"duration", type time},
{"video_date", type date}}),
rows_select =
Table.SelectRows(cols_types,
(_)=> _[Course] = "Power Query"),
tab_add_col =
Table.AddColumn(rows_select,
"duration_minutes",
(_)=>
Number.Round(Time.Minute(_[duration]) +
Time.Second(_[duration]) / 60, 2),
Number.Type),
col_transform =
Table.TransformColumns(tab_add_col,
{{"playlist_name",
(x)=>
Text.AfterDelimiter(x, ". "),
type text}})
in
col_transform
Практикуемся
Создадим несколько функций с each и без each.
Пример 1
Функция получает в качестве параметра список дат и возвращает список всех 29 февраля, входящих в этот список.
// С использованием each
(lst) =>
let
get_29feb = List.Select(lst, each Date.Day(_) = 29 and Date.Month(_) = 2)
in
get_29feb
// То же самое, но без each
(lst) =>
let
get_29feb = List.Select(lst, (d) => Date.Day(d) = 29 and Date.Month(d) = 2)
in
get_29feb
Пример 2
Передадим функцию в качестве параметра функции List.Transform. Функция просто разделит каждое число исходного списка на 2.
// Используем each
let
some_list = {5, 3, 4, 7, 9},
lst_transform = List.Transform(some_list, each _ / 2)
in
lst_transform
// Без each
let
some_list = {5, 3, 4, 7, 9},
lst_transform = List.Transform(some_list, (_)=> _ / 2)
in
lst_transform
Пример 3
Создадим функцию, которая принимает список дат и возвращает список понедельников из исходного списка.
// each
let
lst = List.Buffer([video_date]),
get_mondays =
(some_list as list)=> List.Select(some_list, (day)=> Date.DayOfWeekName(day, "en_US") = "Monday")
in
get_mondays(lst)
// Без each
let
lst = List.Buffer([video_date]),
get_mondays =
(some_list as list)=> List.Select(some_list, (_)=> Date.DayOfWeekName(_, "en_US") = "Monday")
in
get_mondays(lst)
Примененные функции
- Table.SelectRows
- Table.TransformColumnTypes
- Table.AddColumn
- Number.Round
- Time.Minute
- Time.Second
- Number.Type
- Table.TransformColumns
- Text.AfterDelimiter
- Value.Type
- Number.Round
- List.Select
- Date.Day
- Date.Month
- List.Transform
- Date.DayOfWeekName
- List.Dates
- #date
- #duration
Курс по Языку М
Номер урока | Урок | Описание |
---|---|---|
1 | Power Query Язык М №1. Простые выражения, let | Что такое let, одна или несколько переменных в in, вложенные блоки let. |
2 | Power Query Язык М №2. Создание функций М | Функции без выражения let, функции внутри выражения let. |
3 | Power Query Язык М №3. Создание функций М 2 | Функция как параметр функции, ключевое слово each. |
4 | Power Query Язык М №4. Переменные и идентификаторы | Идентификаторы с кавычками и без, допустимые и недопустимые идентификаторы. |
5 | Power Query Язык М №5. Текстовый тип данных | Особенности работы с текстовым типом данных. |
6 | Power Query Язык М №6. Числовой тип данных (Ввод, Сравнение, Точность, Бесконечность) | В этом уроке мы узнаем, что из себя представляет числовой тип данных. |
7 | Power Query Язык М №7. Дата, время, длительность и прочее(date, datetime, time, datetimezone) | Как создать значение с типом данных #date, #time, #datetime, #datetimezone, #duration. Преобразование значений одного типа данных в другой, арифметические операции, тонкости. |
8 | Power Query Язык М №8. Типы данных Logical, Null | Изучим логический тип данных и значение null. |
9 | Power Query Язык М №9. Объект Record / Запись | Что такое объект Record / Запись. Как создать запись, как сослаться на значения записи, как сравнивать записи, как объединять записи, как изменять записи. |
10 | Power Query Язык М №10. Объект List / Список | Зачем нужны списки, создание списков, сравнение списков, функции для работы со списками. |
11 | Power Query Язык М №11. Объект Table / Таблица | Получить строку, столбец. Объединение таблиц по вертикали. |
12 | Power Query Язык М №12. Как PQ работает с таблицами | В этом уроке вы узнаете как думает Power Query. |
13 | Power Query Язык М №13. Ключевое слово each | Зачем нужно ключевое слово each. |