成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

7. Q語言學習之路—數(shù)據(jù)轉(zhuǎn)換

antz / 468人閱讀

摘要:可以通過命令來查看全局變量和對應(yīng)的值,也可以通過操作符來查看轉(zhuǎn)換使用操作符,右邊的運算元是原始值,而左邊的運算元是目標類型。從中解析數(shù)據(jù)使用大寫的目標類型作為左運算元,作為右運算元。

1. 類型

1. 基礎(chǔ)數(shù)據(jù)類型

2. type操作符
type操作符返回一個short,并且如果對象是一個atom,則返回負數(shù);是一個list則返回正數(shù)。

q)type 42
-7h
q)type 10 20 30
7h
q)type 98.6
-9h
q)type 1.1 2.2 3.3
9h
q)type `a
-11h
q)type `a`b`c
11h
q)type "z"
-10h
q)type "abc"
10h

任何常規(guī)列表(general list)的類型都是0h。

q)type (42h; 42i; 42j)
0h
q)type (1 2 3; 10 20 30)
0h
q)type ()
0h

任何字典(包括鍵表)的類型,都是99h。

q)type (`a`b`c!10 20 30)
99h
q)type ([k:`a`b`c] v:10 20 30)
99h

任何表的類型都是98h。

q)type ([] c1:`a`b`c; c2:10 20 30)
98h

3. 變量的類型
q語言是動態(tài)類型語言,所以變量的類型也會隨著其被賦的值而改變。

全局變量會被儲存在一個一般的q字典中??梢酝ㄟ^命令get `. 來查看全局變量和對應(yīng)的值,也可以通過操作符value來查看

q)value `.
q)a:42
q)value `.
a| 42
q)f:{x*x}
q)value `.
a| 42
f| {x*x}
..
2. Cast

轉(zhuǎn)換使用dyadic操作符$,右邊的運算元是原始值,而左邊的運算元是目標類型。有三種方式指定目標類型:

數(shù)值的short類型

char類型值

類型的symbol名稱

1. Casts that Widen
因為目標類型比原始類型要寬,所以在這種情況下沒有信息丟失。

q)7h$42i / int to long
42
q)6h$42 / long to int
42i
q)9h$42 / long to float
42f
q)"j"$42i
42
q)"i"$42
42i
q)"f"$42
42f

more readable:

q)`int$42
42i
q)`long$42i
42
q)`float$42
42f

2. 不同類型之間的轉(zhuǎn)換
char類型的underlying value是ASCII碼,所以我們可以將char與integer互相轉(zhuǎn)換。

q)`char$42
"*"
q)`long$"
"
10

同樣,也可以將日期與integer互相轉(zhuǎn)換

q)`date$0
2000.01.01
q)`int$2001.01.01 / millennium occurred on leap year
366i

3. Casts that Narrow

q)`long$12.345
12
q)`short$123456789
32767h

將數(shù)值類型轉(zhuǎn)換為boolean類型,任何0值都是0b,其余的值都是1b。

q)`boolean$0
0b
q)`boolean$0.0
0b
q)`boolean$123
1b
q)`boolean$-12.345
1b

也可以從復雜類型中提取成分

q)`date$2015.01.02D10:20:30.123456789
2015.01.02
q)`year$2015.01.02
2015i
q)`month$2015.01.02
2015.01m
q)`mm$2015.01.02
1i
q)`dd$2015.01.02
2i
q)`hh$10:20:30.123456789
10i
q)`minute$10:20:30.123456789
10:20
q)`uu$10:20:30.123456789
20i
q)`second$10:20:30.123456789
10:20:30
q)`ss$10:20:30.123456789
30i

4. Casting Integral Inf

q)`int$0Wh
32767i
q)`int$-0Wh
-32767i
q)`long$0Wi
2147483647
q)`long$-0Wi
-2147483647

5. 強制類型
回想在向一個簡單列表中賦值的時候需要嚴格match列表的類型

q)L:10 20 30 40
q)L[1]:42h
"type
q)L,:43h
"type

這種情況可以通過強制類型轉(zhuǎn)換來實現(xiàn):

q)L[1]:(type L)$42h
q)L,:(type L)$43h

6. Cast is Atomic
cast對其右運算元是atomic的:

q)"i"$10 20 30
10 20 30i
q)`float$(42j; 42i; 42j)
42 42 42f

cast對其左運算元也是atomic的:

q)`short`int`long$42
42h
42i
42
q)"ijf"$98.6
99i
99
98.6

Cast對左右運算元同步的atomic:

q)"ijf"$10 20 30
10i
20
30f
3. 數(shù)據(jù)和文本的轉(zhuǎn)換

