Q 语言 - 函数

函数类型

函数可以通过多种方式进行分类。 在这里,我们根据它们采用的参数的数量和类型以及结果类型对它们进行了分类。 函数可以是,

  • 原子 − 其中参数是原子的并产生原子结果

  • 聚合 − 列表中的原子

  • 统一(列表中的列表) − 扩展了原子的概念,因为它们适用于列表。 参数列表的计数等于结果列表的计数。

  • 其他 − 如果该函数不属于上述类别。

数学中的二元运算在 q 中称为二元函数; 例如,"+"。 类似地,一元运算称为一元函数; 例如,"abs"或"floor"。

常用函数

q编程中有很多常用的函数。 在本节中,我们将看到一些常用函数的用法 −

abs

q) abs -9.9 / 绝对值,对 -ve 数求负并留下非 -ve 数
9.9

all

q) all 4 5 0 -4 / 逻辑与(数字最小值),返回最小值
0b

Max (&), Min (|), and Not (!)

q) /And, Or, and Logical Negation

q) 1b & 1b        / And (Max)
1b

q) 1b|0b              / Or (Min)
1b

q) not 1b             /Logical Negate (Not)
0b 

asc

q)asc 1 3 5 7 -2 0 4    / Order list ascending, sorted list
                        / in ascending order i
s returned
`s#-2 0 1 3 4 5 7

q)/attr - 给出数据的属性,描述数据的排序方式。
`s 表示完全排序,`u 表示唯一,`p 和 `g 用于
引用重复的列表,其中"p 代表分开","g 代表分组"

avg

q)avg 3 4 5 6 7           / 返回数值列表的平均值
5f

q)/Create on trade table

q)trade:([]time:3?(.z.Z-200);sym:3?(`ibm`msft`apple);price:3?99.0;size:3?100)

by

q)/ by - 按给定符号对表中的行进行分组

q)select sum price by sym from trade    / 查找每个 sym 的总价

  sym  |   price
------ | --------
 apple | 140.2165
  ibm  | 16.11385

cols

q)cols trade / Lists columns of a table
`time`sym`price`size

count

q)count (til 9) / 计算列表,计算列表中的元素并
                / return a single int value 9

port

q)\p 9999 / 分配端口号

q)/csv - 此命令允许将浏览器中的查询导出到
    通过在查询前加上前缀来执行 excel,例如 http://localhost:9999/.csv?select from trade where sym =`ibm

cut

q)/ cut - 允许在某个点剪切表格或列表

q)(1 3 5) cut "abcdefghijkl"
                            / 参数分为第一个、第三个和第五个字母。
"bc"
"de"
"fghijkl"

q)5 cut "abcdefghijkl"      / cut the right arg. Into 5 letters part
                            / until its end.
"abcde"
"fghij"
"kl"

Delete

q)/delete - 从表中删除行/列

q)delete price from trade

          time              sym   size
---------------------------------------
  2009.06.18T06:04:42.919  apple   36
  2009.11.14T12:42:34.653   ibm    12
  2009.12.27T17:02:11.518  apple   97

Distinct

q)/distinct - 返回列表的不同元素

q)distinct 1 2 3 2 3 4 5 2 1 3            / 生成唯一的一组数字
1 2 3 4 5

enlist

q)/enlist - Creates one-item list.

q)enlist 37
,37

q)type 37           / -ve type value
-7h

q)type enlist 37    / +ve type value
7h 

Fill (^)

q)/fill - 与空值一起使用。 共有三个函数用于处理空值。

名为 fill 的二元函数用原子左参数替换右参数中的空值。

q)100 ^ 3 4 0N 0N -5
3 4 100 100 -5

