Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:tuples [2023/01/03 12:48] aleks_versus |
help:tuples [2024/12/01 09:48] (текущий) aleks_versus |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | [[help:realtime|Назад: Реальное время]] | + | [[help:regexp|Назад: Регулярные выражения]] |
====== Кортежи ====== | ====== Кортежи ====== | ||
- | **QSP** позволяет упаковывать несколько значений в одну переменную, а затем извлекать их оттуда. Упакованные данные называются "строка значений", или "кортеж". | + | **QSP** позволяет упаковывать несколько значений в одну переменную, а затем извлекать их оттуда. Упакованные данные называются “**кортеж**”. |
- | Чтобы создать кортеж, нужно присвоить перемнной, имя которой начинается с символа ''**$**'' группу значений, перечисленных в круглых скобках через запятую. Пример: | + | Чтобы создать кортеж, нужно присвоить переменной, имя которой начинается с символа ''%%%%%'', группу значений, перечисленных в квадратных скобках через запятую. Пример: |
<sxh qsp> | <sxh qsp> | ||
! создаём кортеж | ! создаём кортеж | ||
- | $personage = ("Петя", 27, 182, 92, "боксёр") | + | %personage = ["Петя", 27, 182, 92, "боксёр"] |
</sxh> | </sxh> | ||
Строка 16: | Строка 16: | ||
<sxh qsp> | <sxh qsp> | ||
! распаковываем данные из кортежа | ! распаковываем данные из кортежа | ||
- | $name, age, height, weight, $sports = $personage | + | $name, age, height, weight, $sports = %personage |
</sxh> | </sxh> | ||
Строка 22: | Строка 22: | ||
<sxh qsp> | <sxh qsp> | ||
- | $personage[0] = ("Петя", 27, 182, 92, "боксёр") | + | %personage[0] = ["Петя", 27, 182, 92, "боксёр"] |
- | $personage[1] = ("Вася", 32, 162, 57, "жокей") | + | %personage[1] = ["Вася", 32, 162, 57, "жокей"] |
- | $personage[2] = ("Маша", 19, 158, 42, "фигуристка") | + | %personage[2] = ["Маша", 19, 158, 42, "фигуристка"] |
- | $personage[3] = ("Даша", 24, 202, 81, "баскетболистка") | + | %personage[3] = ["Даша", 24, 202, 81, "баскетболистка"] |
+ | </sxh> | ||
+ | |||
+ | В кортежи можно помещать значения любых типов, в том числе и другие кортежи: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %unit = [187, 94, 'steel', [0, 2]] | ||
+ | </sxh> | ||
+ | |||
+ | Допустимо использовать круглые скобки ''%%()%%'' для перечисления значений кортежа, однако рекомендуется использовать именно квадратные скобки ''%%[]%%'' для улучшения читаемости кода. | ||
+ | |||
+ | <sxh qsp> | ||
+ | %q = (65,'ddd') | ||
+ | %q = () & ! пустой кортеж | ||
+ | %q = (56, (32,'sdsd'), 3) | ||
+ | </sxh> | ||
+ | |||
+ | Так же допустимо совсем опускать скобки при присваивании значений кортежу, однако такая запись тоже не рекомендуется, потому что плохо читаема: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %q = 65,'ddd' | ||
+ | local %q = 65,'ddd',33 | ||
+ | </sxh> | ||
+ | |||
+ | ===== Операции с кортежами ===== | ||
+ | |||
+ | ==== Объединение кортежей (конкатенация) & ==== | ||
+ | |||
+ | Для объединения кортежей в один кортеж нужно использовать операцию конкатенации. Общая запись: | ||
+ | |||
+ | <sxh qsp> | ||
+ | [%новый_кортеж] = ([%кортеж_1] & [%кортеж_2] & ...) | ||
+ | </sxh> | ||
+ | |||
+ | В данном случае ставить скобки обязательно. Только так плеер поймёт, что это операция конкатенации, а не перечисление команд через амперсанд ''%%&%%''. | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %tpl = ([1, 2] & [3, 4]) | ||
+ | ! в переменную %tpl будет записан кортеж [1, 2, 3, 4] | ||
+ | </sxh> | ||
+ | |||
+ | ==== Увеличение значений кортежа + ==== | ||
+ | |||
+ | Общая запись: | ||
+ | |||
+ | <sxh qsp> | ||
+ | [%новый_кортеж] = [%кортеж_1] + [значение] | ||
+ | </sxh> | ||
+ | |||
+ | При выполнении данной операции к каждому элементу кортежа ''%%[%кортеж_1]%%'' будет прибавлен элемент ''%%[значение]%%''. ''%%[значение]%%'' может быть кортежем, тогда каждый элемент ''%%[%кортеж_1]%%'' будет сложен с кортежем ''%%[%значение]%%''. Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple + 2 | ||
+ | ! %a будет равно [6, 12, 18] | ||
+ | |||
+ | [4, 10] + ['b', 'x'] & ! [4 + ['b', 'x'], 10 + ['b', 'x']] | ||
+ | ! [['4b','4x'], ['10b','10x']] | ||
+ | </sxh> | ||
+ | |||
+ | ==== Уменьшение значений кортежа - ==== | ||
+ | |||
+ | Общая запись: | ||
+ | |||
+ | <sxh qsp> | ||
+ | [%новый_кортеж] = [%кортеж_1] - [#значение] | ||
+ | </sxh> | ||
+ | |||
+ | При выполнении данной операции из каждого элемента кортежа ''%%[%кортеж_1]%%'' будет вычтен элемент ''%%[#значение]%%''. ''%%[#значение]%%'' может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple - 2 | ||
+ | ! %a будет равно [2, 8, 14] | ||
+ | |||
+ | [4, 10] - ['b', 'x'] & ! ошибка о несоответствии типов данных | ||
+ | </sxh> | ||
+ | |||
+ | ==== Увеличение значений кортежа * ==== | ||
+ | |||
+ | Общая запись: | ||
+ | |||
+ | <sxh qsp> | ||
+ | [%новый_кортеж] = [%кортеж_1] * [#значение] | ||
+ | </sxh> | ||
+ | |||
+ | При выполнении данной операции каждый элемент кортежа ''%%[%кортеж_1]%%'' будет умножен на значение элемента ''%%[#значение]%%''. ''%%[#значение]%%'' может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple * 2 | ||
+ | ! %a будет равно [8, 20, 32] | ||
+ | |||
+ | [4, 10] * 'b' & ! ошибка о несоответствии типов данных | ||
+ | </sxh> | ||
+ | |||
+ | ==== Сокращение значений кортежа / ==== | ||
+ | |||
+ | Общая запись: | ||
+ | |||
+ | <sxh qsp> | ||
+ | [%новый_кортеж] = [%кортеж_1] / [#значение] | ||
+ | </sxh> | ||
+ | |||
+ | При выполнении данной операции каждый элемент кортежа ''%%[%кортеж_1]%%'' будет поделён на значение элемента ''%%[#значение]%%''. ''%%[#значение]%%'' может быть только числом. Все остальные варианты приведут к ошибке о несоответствии типов данных. Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %tuple = [4, 10, 16] | ||
+ | %a = %tuple / 2 | ||
+ | ! %a будет равно [2, 5, 8] | ||
+ | |||
+ | [4, 10] / 'b' & ! ошибка о несоответствии типов данных | ||
+ | </sxh> | ||
+ | |||
+ | ==== Операции с присваиванием ==== | ||
+ | |||
+ | Операции с присваиванием ''%%+=%%'', ''%%-=%%'', ''%%*=%%'' и ''%%/=%%'' применимы для кортежей. | ||
+ | |||
+ | Только в операции ''%%+=%%'' можно добавлять к элементам кортежей значения любых типов. В операциях ''%%-=%%'', ''%%*=%%'' и ''%%/=%%'' можно использовать только целые значения. | ||
+ | |||
+ | Примеры: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %tuple = [5, 10, 15] | ||
+ | %tuple /= 5 | ||
+ | ! %tuple будет равно [1, 2, 3] | ||
+ | %tuple *= 10 | ||
+ | ! %tuple будет равно [10, 20, 30] | ||
+ | %tuple -= 10 | ||
+ | ! %tuple будет равно [0, 10, 20] | ||
+ | %tuple += 13 | ||
+ | ! %tuple будет равно [13, 23, 33] | ||
+ | </sxh> | ||
+ | |||
+ | ===== Функции и операторы, работающие с кортежами ===== | ||
+ | |||
+ | * ''%%LEN([%кор])%%'' - возвращает число элементов кортежа ''%%[%кор]%%''. <sxh qsp> | ||
+ | *pl LEN([5,7,'a']) &! на экране будет число 3 | ||
+ | </sxh> | ||
+ | * ''%%ISNUM([%кор])%%'' - проверяет, можно ли преобразовать ''%%[%кор]%%'' в число. Функция возвращает ''%%0%%'' (ложь) или ''%%1%%'' (истина). <sxh qsp> | ||
+ | ISNUM([' 9999 ']) &! 1 | ||
+ | ISNUM([' -888']) &! 1 | ||
+ | ISNUM(['777a6']) &! 0 | ||
+ | ISNUM(['']) &! 0, т.к пустая строка не содержит числа | ||
+ | ISNUM(['1', '1']) &! 0, т.к. кортеж из двух значений | ||
+ | ISNUM([1, 1]) &! 0, т.к. кортеж из двух значений | ||
+ | </sxh> | ||
+ | * ''%%VAL([%кор])%%'' - переводит кортеж ''%%[%кор]%%'' в соответствующее число. Если преобразование невозможно, возвращает ''%%0%%''. <sxh qsp> | ||
+ | val(['123']) & ! увидим 123 | ||
+ | val(['']) & ! увидим 0 | ||
+ | val(['1', 1]) & ! увидим 0 | ||
+ | </sxh> | ||
+ | * ''%%$STR([%кор])%%'' - переводит кортеж в строку. <sxh qsp> | ||
+ | *pl $STR([5,7,'a']) &! на экране увидим [5,7,'a'] | ||
+ | </sxh> | ||
+ | * ''%%ARRPACK([$имя_массива], [#начальный_индекс], [#количество])%%'' - упаковывает массив ''[$имя_массива]'' в кортеж. | ||
+ | * Можно указать, сколько элементов ''[#количество]'' упаковать в кортеж, и с какого элемента ''[#начальный_индекс]'' начинать упаковку. Параметры опциональны, по умолчанию ''[#начальный_индекс]'' равен нулю, а ''[#количество]'' соответствует размеру массива. | ||
+ | * Функция возвращает кортеж с упакованными значениями. | ||
+ | * Примеры: <sxh qsp> | ||
+ | LOCAL type, name = ARRPACK('args') | ||
+ | ! Из массива char берём пять элементов, начиная со второго, и упаковываем в кортеж: | ||
+ | %unit[123] = ARRPACK('char', 2, 5) | ||
+ | </sxh> | ||
+ | * ''%%UNPACKARR [$имя_массива], [%кортеж], [#начальный_индекс], [#количество]%%'' - распаковывает значения из кортежа ''[%кортеж]'' в массив ''[$имя_массива]''. | ||
+ | * Можно указать, сколько элементов ''[#количество]'' распаковать, и с какого элемента ''[#начальный_индекс]'' начинать распаковку. Параметры опциональны, по умолчанию ''[#начальный_индекс]'' равен нулю, а ''[#количество]'' соответствует длине кортежа. | ||
+ | * Пример: <sxh qsp> | ||
+ | UNPACKARR 'A', ['тест','нескольких','значений',67, ['вложенный кортеж']] | ||
+ | ! $A[0] будет содержать 'тест' | ||
+ | ! $A[1] будет содержать 'нескольких' | ||
+ | ! $A[2] будет содержать 'значений' | ||
+ | ! A[3] будет содержать 67 | ||
+ | ! %A[4] будет содержать ['вложенный кортеж'] | ||
+ | </sxh> | ||
+ | * оператор позволяет извлечь из кортежа одно значение по указанному индексу: <sxh qsp> | ||
+ | %tpl = ['тест','нескольких','значений',67, ['вложенный кортеж']] | ||
+ | UNPACKARR 'A', %tpl, 3, 1 | ||
+ | ! в A будет 67 | ||
</sxh> | </sxh> | ||
===== Индексация ячеек массивов через кортежи ===== | ===== Индексация ячеек массивов через кортежи ===== | ||
- | Мы можем индексировать ячейки массивов с помощью кортежей, точно так же, как и с помощью строк. При этом, если кортеж прописывается прямо в квадратных скобках, круглые скобки можно и нужно опускать для лучшей читаемости кода. Таким образом можно создавать многомерные массивы: | + | Мы можем индексировать ячейки массивов с помощью кортежей, точно так же, как и с помощью строк. При этом повторяющиеся квадратные скобки можно и нужно опускать для лучшей читаемости кода. Таким образом можно создавать многомерные массивы: |
<sxh qsp> | <sxh qsp> | ||
Строка 42: | Строка 220: | ||
! можно, но не рекомендуется, | ! можно, но не рекомендуется, | ||
! писать так: | ! писать так: | ||
- | $map[(1,2)] = 'space' | + | $map[[1,2]] = 'space' |
- | $map[(1,3)] = 'space' | + | $map[[1,3]] = 'space' |
- | $map[(5,7)] = 'tree' | + | $map[[5,7]] = 'tree' |
- | $map[(0,-1)] = 'hero' | + | $map[[0,-1]] = 'hero' |
- | *pl $map[(x,y)] | + | *pl $map[[x,y]] |
</sxh> | </sxh> | ||
- | Почитать про многомерные массивы можно в соответствующем подразделе раздела [[help:arrays|"Массивы"]]. | + | Почитать про многомерные массивы можно в соответствующем подразделе раздела [[help:arrays|“Массивы”]]. |
+ | |||
+ | Опускать повторяющиеся скобки нельзя, если для индексации используются кортежи, состоящие из одного значения. | ||
===== Кортеж из одного значения ===== | ===== Кортеж из одного значения ===== | ||
- | Кортежи из одного значения создать невозможно, так как с точки зрения синтаксиса, выражение в скобках — это просто математическое выражение. Как кортеж оно распознаётся только при наличии в этих скобках запятых между значениями. Например: | + | В **QSP** 5.9.0 появилась возможность создавать кортежи из одного значения. Например: |
<sxh qsp> | <sxh qsp> | ||
- | $tuple=(-1) | + | %tuple = [-1] |
+ | *pl %tuple & ! [-1] | ||
</sxh> | </sxh> | ||
- | В данном случае в переменную ''$tuple'' будет записана строка ''"-1"'' ввиду автоматического преобразования типа. | + | С помощью таких кортежей можно индексировать массивы, обходя ограничение на отрицательные индексы ячеек. Но в этом случае необходимо сохранять повторяющиеся квадратные скобки: |
- | + | ||
- | Если попытаться индексировать массив через такие "кортежи", могут возникнуть трудности, потому что для движка это обычное математическое выражение, значение которого он вычисляет. | + | |
- | + | ||
- | ''$map[(-1)]'' будет эквивалентно ''$map[-1]'', а значения ячеек при указании на отрицательные индексы игнорируются плеером. | + | |
- | + | ||
- | Можно транслировать значения через переменные, как бы соблюдая парадигму записи кортежей. | + | |
<sxh qsp> | <sxh qsp> | ||
- | $tuple=(-1) | + | $line_map[[-1]] = 'personage' |
- | $map[$tuple] | + | *pl $line_map[[-1]] |
- | </sxh> | + | |
- | + | ||
- | Однако это будет эквивалентно использованию обычных строковых индексов. | + | |
- | + | ||
- | <sxh qsp> | + | |
- | $tuple=(-1) | + | |
- | *pl $tuple | + | |
- | $map[(-1)]='string' | + | |
- | *pl $map[(-1)] | + | |
- | $map[$tuple]='out' | + | |
- | *pl $map[$tuple] | + | |
</sxh> | </sxh> | ||
Строка 89: | Строка 253: | ||
<sxh qsp> | <sxh qsp> | ||
!foo | !foo | ||
- | $result = (12, 45) | + | %result = [12, 45] |
!start | !start | ||
Строка 97: | Строка 261: | ||
===== Ограничения кортежей ===== | ===== Ограничения кортежей ===== | ||
- | * В **QSP** версии 5.8.0 нельзя вкладывать одни кортежи в другие. Если вы попытаетесь это сделать, вы получите более длинный кортеж:<sxh qsp> | + | * Используя лишь одну пару квадратных скобок нельзя создать кортеж из более чем двадцати элементов. Пример попытки создать кортеж из 21 элемента: <sxh qsp> |
- | $ht = (12, 34) | + | %tpl = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] |
- | $rm = (13, 19) | + | ! это приведёт к ошибке: Неверное число аргументов операции/функции |
- | $tuple = ($ht, $rm) | + | </sxh> Однако вы можете создать кортеж, сколько угодно большой длины, используя конкатенацию: <sxh qsp> |
- | *pl $tuple | + | %tpl = ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] & [21]) |
+ | </sxh> **Настоятельно не рекомендуется** создавать кортежи большой длины. | ||
+ | * Кортежи нельзя изменять. То есть, например, в кортеже из трёх элементов нельзя заменить второй элемент. Нужно распаковать кортеж в переменные, изменить одну из переменных и снова упаковать в кортеж: <sxh qsp> | ||
+ | %pos_in_space = [12, -3, 9] | ||
+ | x, y, z = %pos_in_space | ||
+ | y = -13 | ||
+ | %pos_in_space = [x, y, z] | ||
</sxh> | </sxh> | ||
- | * Кортежи нельзя изменять. То есть, например, в кортеже из трёх элементов нельзя заменить второй элемент. Нужно распаковать кортеж в переменные, изменить одну из переменных и снова упаковать в кортеж:<sxh qsp> | + | * Нельзя извлечь из кортежа одно конкретное значение, например, второе. Зато можно извлекать одно или несколько первых значений. В этом случае из набора переменных, в которые распаковывается кортеж, имя последней должно начинаться с символа ''%%%%%'', так как в эту переменную будет упаковываться оставшаяся часть кортежа: <sxh qsp> |
- | $pos_in_space = (12, -3, 9) | + | %personage = ["Петя", 27, 182, 92, "боксёр"] |
- | x, y, z = $pos_in_space | + | $name, %tale = %personage |
- | y = -13 | + | *pl $name &! 'Петя' |
- | $pos_in_space = (x, y, z) | + | $name, age, height, %tale = %personage |
+ | *pl "Имя: <<$name>>, возраст: <<age>>, рост: <<height>>." | ||
+ | weight, $sports = %tale | ||
+ | *pl $sports | ||
</sxh> | </sxh> | ||
- | * Нельзя извлечь из кортежа одно конкретное значение, например, второе. Зато можно извлекать одно или несколько первых значений. В этом случае из набора переменных, в которые распаковывается кортеж, имя последней должно начинаться с символа ''**$**'', так как в эту переменную будет упаковываться оставшаяся часть кортежа:<sxh qsp> | + | * Как и в строках, предел объёмов данных для кортежа 2 Гигабайта или **2147483648** элементов. Величина кортежа не может превысить объём оперативной памяти. |
- | $personage = ("Петя", 27, 182, 92, "боксёр") | + | |
- | $name, $tale = $personage | + | |
- | *pl $name | + | |
- | $name, age, height, $tale = $personage | + | |
- | *pl "Имя: <<$name>>, возраст: <<age>>, рост: <<height>>." | + | |
- | weight, $sports = $tale | + | |
- | *pl $sports | + | |
- | </sxh> | + | |
- | * На самом деле в кортежах данные хранятся исключительно в текстовом виде, поэтому некоторые кортежи могут оказаться одинаковыми, хотя вы вносили в них данные разных типов:<sxh qsp> | + | |
- | $tuple_1 = (13, 19) | + | |
- | $tuple_2 = ("13", "19") | + | |
- | if $tuple_1 = $tuple_2: | + | |
- | "кортежи одинаковые" | + | |
- | else: | + | |
- | "кортежи разные" | + | |
- | end | + | |
- | </sxh> | + | |
- | + | ||
- | ===== Дополнительная информация по кортежам ===== | + | |
- | + | ||
- | Ликбез по кортежам в видеоролике на ютуб: [[https://www.youtube.com/watch?v=r-X9tK69LOU&t=15339s|"Алгоритмы поиска путей на QSP"]]. | + | |
- | [[help:classic_qsp|Вперёд: Классический плеер]] | + | [[help:conditional|Вперёд: Условия]] |