1. 數(shù)據(jù)轉(zhuǎn)換為string
使用函數(shù)string可以將任何q元素轉(zhuǎn)換為一個合適的文本表示。string的一些特征:

轉(zhuǎn)換結(jié)果是一個char的列表,不會是單個的char。

轉(zhuǎn)換結(jié)果不會包含任何q類型提示符或者其它裝飾符。

string作用在一個真正的string(list of char)上可能不會得到你想要的結(jié)果

q)string 42
"42"
q)string 4
,"4"
q)string 42i
"42"
q)a:2.0
q)string a
,"2"
q)f:{x*x}
q)string f
"{x*x}"

string是偽atomic的,它會作用在運算元的每個atom數(shù)據(jù)上,但對每個atom元素的運算結(jié)果都返回一個list

q)string 1 2 3
,"1"
,"2"
,"3"
q)string "string"
,"s"
,"t"
,"r"
,"i"
,"n"
,"g"
q)string (1 2 3; 10 20 30)
,"1" ,"2" ,"3"
"10" "20" "30"

2. 從String構(gòu)建Symbol
從string去創(chuàng)建symbol是一個foolproof的做法。 但是也是唯一的去創(chuàng)建帶有空格或者其它特殊符號symbol的方法。其轉(zhuǎn)換使用 `$ 。

q)`$"abc"
`abc
q
q)`$"Hello World"
`Hello World

注意帶有轉(zhuǎn)義符的轉(zhuǎn)換:

q)`$"Zaphod "Z""
`Zaphod "Z"
q)`$"Zaphod 
"
`Zaphod

Note: 左右去空格。

q)string `$" abc "
"abc"

3. 從String中解析數(shù)據(jù)
使用大寫的目標類型作為左運算元,string作為右運算元。

q)"J"$"42"
42
q)"F"$"42"
42f
q)"F"$"42.0"
42f
q)"I"$"42.0"
0Ni
q)"I"$" "
0Ni

日期轉(zhuǎn)換:

q)"D"$"12.31.2014"
2014.12.31
q)"D"$"12-31-2014"
2014.12.31
q)"D"$"12/31/2014"
2014.12.31
q)"D"$"12/1/2014"
2014.12.31
q)"D"$"2014/12/31"
2014.12.31

可以從字符串中解析一個函數(shù),使用內(nèi)置的函數(shù)value或者parse

q)value "{x*x}"
{x*x}
q)parse "{x*x}"
{x*x}
4. 創(chuàng)建帶類型的空list

空的list的類型是0h,但是當append一個元素之后,得到的sigleton列表就是該元素類型的簡單列表。

q)L:()
q)type L
0h
q)L,:42
q)type L
7h

如果想規(guī)定空list的類型,可以使用類似如下語法

q)c1:`float$()
q)c1,:42
"type
q)c1:98.6

同樣,下面的操作也能產(chǎn)生帶類型的空list

q)0#0
`long$()
q)0#0.0
`float$()
q)0#`
`symbol$()
5. Enumerations

1. 傳統(tǒng)的枚舉

In traditional languages, an enumerated type is a way of associating a series of names with a corresponding set of integral values.

2. 數(shù)據(jù)標準化

q)u:`g`aapl`msft`ibm
q)v:1000000?u
q)k:u?v
q)k
2 1 1 3 3 1 0 0 0 3 0 2 2 1 2 3 1 0 1 1 2 1 2 0 2 1 1 0 1 1 3 0..

上述關(guān)系滿足映射:v=u*k,使用u和索引k來儲存v可以大大節(jié)省儲存空間,并且提高查找效率。

3. Enumerating Symbols
將一個symbols列表轉(zhuǎn)換為對應(yīng)的索引列表的操作稱為q中的枚舉。它以$(又一重載)作為運算符,使用unique的symbols變量作為左運算元,在變量域的symbol的列表作為右運算元。

q)`u$v
`u$`msft`aapl`aapl`ibm`ibm`aapl`g`g`g`ibm`g`msft`msft`aapl`msft..

可以通過強制轉(zhuǎn)換為int來恢復上述的索引結(jié)果

q)ev:`u$v
q)`int$ev
2 1 1 3 3 1 0 0 0 3 0 2 2 1 2 3 1 0 1 1 2 1 2 0 2 1 1 0 1 1 3 ..

枚舉symbol的基本形式為: `u$v
其中u是unique symbol的簡單列表,v是在u中出現(xiàn)的atom或者對應(yīng)的列表。我們稱u為枚舉的域(domain),投影 `u$ 為在u上的枚舉。 應(yīng)用枚舉 `u$ 在向量v上可以得到索引列表k。

4. 使用枚舉的symbol

q)sym:`g`aapl`msft`ibm
q)v:1000000?sym
q)ev:`sym$v

枚舉的ev可以在幾乎所有的場景中代替v

