Инструменты пользователя

Инструменты сайта


help:tuples

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следущая версия
Предыдущая версия
help:tuples [2023/01/03 12:47]
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 ​[xy, z]
 </​sxh>​ </​sxh>​
- Кортежи нельзя изменять. То есть, например,​ в кортеже из трёх элементов нельзя заменить второй элемент. Нужно распаковать кортеж ​в переменные, изменить одну из переменных и снова ​упаковать в кортеж:<​sxh qsp> +  ​Нельзя извлечь из кортежа одно конкретное значение, например,​ второе. Зато можно извлекать одно или ​несколько первых ​значений. В этом случае из набора переменных, в которые ​распаковывается кортеж, имя ​последней должно начинаться с символа ''​%%%%%'',​ так как в эту переменную будет ​упаковываться оставшаяся часть ​кортежа: <sxh qsp> 
- $pos_in_space ​(12-39) +%personage ​["​Петя"​2718292"​боксёр"​] 
- xy= $pos_in_space +$name, %tale %personage 
- -13 +*pl $name &! '​Петя'​ 
- $pos_in_space = (xyz)+$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|Вперёд: ​Условия]]
  
help/tuples.1672750073.txt.gz · Последние изменения: 2023/01/03 12:47 — aleks_versus