暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kdb+中强大的@和dot(.)

kdb中文教程 2020-12-27
277



kdb+/q中的数组、字典、表、函数都是映射,也都是值(value),q中几乎所有的值都可以被应用(be applied)(除了既非句柄又非变量名或lambda名的原子,不需要被应用)。数组可以应用于其索引而获取其元素;字典可以应用于其键(key)而获取对应的值;表可以应用于行索引获取行,可以应用于列名获取列,还可以应用于行索引和列名获取表中的项;函数可以应用于其参数而获取计算结果等。
q中的通用应用(general application)用@或.来执行,可以理解为是一个更高阶的函数,它接受一个函数和值,并在该值上计算该函数。
简单来说,@可对非嵌套数组和字典做应用,dot(.)可对嵌套数组和字典做应用,而q中所有的数据结构都是基于数组和字典,因此,通用应用提供了一种对任意数据结构进行检索和计算的机制,功能十分强大

一、index at和index
index at语法为:u@ux 或 @[u;ux]
注意,@是二元函数,参数是u和ux,当ux为数组时,依次返回u@ux1,u@ux2...,u@uxn。当u为嵌套数组时,@取出嵌套数组u的顶层元素,如果需要深入嵌套数组的底层,则需要反复使用@函数。
index语法为:v . vx 或 .[v;vx]
注意,dot(.)符号两边要有空格,vx必须是一个数组, 是代表数组v中某元素的一组索引,可以取出嵌套数组的底层元素。
例如:
q)d:((1 2 3;4 5 6 7);(8 9;10; 11 12);(13 14;15 16 17 18;19 20))
d@1等价于d . enlist 1,表示取出d中索引为1的元素。
q)d@1
8 9
10
11 12
如果要取出嵌套数据的底层元素,要反复使用@,或者使用dot(.)运算符。例如,((d@1)@2)@0 等价于d@/1 2 0 等价于 d . 1 2 0。
q)((d@1)@2)@0
11
q)d . 1 2 0   / 表示取出d中第二个元素(8 9;10; 11 12)中第三个元素(11 12)的第一个元素11
11
注意d@1 2 0,返回d@1,d@2和d@0。

二、amend at和amend
@和.可用于修改数组、字典或文件中的部分元素。
amend at和amend有三元和四元两种形式。
amend at语法为:@[d;i;u](三元形式);@[d;i;v;vy](四元形式)
amend 语法为:.[d;i;u](三元形式);.[d;i;v;vy](四元形式)
其中,d是一个数组或字典(或指向数组、字典或文件的句柄);i是数组d中待修改元素的索引,i可以是空值(for amend)或::(for amend at),代表修改d中的所有元素;u为一元函数,该函数的参数为d[I](d@i 或 d . i);v为二元函数,d[I]和vy分别为其左、右参数。
例如:
q)@[1 2 3 4 5;(1 3);:;(7;8)]    /将数组1 2 3 4 5的第一个和第三个元素替换成7和8
1 7 3 8 5
q).[(1 2;enlist 3;4 5 6);0 1;:;7]   /将嵌套数组第0个元素第二项从2替换成7
1 7
,3
4 5 6
q).[(1 2;enlist 3;4 5 6);();,;7 8]   /向数组中增加元素
1 2
,3
4 5 6
7 8
d也可以是文件句柄,例如:
/ 第一次写入,等价于set
q).[`:d:/kdb/data/qdata.dat ; () ; : ; 1001 1002 1003]
/ 对已经存在的文件追加数据
q) .[`:d:/kdb/data/qdata.dat; (); , ; 42 43]   

三、apply at和apply
@和.可用于对数组或字典的部分元素应用指定函数,再返回结果。apply at和apply的写法与amend at、amend相同,有三元和四元两种形式。
apply at语法为:@[d;i;u](三元形式);@[d;i;v;vy](四元形式)
apply 语法为:.[d;i;u](三元形式);.[d;i;v;vy](四元形式)
其中,d为数组或字典;i为数组的索引;u为一元函数,三元形式可理解为u[d[i]];v为二元函数,vy为二元函数v的第二个参数取值,四元形式可理解为v[d[i];vy]。对于复合数据结构(例如嵌套数组、表、主键表等),@对函数的应用发生在数据结构的最顶层,而.可以深入嵌套数组的数据结构,对嵌套数组的深层元素应用函数。
例如:
q)L:(10 20 30; 40 50 60; 70 80 90)
q)@[L; 0 2; +; 10 20]
20 30 40
40 50 60
90 100 110
q).[L; 0 2; +; 10]
10 20 40
40 50 60
70 80 90
q)d:`a`b`c!(10 20 30; 40 50; enlist 60)
q).[d; (`a; 1); neg]
a| 10 -20 30
b| 40 50
c| ,60

四、trap和trap at
实际上trap at和trap是apply at和apply的一种应用。在q中用于保护式执行。
一元函数u的try-catch: @[u;ux;expr_fail] 等价于 .[u;enlist x;expr_fail]
多元函数m的try-catch: .[m;mx;expr_fail]
其中,ux是一元函数u的参数;mx是多元函数的参数组成的数组,expr_fail是函数u或m执行失败时,q执行的表达式。
q)s:"6x7"
@[value;s;`$"Invalid q expression"]q)
`Invalid q expression
q)@[2+;"42";`err]
`err
q)x:6
q)y:`7
q).[*;(x;y);`$" Invalid args for *"]


《kdb+中文教程》

  全文链接

前言及目录
第一章  简介

第二章  数据类型

第三章  数组

第四章  字典

第五章  函数

第六章  表与qSQL

第七章  I/O操作

第八章  数据库

第九章  应用例子

第十章  问答(含参考文献)

文章转载自kdb中文教程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论