q)v[3]
`aapl
q)ev[3]
`u$`aapl
q)v[3]:`ibm
q)ev[3]:`ibm
q)v=`ibm
000100010010011101000010010100000000100100000001000000001100001001011..
q)ev=`ibm
000100010010011101000010010100000000100100000001000000001100001001011..
q)where v=`aapl
4 5 19 20 21 31 33 34 41 42 43 49 58 59 61 74 81 83 90 94 95 98 114..
q)where ev=`aapl
4 5 19 20 21 31 33 34 41 42 43 49 58 59 61 74 81 83 90 94 95 98 114..
q)v?`aapl
4
q)ev?`aapl
4
q)v in `ibm`aapl
000111010010011101011110010100010110100101110001010000001111011001011..
q)ev in `ibm`aapl
000111010010011101011110010100010110100101110001010000001111011001011..

盡管枚舉和原始列表是item-wise的相等,但是他們并不identical(不match)

q)all v=ev
1b
q)v~ev
0b

5. 枚舉的類型
每一個枚舉都會被賦予一個新的數(shù)值類的數(shù)據(jù)類型,從20h開始。20h是留給系統(tǒng)的枚舉域的,你自己定義的枚舉類型則從21h開始,并且逐個增加。類型的正號為simple list,負號為atom的性質(zhì)依舊保持。

q)sym1:`g`aapl`msft`ibm
q)type `sym1$1000000?sym1
21h
q)sym2:`a`b`c
q)type `sym2$`c
-22h

從不同域創(chuàng)建的枚舉是不同的,即使他們的組成都相同

q)sym1:`c`b`a
q)sym2:`c`b`a
q)ev1:`sym1$`a`b`a`c`a
q)ev2:`sym2$`a`b`a`c`a
q)ev1=ev2
11111b
q)ev1~ev2
0b

6. 更新一個枚舉的列表
一個對u簡單的改變,可以改變枚舉v中對應(yīng)的所有內(nèi)容

q)sym:`g`aapl`msft`ibm
q)ev:`sym$`g`g`msft`ibm`aapl`aapl`msft`ibm`msft`g`ibm`g..
q)sym[0]:`twit
q)sym
`twit`aapl`msft`ibm
q)ev
`sym$`twit`twit`msft`ibm`aapl`aapl`msft`ibm`msft`twit`ibm`twit..

相反,則需要對v的每一處進行更新

q)v
`g`g`msft`ibm`aapl`aapl`msft`ibm`msft`g`ibm`g…
q)@[v; where v=`g; :; `twit]

7. 動態(tài)向枚舉域添加
直接向枚舉append一個域中沒出現(xiàn)過的元素時會報錯

q)sym:`g`aapl`msft`ibm
q)v:1000000?sym
q)ev:`sym$v
q)v,:`twtr
q)ev,:`twtr
"cast

正確做法是這個新值必須要先添加進域中

q)sym,:`twtr
q)ev,:`twtr

如果提前不知道域中的全部值,可以使用?(又一重載)來創(chuàng)建一個動態(tài)的域。?的語法與枚舉重載符$的語法一樣。unique的symbol list的名字作為左運算元,源symbol列表作為右運算元。

q)sym:()
q)`sym$`g
"cast
q)`sym?`g
`sym$`g
q)sym
,`g
q)`sym?`ibm`aapl
`sym$`ibm`aapl
q)sym
`g`ibm`aapl
q)`sym?`g`msft
`sym$`g`msft
q)sym
`g`ibm`aapl`msft

8. 恢復一個枚舉
可以通過value來恢復一個枚舉對應(yīng)的源symbol列表

q)sym:`g`aapl`msft`ibm
q)v:1000000?sym
q)ev:`sym$v
q)value ev
`aapl`g`msft`msft`ibm`msft`msft`msft`msft`msft`g`ibm`ibm`ibm..
q)v~value ev
1b

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17989.html

相關(guān)文章

  • 2. Q語言學習之路—基本數(shù)據(jù)類型: Atoms

    摘要:概述所有的數(shù)據(jù)都是通過最小單位構(gòu)造。語言中大部分數(shù)據(jù)類型與傳統(tǒng)語言類似,但是多出了和相關(guān)的類型,用來加速時間序列運算。適用的運算符僅有數(shù)據(jù)中共有兩種類型數(shù)據(jù),更類似于中的和。其表示值為從千禧年計數(shù)的納秒數(shù),之前為負數(shù),之后為正數(shù)。 概述 所有的數(shù)據(jù)都是通過最小單位atom構(gòu)造。q語言中大部分數(shù)據(jù)類型與傳統(tǒng)語言類似,但是多出了date和time相關(guān)的類型,用來加速時間序列運算。下表給出了...

    李濤 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<