以前大富彩票搭建 dsluntan.com Q:3393756370 VX:17061863513聽說過Julia,不過那時候官網還處于時不時當機狀态,最近Julia釋出了1.0 released版本到處都是它的資訊,官網良心自帶簡體中文,趁着熱度我也來試試,順便聊記一二。
關于Julia
Julia源于使用者需求。使用者希望有一門開源的腳本程式設計語言,有C的高性能,Ruby的靈活,Lisp的宏,Matlab那樣親切的數學表達式符号。它既可以像Python一樣作為通用程式設計語言,也可以像R一樣用于統計分析,像Perl一樣自然的處理字元串,像Matlab一樣強大的線性代數,像Shell一樣的膠着其他程式。
簡而言之,它什麼都想,什麼都像…
官方給出的Julia有以下特性(省略了一些):
•快速:Julia可以通過LLVM而跨平台被編譯成高效的本地代碼。
•通用:Julia使用多分派作為程式設計範式,使其很容易表達面向對象和函數式程式設計範式。
•動态:Julia是動态類型的,與腳本語言類似
•數值計算:Julia擅長于數值計算,它的文法适用于數學計算,支援多種數值類型,并且支援并行計算。
•可選的類型标注:Julia擁有豐富的資料類型描述
•可組合:Julia的包可以很自然的組合運作。機關數量的矩陣或資料表一列中的貨币和顔色可以一起組合使用并且擁有良好的性能。
變量和字元串
Julia内建支援大數運算,不需要調用函數。同時也支援unicode
julia> 83275689127389671289376897238976*895623897689127389068912376897289/3487689234768972893+28358923785-23895728937
-3.4911515696355016e18
julia> unicode_var = “你好,中國”
“你好,中國”
julia> ‘g’
‘g’: ASCII/Unicode U+0067 (category Ll: Letter, lowercase)
julia> λ = “special_variable_name”
“special_variable_name”
julia> λ = “redefine its value since it’s a variable”
“redefine its value since it’s a variable”
字元串會處理轉義字元,如果想保留它們需要在前面加上raw
julia> println(“hello\nworld”)
hello
world
julia> println(raw”hello\nworld”)
hello\nworld
還可以通過下标運算取到對應字元,最後一個字元用end指代,這但是下标居然不是從0開始的!
julia> welcome[0]
ERROR: BoundsError: attempt to access “hello world”
at index [0]
julia> welcome[1]
‘h’: ASCII/Unicode U+0068 (category Ll: Letter, lowercase)
julia> welcome[end]
‘d’: ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
還可以使用切片操作welcome[2:4]擷取子字元串ello。
拼接字元串需要用string(str1,str2.,..)或者*,不能使用+。
如果要對字元串進行内部求值(官方術語interpolation),需要使用 (xx)的文法:julia>“3+2−5= ( x x ) 的 語 法 : j u l i a > “ 3 + 2 − 5 = (3+2-5)”
“3+2-5=0”
julia> name = “yang”
“yang”
julia> “hello, $name”
“hello, yang”
Julia目标稱希望有大富彩票搭建 dsluntan.com Q:3393756370 VX:17061863513Perl一樣強大的字元串處理能力,那麼内建正規表達式算是言出必行的表現。它的正規表達式是Perl相容的,由PCRE提供,下面示例來自官方文檔:
julia> r”^\s*(?:#|)”
r”^\s*(?:#| )” r”^\s*(?:#| )”
julia> typeof(ans)
Regex
julia> m = match(r”(a|b)(c)?(d)”, “acd”)
RegexMatch(“acd”, 1=”a”, 2=”c”, 3=”d”)
julia> m.match
“acd”
julia> m.captures
3-element Array{Union{Nothing, SubString{String}},1}:
“a”
“c”
“d”
常量
常量通過const關鍵字指定,不過常量還能重定義,REPL隻顯示warning并不阻止這樣的做法,隻有當重定義不同類型值的時候才會提示Error。文檔強烈不建議重定義常量值。
julia> const a,b = 2,3
(2, 3)
julia> const a,b = 3,2
WARNING: redefining constant a
WARNING: redefining constant b
(3, 2)
julia> a,b
(3, 2)
julia> const a,b = 3.0,2
ERROR: invalid redefinition of constant a
類型
整型和浮點類型值不依賴于平台,有明确的範圍:
Type
Signed?
Number of bits
Smallest value
Largest value
Int8
✓
8
-2^7
2^7 - 1
UInt8
8
2^8 - 1
Int16
✓
16
-2^15
2^15 - 1
UInt16
16
2^16 - 1
Int32
✓
32
-2^31
2^31 - 1
UInt32
32
2^32 - 1
Int64
✓
64
-2^63
2^63 - 1
UInt64
64
2^64 - 1
Int128
✓
128
-2^127
2^127 - 1
UInt128
128
2^128 - 1
Bool
N/A
8
false (0)
true (1)
Type
Precision
Number of bits
Float16
half
16
Float32
single
32
Float64
double
64
變量的類型可以通過typeof()擷取,大小可以使用sizeof()擷取,兩者可以參數可以是值也可以是資料類型。
julia> typeof([1,2,4])
Array{Int64,1}
julia> typeof(0xcafebabe)
UInt32
julia> λ = “special_variable_name”
“special_variable_name”
julia> typeof(λ)
String
julia> typeof(2e-2)
Float64
julia> typeof(Int)
DataType
julia> typeof(String)
DataType
julia> typeof(true)
Bool julia> sizeof(2e-2)
8
julia> sizeof(Float16)
2
julia> sizeof(Int16(1024))
2
julia> sizeof(“hello”)
5
julia> sizeof([1,2,3])
24
運算
Julia主要用于數值優化大富彩票搭建 dsluntan.com Q:3393756370 VX:17061863513,科學計算等,表達式貼近數學符号。除了日常四則運算外還有平方運算2^10,以及一些新奇的運算符:
julia> √4
2.0
julia> √√16
2.0
julia> typeof(√) #看起來開根号是個sqrt的文法糖
typeof(sqrt)
julia> sqrt(4)
2.0
julia> 2(3+2)
10
julia> x=1
julia> x(x+1)#x放到前面會被解析為可調用對象導緻出錯
ERROR: MethodError: objects of type Int64 are not callable
julia> (x+1)x
2
運算符很多,官方文檔已有總結,這裡直接複制翻譯一下:
算術運算符
名稱
描述
+x
unary plus
恒等運算
-x
unary minus
求相反數
x + y
binary plus
加法
x - y
binary minus
減法
x * y
times
乘法
x / y
divide
除法
x ÷ y
integer divide
整數除法,結果保留整數
x \ y
inverse divide
等價于 y / x
x ^ y
power
平方
x % y
remainder
求餘
!x
negation
!true==false,反之亦然。 隻用于bool
位運算符
Name
~x
非
x & y
與
x | y
或
x ⊻ y
異或(⊻這個符号打出來不容易…)
x >>> y
邏輯 右移
x >> y
算術 右移
x << y
邏輯/算術左移 left
數值比較運算符
Name
==
相等
!=, ≠
不相等
<
小于
<=, ≤
小于等于
>
大于
=, ≥
大于等于
另外Julia有一個特性,可以進行鍊式比較
julia> 1 < x < 6
true
不用像大多數語言x>1 && x<6那樣手動邏輯組合。
之前介紹說Julia希望有像Matlab一樣強大的線性代數處理表達能力,當然少不了線性代數運算了。可以使用.Operator進行向量運算
julia> [1,2,3].^ 2
3-element Array{Int64,1}:
1
4
9
julia> [1,2,3].+ 2
3-element Array{Int64,1}:
3
4
5
julia> [1,2,3].÷ 2
3-element Array{Int64,1}:
1
1
最後Julia還支援分數大富彩票搭建 dsluntan.com Q:3393756370 VX:17061863513和複數表示,這裡就不贅述了,感興趣的請參見Complex and Rational Numbers
函數和方法
Julia認為函數是一個關聯實參tuple和一個傳回值的對象。
第一種形式是完整的函數定義:
function add(a,b)
x = a+b
#return x 如果沒有return預設傳回最後一個表達式求得的值
end
第二種是指派形式的函數定義
add2(a,b) = a+b
函數在Julia被視作一等公民,可以指派給變量,可以做參數,也可以傳回。
julia> apply = function(func,arg)
func(arg)
end
269 (generic function with 1 method)
julia> apply(!,false)
true
上面例子中定義了一個匿名函數,即lambda,然後函數!作為參數傳遞。lambda還可以arg -> expr_body進行定義:
julia> lambda = val ->( “ val"∗" v a l " ∗ " val”,”$val”,”…”)
317 (generic function with 1 method)
julia> lambda(“wow”)
(“wowwow”, “wow”, “…”)
注意lambda函數體的()表示tuple,它可以讓函數傳回多個值。
Julia支援指定參數類型,預設值以及關鍵字形參
julia> misc = function(a::Int,b::Int=2;flag=true)
a+1,b+2,!flag
end
341 (generic function with 2 methods)
julia> misc(1,2,flag=false)
(2, 4, true)
這個小标題是函數和方法,那麼方法呢?其實在其他很多語言中,方法是面向對象領域的函數的别稱。這裡Julia給了另一種定義:
It is common for the same conceptual function or operation to be implemented quite differently for different types of arguments: adding two integers is very different from adding two floating-point numbers, both of which are distinct from adding an integer to a floating-point number. Despite their implementation differences, these operations all fall under the general concept of “addition”. Accordingly, in Julia, these behaviors all belong to a single object: the + function. To facilitate using many different implementations of the same concept smoothly, functions need not be defined all at once, but can rather be defined piecewise by providing specific behaviors for certain combinations of argument types and counts. A definition of one possible behavior for a function is called a method.
方法是函數更具體的表現形式。如果學過C++那完全可以類比,函數就是模闆函數,方法就是特化的函數模闆。
控制流
Julia的控制流和其他進階語言基本類似,這裡就直接給例子了。
1.複合表達式
julia> z = begin
a=1
b=2
(a+b,a/b)
end
julia> z
(3, 0.5) 1.條件運算
#julia也提供 ?: 三元運算符
if flag && a