kdb+q堪称天书,对于一个对java,python和c++比较熟练的我来说,一时之间实在难以接受。无奈国内中文资料少之又少,即使有一些中文资料,或者英文的文献,难读也就算了,居然看完十几页,不能按照自己的想法写出一行代码,只知道这个是这样,这个函数这这样的,对上手实践并没有任何卵用。今日认真在google上学习一番,写下这篇博文,力求让读者快速上手。希望能帮到自己和更多正往这个坑里迈的那些人。
1.关于控制语句,控制语句是一个编程下手最直接影响的东西,一般的语言没必要讲,因为都大同小异,然而,q颠覆了传统的。
(1)循环:
q的循环没有for语句,这会让一些喜欢用for的我急得想死,直到找到很好的替代。
(1)do语句:do[3; show i; i:i+1]; show `doend do的中括号里用分号隔开,第一个是do的次数,后面就是do的内容,可以把很多语句yong;连接起来。
(2)i:0; while[i<3; show i; i:i+1]; show `end.同样类似,while中括号的第一个是while的条件,后面是while做的内容
以上用这两种语句来做list遍历实在不方便,因为它们虽能取代for但用得极其之难受。
(3)each。each语句相当于加强形势的for语句,不需要索引的遍历。
例子1:每个加1
l:1 2 3 4 5
(1+)each l
例子2:
取偶数:z这个没用到each但是能起到从list中选择的作用。记住的是til前面,或者list前面必须是个function
{x where 0=x mod 2}til 100
(2)条件语句:也就是传说中的if else语句。q里没有这个关键字。而是用$[;;]代替
先写个function,同样是判断奇偶,第一个;之前是条件,若是,则执行第二个;前面,否则执行第三句
$[0=x mod 2;show `ou;show `ji]each til 200
注意:
1.q是从右往左解析,所以0=x mod 2 不能写反。
2.function:
q里的function出神入化,无所不能,非一般人能接受
function用{}圈住,默认最后一个不带;的那句为返回值,参数在开始用[]框住,[]中用;分开,[]这句和返回值那句一样不能有;
注意:如果参数是x,y之类可以不用显式声明。
我们继续检查奇数偶数:
checkJiOu:{
$[0=x mod 2;show `ou;show `ji]
}
checkJiOu 10
checkJiOu each til 200
3.over和scan。迭代!虽然你现在会循环会判断,但是一个很简单的程序你都写不出来,因为你无从下手!
比方说1 +2+3+。。。100怎么写?虽然有sum函数 :sum til 101
{x+y} over til 101
over 的意思就是迭代,会把你的list的第一个元素给x,然后把第二个元素给y,执行函数,再把结果给x,把list的第三个元素给y。。。
比方说:取一个list的最大值怎么写,虽然有max函数 : max til 101
{$[x>y;x;y]}over til 101
跟over类似,scan也是迭代,只是它会把每一步迭代的结果给放进一个list,最后返回一个list并不是一个值
4.输出。作为入门如果不会输出,即使控制语句出身如何也会痛苦得要死。
show `helloworld
a:23
show `helloworld,(23)
5.今日知识简单回顾:
写一个求标准差的函数:
deviation:{
/ param
[ll]
a:avg ll;
b:(ll-a)*(ll-a)
c:{x+y}over b;
d:sqrt c
};
ll:1 2 3 4
deviation ll
入门就先讲这么多呗.希望能够帮助大家。