Kdb练习程序终端输出空值(::)的原因求解
KDB中
each迭代后出现空值::的原因 我正在练习KDB编程,写了一个判断今日是否为某人生日的程序(用字母替代姓名),但终端输出里出现了三个空值::,添加字典条目后空值数量也跟着增加。另外一个简单的show each调用也有类似的异常输出。
相关代码:
.aaa.bdic: `a`b`c!((01 12);(02 01);(29 04)) .aaa.bdic a| 1 12 b| 2 1 c| 29 4 {if[((`dd $ .z.P)=.aaa.bdic[x][0]) and (`mm $ .z.P)=.aaa.bdic[x][1]; show "it's " , (string x) , "'s birthday!"]}each key .aaa.bdic "it's c's birthday!" :: :: ::
添加条目后空值变为四个,另一个示例:
show each .aaa.bdic 1 12 2 1 29 4 a| :: b| :: c| ::
想知道这些空值::产生的原因。
这些::是KDB里的空原子,本质是因为each会把迭代时每个函数调用的返回值收集起来,而你的函数多数时候没有返回有效内容:
第一个示例中的
if逻辑:- 当
if条件满足时,你调用了show函数——show的作用是把内容输出到终端,但它自身的返回值就是::。 - 当
if条件不满足时,if没有执行任何分支,KDB会默认返回::作为该语句的结果。 each遍历字典的所有key(示例里是3个),把每个key对应的函数返回值攒成列表,所以最终会输出3个::。添加字典条目后,遍历的key数量增加,空值数量自然同步变多。
- 当
第二个示例中的
show each:- 每调用一次
show打印字典值时,先输出值,然后返回::。 each将这些::拼接成和原字典结构一致的新字典(键相同,值全为::),所以在输出三个字典值后,还会输出这个全是::的字典。
- 每调用一次
如果想避免这些多余的::输出,可以让函数返回空列表(),或者用do代替if来执行无返回的逻辑,比如:
{do[((`dd $ .z.P)=.aaa.bdic[x][0]) and (`mm $ .z.P)=.aaa.bdic[x][1]; show "it's " , (string x) , "'s birthday!"]}each key .aaa.bdic
do语句执行后不会返回任何值,each收集的结果会是空列表,终端就不会输出多余的::了。
内容的提问来源于stack exchange,提问作者Sophia Hass
相关产品推荐
相关产品推荐