q)`Hello^`jack`herry``john`
`jack`herry`Hello`john`Hello

Fills

q)/fills - 用之前的非空值填充空值。

q)fills 1 0N 2 0N 0N 2 3 0N -5 0N
1 1 2 2 2 2 3 3 -5 -5

First

q)/first - 返回列表的第一个原子

q)first 1 3 34 5 3
1

Flip

q)/flip - 适用于列表和关联的 Monadic 原语。 它互换了其论证的最上面两个层次。

q)trade

       time                   sym      price   size
------------------------------------------------------
  2009.06.18T06:04:42.919    apple   72.05742   36
  2009.11.14T12:42:34.653    ibm     16.11385   12
  2009.12.27T17:02:11.518    apple   68.15909   97

q)flip trade

time | 2009.06.18T06:04:42.919 2009.11.14T12:42:34.653
2009.12.27T17:02:11.518

sym   |  apple         ibm         apple
price | 72.05742     16.11385    68.15909
size  | 36 12 97

iasc

q)/iasc - 索引升序,返回升序排序列表相对于输入列表的索引。

q)iasc 5 4 0 3 4 9

2 3 1 4 0 5

Idesc

q)/idesc - 索引降序,返回相对于输入列表的降序排序列表

q)idesc 0 1 3 4

3 2 1 0

in

q)/in - 在列表中,二元函数用于查询列表(位于右侧)有关其内容的信息。

q)(2 4) in 1 2 3

10b

insert

q)/insert - Insert语句,将新数据上传到表中。

q)insert[`trade;((.z.Z);`samsung;48.35;99)],3

q)trade

      time                  sym       price     size
------------------------------------------------------
 2009.06.18T06:04:42.919   apple    72.05742     36
 2009.11.14T12:42:34.653    ibm     16.11385     12
 2009.12.27T17:02:11.518   apple    68.15909     97
 2015.04.06T10:03:36.738   samsung  48.35        99

key

q)/key - 三个不同的函数,即生成+ve整数,给出目录的内容或表/字典的键。

q)key 9

0 1 2 3 4 5 6 7 8

q)key `:c:
`$RECYCLE.BIN`Config.Msi`Documents and Settings`Drivers`Geojit`hiberfil.sys`I..

lower

q)/lower - 转换为小写并向下取整

q)lower ("JoHn";`HERRY`SYM)
"john"
`herry`sym

Max and Min (i.e. | and &)

q)/Max and Min / a|b and a&b

q)9|7
9

q)9&5
5

null

q)/null - 如果原子为 null,则返回 1b,否则返回参数列表中的 0b

q)null 1 3 3 0N
0001b

Peach

q)/peach - 每个并行,允许跨从属进程

q)foo peach list1       / 函数 foo 应用于 list1 中指定的从属设备

'list1

q)foo:{x+27}

q)list1:(0 1 2 3 4)

q)foo peach list1       / 函数 foo 应用于 list1 中指定的从属设备
27 28 29 30 31

Prev

q)/prev - 返回前一个元素,即将列表向前推

q)prev 0 1 3 4 5 7

0N 0 1 3 4 5

Random( ?)

q)/random - 语法 - n?list,给出整数和浮点数的随机序列

q)9?5
0 0 4 0 3 2 2 0 1

q)3?9.9
0.2426823 1.674133 3.901671

Raze

q)/raze - 展平列表列表,从列表列表中删除索引层。 例如:

q)raze (( 12 3 4; 30 0);("hello";7 8); 1 3 4)

12 3 4
30 0
"hello"
7 8
1
3
4

read0

q)/read0 - 读入文本文件

q)read0 `:c:/q/README.txt    / 给出 *.txt 文件的内容

read1

q)/read1 - 读入q数据文件

q)read1 `:c:/q/t1

0xff016200630b000500000073796d0074696d6500707269636…

reverse

q)/reverse - 反转列表

q)reverse 2 30 29 1 3 4

4 3 1 29 30 2

q)reverse "HelloWorld"

"dlroWolleH"

set

q)/set - 设置变量值

q)`x set 9
`x

q)x
9

q)`:c:/q/test12 set trade

