kdb+中的条件控制语句

2022-05-25 00:00:00 语句 执行 条件 是一个 返回
在kdb+中执行向量运算时,要尽量避免循环和条件执行语句,以获得干净、简洁、高性能的代码。然而有些时候,难以避免要编写循环,kdb+提供了一些常用的控制语句。本篇主要介绍kdb+中控制语句的用法。
一、cond($)
1、基础用法
kdb+中基础条件语句的写法为:$[expr_cond;expr_true;expr_false] 
其中expr_cond是返回布尔值的任意表达式,返回值非0则执行expr_true,返回值为0则执行expr_false。例如:
q)a:42
q)$[a>60;`Pass;`Fail]
`Fail
下面介绍三种扩展形式。

2、一个条件,多个执行语句
$[expr_cond;[expr_true1;expr_true2;...];[expr_false1;expr_false2;...]]
其中expr_cond是一个计算结果为布尔值的任意表达式。如果expr_cond返回值非零则执行大括号中的个语句序列(expr_true1;expr_true2;...),否则,执行第二个大括号语句序列(expr_false1;expr_false2;..)。
例如:
q)test:24
q)$[test<>42;[a:6;b:7;a*b];[a:`Life;b:`the;c:`Universe;a,b,c]]
42
q)a
6
q)b
7

3、多个条件,每个条件对应一个执行语句
$[expr_cond1;expr_true1; ... ;expr_condn;expr_truen;expr_false]
在上述结构中,expr_condn将连续求值,直到执行expr_condi返回一个非0值,此时执行对应语句expr_truei,执行结束。如果没有一个表达式返回值为非0,则执行expr_false。
q)a:-2
q)$[a=0;`zero;a>0;`pos;`neg]
`neg
注意,$[q;a;r;b;c]和$[q;a;$[r;b;c]]是等价的。

4、多个条件,每个条件对应多个执行语句
上述两种扩展形式还可以继续叠加使用:
[expr_cond1;[expr_true11;...];...;
    expr_condn;[exprtruen1;...];
    [expr_false1;...]]
注意,应尽量避免使用这种结构复杂的控制语句,《q for mortals 3》一书作者认为这种代码是伪q:)。

二、vector cond(?)
qSQL不支持$(cond )语句,要使用向量条件语句?,具体写法如下:
?[vb; expr_true ; expr_false] 
其中vb是一个元素为布尔值的简单数组。expr_ture和expr_flase类型相同,vb数组中元素值1b的位置返回expr_true,元素数值为0b的位置返回expr_false。vb、expr_true和expr_false必须是可匹配(conform)的,例如:
q)?[11001b;3 8;10 20 30 40 50]  / not conform
'length
q)?[11001b;1 2 3 4 5;10 20 30 40 50]
1 2 30 40 5
如果expr_true或expr_false为原子型,则重复返回该值,例如:
q)?[11001b;8;10 20 30 40 50]
8 8 30 40 8
下面演示在qSQL中如何使用控制语句:
q)t:([] c1:1.1 2.2 3.3; c2:10 20 30; c3:100 200 300)
q)update res:?[c1>2.0; c3; c2] from t
c1  c2 c3  res
--------------
1.1 10 100 10
2.2 20 200 200
3.3 30 300 300

三、控制结构
1、if语句
if[expr_cond;expr1; ... ;exprn]
当满足expr_cond时,从左到右依次执行expr1,…,exprn。好的q代码应避免使用if语句,if一般用在对函数进行参数检查。
例如:
ftest:{[x;y]
  if[type[x]<0; :x];           
  if[count[y]<>3; '"length"]; 
  ..
  }
下面是一个if语句的示例:
q)a:42
q)b:98
q)if[b<>42;x:6;y:7;z:x*y]   / 不返回值
q)z
42

2、do语句
do[count;expr1;...;exprn]
其中,count是一个非负的整数,代表执行次数,依次执行表达式expr1,expr2…直到达到指定的执行次数count。
例如:
q)n:5
q)do[-1+f:r:n;r*:f-:1]   / 一共做4次,f=f-1,r=r*f
q)r
120

3、while语句
while[expr_cond;expr1; ... ; exprn]
只要expr_cond不为0 ,则从左至右依次执行expr1,expr2...,直到expr_cond返回0为止。
q)r:1 1
q)x:10
q)while[x-:1;r,:sum -2#r]  /执行直到x=0
q)r
1 1 2 3 5 8 13 21 34 55 89

注意,if、do和while是控制结构,不是函数,不返回值,也不能被迭代或投影。例如以下写法,用if语句,a并不能被成功赋值为42,要采用cond语句对a进行赋值。
q)a:if[1b;42]
q)a   /不返回值
q)a:$[1b;42;10]
q)a
42
来源 https://www.modb.pro/db/212297

相关文章