Julia-lang
新興的Julia語言,Julia 一開始就是為高效能而設計的。 Julia 程式通過 LLVM 編譯成高效的多平臺機器碼。
Julia中文社群: https://cn.julialang.org/
Julia的誕生: 一群擁有各種語言豐富程式設計經驗的Matlab高階使用者,對現有的科學計算程式設計工具感到不滿——這些軟體對自己專長的領域表現得非常棒,但在其它領域卻非常糟糕。他們想要的是一個開源的軟體,它要像C語言一般快速而又擁有如同Ruby的動態性;要具有Lisp般真正的同像性而又有Matlab般熟悉的數學記號;要像Python般通用、像R般在統計分析上得心應手、像Perl般自然地處理字串、像Matlab般具有強大的線性代數運算能力、像shell般膠水語言的能力,易於學習而又不讓真正的黑客感到無聊;它應該是互動式的,同時又是編譯型的JIT(Just-In-Time)。
-
julia與傳統動態語言最重要的區別是:
- 核心語言很小:標準庫是使用Julia下的,包括整數運算這樣的基礎運算
- 豐富的基礎型別:既可用於定義和描述物件,也可用於做可選的資料標註
- 通過多重派發,可根據型別的不同,來呼叫同名函式的不同實現
- 為了不同的引數型別,自動生成高效、專用的程式碼
- 接近C語言的效能
Julia 變數
Julia語言中,變數是與某個值關聯的名字。你可以用它來儲存一個值
x = 10
x + 1
x = "hello world"
Julia提供了非常靈活的變數命名的策略。變數名是大小寫敏感的,且不包含語義,意思就是說,Julia會根據變數的名字區別對待
julia> x = 1.0 1.0
julia> y = -3 -3
julia> Z = "My string" "My string"
julia> customary_phrase = "Hello world!" "Hello world!"
julia> UniversalDeclarationOfHumanRightsStart = " 人人生而自由,在尊嚴和權利上一律平等。"
- 變數的命名
變數名字必須以英文字母開頭。
命名規範:變數名字採用小寫
用下劃線分割命名中的單詞,不鼓勵使用
Type Module型別的名字使用大寫字元開頭,並且大寫字母而不是用下劃線分割單詞
函式function 和 巨集macro的名字使用小寫,不使用下劃線
會對輸入引數進行更改的函式要使用歎號!結尾
- 數值轉換
Julia支援三種數值轉換
- T(x) 和convert(T, x) 會把x轉換成T型別
- 如果T是浮點型別,轉換的結果就是最近的可表示值,可能會是正無窮大。
- 如果T為整數型別,當x不能由 T 型別表示時,會丟擲異常InexactError
字元
char型別的值代表單個字元:他只是帶有特殊文字表示法和適當算術行為的32位原始型別,不能轉換為代表Unicode程式碼的數值,
- 字元拼接
text = string("Hello", "World")
println(text)
>>> HelloWorld
# 在Julia中字串拼接的+號變成了*號
println("test" * "123")
- 計算長度
# 計算字串的長度
println(length.(text))
>>> 10
- 引用變數進行字元拼接
# 引用變數
println("$text" * "123")
>>> HelloWorld123
- 三引號字串字面量
str = """
又來到某個港口
我不是一定要你回來
"""
println("xix :$str")
- 常見的操作
# findfirst 獲取字串中是否有相應的字元 如果有返回第一個匹配到的字元下標
flag = findfirst(isequal('0'), "OOOOOOOOOO0OOOOOOO0oo")
println(flag)
# findfirst 獲取字串中是否有相應的字元 如果有返回最後一個匹配到的字元下標
flag = findlast(isequal('0'), "OOOOOOOOOO0OOOOOOO0oo")
println(flag)
# findnext 字串偏移 之後進行匹配 偏移到從第15個開始
flag = findnext(isequal('0'), "OOOOOOOOOO0OOOOOOO0oo", 15)
println(flag)
# 判斷字元是否存在在字串中 返回bool值
flag = occursin("123", "1233123133")
println(flag)
# 切片拆分 以, 間隔
join(["apples", "bananas", "pineapples"], ", ", " and ") "apples, bananas and pineapples"
函式
在Julia中,函式是將一個引數值元祖對映到返回值的物件。Julia的函式不是說純粹的數學函式,在某種意義上,函式可以改變並受程式的全域性狀態的影響。在Julia中定義函式的基本語法是:
- 函式基本語法
function f(x, y)
return x + y
end
println(f(1,2))
# 函式還可以進行縮寫 簡潔語法
foo(x, y) = x * y
println(foo(2,3))
- 函式指定返回型別
function bar(x, y)::Int64
return x * y
end
println(
bar(3, 5))
- 元祖
Julia有一個和函式引數與返回值密切相關的內建資料結構叫元祖。一個元祖是一個固定的長度的容器,可以容納任何值。但是不可以被修改
yuanzu = (1,2,2,3,3)
println(typeof(yuanzu))
>>> NTuple{5, Int64}
- 具名元祖
元祖的元素可以有名字。
x = (a=2, b=2^2)
println(x.a)
# 或者 x[1]
>>> 2
- 多返回值
Julia中一個函式可以返回多個值 ,使用元祖來表示
function foo(a, b)
return a + b, a * b
end
println(foo(2,3))
>>>(5, 6)
- 變參函式
function bar(a, b, x...)
return a, b, x
end
println(bar(1, 2, 3,3,4,4))
>>>(1, 2, (3, 3, 4, 4))
- 日期內建函式
# 匯入日期庫
using Dates
println(Date(2021, 1, 10))
# >>> 2021-01-10
println(Date(2021,2))
# >>> 2021-02-01
println(Date(2021))
# >>> 2021-01-01
- 關鍵字引數
# 關鍵字引數
function plot(a, b, c=2)
println("$a, $b, $c")
end
plot(6, 8, 1)
>>> 6, 8, 1
plot(6, 8)
>>> 6, 8, 2
- 函式引數中的Do結構
map([1, 2, 3]) do x
if x < 0&& iseven(x) # iseven功能是判斷這個引數是否被2整除
return 0
elseif x == 0
return 1
else
return x
end
end
# 程式會將map中的值遍歷賦值為x
- Julia讀寫檔案操作
open("test.txt", "w") do io
write(io, "123")
end
# convert("需要轉換的型別", 資料data) convert可以將資料轉換成相關的資料
open("test.txt", "r") do io
line = readline(io)
println(line)
end
# 迴圈讀取字串 一定要記得if for等語句需要使用end結束
open("test.txt", "r") do io
line = readline(io)
println(line)
for i in line
println(i)
end
end
Julia與Python的區別
- 切片 Julia 索引從1開始 Python從0開始
- Python切片左開右閉 julia 左右全閉
- Julia不支援負數索引
- Julia的條件語句 使用end結束 Python是以縮排結束
Julia的變數作用域
作用於結構
結構 | 作用於型別 | Allowed within |
---|---|---|
module , baremodule | 全域性 | 全域性 |
struct 結構體 | local(soft) | 全域性 |
for, while ,try | local(soft) | 全域性或區域性 |
macro | local(hard) | 全域性 |
let ,functions, comprehensions, generators | local(hard) | 全域性或區域性 |
持續更新ing...