`:c:/q/test12

q)get `:c:/q/test12

       time                   sym      price     size
---------------------------------------------------------
  2009.06.18T06:04:42.919    apple    72.05742    36
  2009.11.14T12:42:34.653     ibm     16.11385    12
  2009.12.27T17:02:11.518    apple    68.15909    97
  2015.04.06T10:03:36.738    samsung  48.35       99
  2015.04.06T10:03:47.540    samsung  48.35       99
  2015.04.06T10:04:44.844    samsung  48.35       99

ssr

q)/ssr - 字符串搜索和替换,语法 - ssr["string";searchstring;replaced-with]

q)ssr["HelloWorld";"o";"O"]

"HellOWOrld"

string

q)/string - 转换为字符串,将所有类型转换为字符串格式。

q)string (1 2 3; `abc;"XYZ";0b)

(,"1";,"2";,"3")
"abc"

(,"X";,"Y";,"Z")
,"0"

SV

q)/sv - 来自向量的标量,根据其参数执行不同的任务。

它评估数字的基本表示形式,这使我们能够计算一个月的秒数或将长度从英尺和英寸转换为厘米。

q)24 60 60 sv 11 30 49

41449   / 11:30:49 一天中经过的秒数

system

q)/system - 允许发送系统命令,

q)system "dir *.py"

" Volume in drive C is New Volume"
" Volume Serial Number is 8CD2-05B2"
""

" Directory of C:\Users\myaccount-raj"
""

"09/14/2014    06:32 PM     22 hello1.py"
"                1 File(s)    22 bytes"

tables

q)/tables - 列出所有表

q)tables `

`s#`tab1`tab2`trade

Til

q)/til - 枚举

q)til 5

0 1 2 3 4

trim

q)/trim - 消除字符串空格

q)trim " John "

"John"

vs

q)/vs - 来自标量的向量,从标量产生向量

q)"|" vs "20150204|msft|20.45"

"20150204"
"msft"
"20.45"

xasc

q)/xasc - 按升序排列表,允许对表(右侧参数)进行排序,以便(左侧参数)按升序排列

q)`price xasc trade

          time                 sym      price      size
----------------------------------------------------------
   2009.11.14T12:42:34.653     ibm     16.11385     12
   2015.04.06T10:03:36.738   samsung   48.35        99
   2015.04.06T10:03:47.540   samsung   48.35        99
   2015.04.06T10:04:44.844   samsung   48.35        99
   2009.12.27T17:02:11.518    apple    68.15909     97
   2009.06.18T06:04:42.919    apple    72.05742     36

xcol

q)/xcol - 重命名表的列

q)`timeNew`symNew xcol trade

        timeNew                 symNew    price      size
-------------------------------------------------------------
   2009.06.18T06:04:42.919      apple    72.05742     36
   2009.11.14T12:42:34.653       ibm     16.11385     12
   2009.12.27T17:02:11.518      apple    68.15909     97
   2015.04.06T10:03:36.738     samsung   48.35        99
   2015.04.06T10:03:47.540     samsung   48.35        99
   2015.04.06T10:04:44.844     samsung   48.35        99

xcols

q)/xcols - 对表的列重新排序,

q)`size`price xcols trade

  size    price           time                   sym
-----------------------------------------------------------
   36   72.05742   2009.06.18T06:04:42.919      apple 
   12   16.11385   2009.11.14T12:42:34.653       ibm
   97   68.15909   2009.12.27T17:02:11.518      apple
   99   48.35      2015.04.06T10:03:36.738     samsung 
   99   48.35      2015.04.06T10:03:47.540     samsung
   99   48.35      2015.04.06T10:04:44.844     samsung

xdesc

q)/xdesc - 对表降序排序,允许对表进行排序,以便左侧参数按降序排列。

q)`price xdesc trade

        time                   sym       price      size
-----------------------------------------------------------
   2009.06.18T06:04:42.919    apple    72.05742      36
   2009.12.27T17:02:11.518    apple    68.15909      97
   2015.04.06T10:03:36.738   samsung   48.35         99
   2015.04.06T10:03:47.540   samsung   48.35         99
   2015.04.06T10:04:44.844   samsung   48.35         99
   2009.11.14T12:42:34.653     ibm     16.11385      12

xgroup

q)/xgroup - 创建嵌套表

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40)
'length

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40 10)

  x  |    y
---- | -----------
  9  | 10 10 40 10
  18 | 20 20
  27 | ,30

xkey

q)/xkey - Set key on table

q)`sym xkey trade

    sym   |      time                    price     size
--------- | -----------------------------------------------
   apple  | 2009.06.18T06:04:42.919    72.05742     36
    ibm   | 2009.11.14T12:42:34.653    16.11385     12
   apple  | 2009.12.27T17:02:11.518    68.15909     97
  samsung | 2015.04.06T10:03:36.738    48.35        99
  samsung | 2015.04.06T10:03:47.540    48.35        99
  samsung | 2015.04.06T10:04:44.844    48.35        99

系统命令

系统命令控制q环境。 它们的形式如下 −

\cmd [p]       where p may be optional

下面讨论了一些流行的系统命令 −

\a [ namespace] – 列出给定命名空间中的表

q)/Tables in default namespace

q)\a
,`trade

q)\a .o         / .o 命名空间中的表。
,`TI

\b – 查看依赖项

q)/ views/dependencies

q)a:: x+y      / global assingment

q)b:: x+1

q)\b
`s#`a`b

\B – 待处理的视图/依赖项

q)/ Pending views/dependencies

q)a::x+1     / a depends on x

q)\B         / the dependency is pending
' / the dependency is pending

q)\B
`s#`a`b

q)\b
`s#`a`b

q)b
29

q)a
29

q)\B
`symbol$()

\cd – 更改目录

q)/change directory, \cd [name]

q)\cd
"C:\Users\myaccount-raj"

q)\cd ../new-account

q)\cd
"C:\Users\new-account"

\d – 设置当前命名空间

q)/ sets current namespace \d [namespace]

q)\d             /default namespace
'

q)\d .o          /change to .o

q.o)\d
`.o

q.o)\d .         / return to default

q)key `          /lists namespaces other than .z
`q`Q`h`j`o

q)\d .john       /change to non-existent namespace

q.john)\d
`.john

q.john)\d .

q)\d
`.

\l – 从数据库加载文件或目录

q)/ Load file or directory, \l

q)\l test2.q / 加载存储在当前路径中的test2.q。

   ric      |     date      ex      openP    closeP    MCap
----------- | -------------------------------------------------
 JPMORGAN   | 2008.05.23  SENSEX  18.30185  17.16319  17876
   HSBC     | 2002.05.21  NIFTY   2.696749  16.58846  26559
 JPMORGAN   | 2006.09.07  NIFTY   14.15219  20.05624  14557
   HSBC     | 2010.10.11  SENSEX  7.394497  25.45859  29366
 JPMORGAN   | 2007.10.02  SENSEX  1.558085  25.61478  20390
 
   ric     |    date       ex      openP     closeP    MCap
---------- | ------------------------------------------------
  INFOSYS  | 2003.10.30    DOW    21.2342   7.565652   2375
 RELIANCE  | 2004.08.12    DOW    12.34132  17.68381   4201
   SBIN    | 2008.02.14    DOW    1.830857  9.006485   15465
  INFOSYS  | 2009.06.11  HENSENG  19.47664  12.05208   11143
   SBIN    | 2010.07.05    DOW    18.55637  10.54082   15873

\p – 端口号

q)/ assign port number, \p

q)\p
5001i

q)\p 8888

q)\p
8888i

\ - 从 q 控制台退出

\ - exit
Exit form q.