本備忘清單旨在快速理解 Julia 一份簡單而粗略的語言概覽,供您參考。
Julia 是一種為科學(xué)計算而生的,開源、多平臺、高性能的高級編程語言Julia 有一個基于 LLVM 的 JIT 編譯器,這讓使用者無需編寫底層的代碼也能擁有像 C 與 FORTRAN 那樣的性能。因為代碼在運(yùn)行中編譯,你可以在 shell 或 REPL 中運(yùn)行代碼,這也是一種推薦的工作流程Julia 是動態(tài)類型的。并且提供了為并行計算和分布式運(yùn)算設(shè)計的多重派發(fā)機(jī)制Julia 自帶包管理器Julia 有許多內(nèi)置的數(shù)學(xué)函數(shù),包括特殊函數(shù) (例如:Gamma 函數(shù))。并且支持開箱即用的復(fù)數(shù)運(yùn)算Julia 允許你通過類似 Lisp 的宏來自動生成代碼Julia 誕生于 2012 年answer = 42
x, y, z = 1, [1:10; ], "A string"
x, y = y, x # 交換 x, y
const DATE_OF_BIRTH = 2012
i = 1 # 這是一行注釋
# 多行注釋
#= 這是另一行注釋 =#
x = y = z = 1 # 從右向左
0 < x < 3 # true
5 < x != y < 5 # false
function add_one(i)
return i + 1
end
\delta + [Tab] # δ
| :- | :- |
|---|---|
| 基本算數(shù)運(yùn)算 | +,-,*,/ |
| 冪運(yùn)算 | 2^3 => 8 |
| 除法 | 3/12 => 0.25 |
| 反向除法 | 7\3 == 3/7 => true |
| 取余 | x % y 或 rem(x,y) |
| 取反 | !true => false |
| 等于 | a == b |
| 不等于 | a != b 或 a ≠ b |
| 小于與大于 | < 與 > |
| 小于等于 | <= 或 ≤ |
| 大于等于 | >= 或 ≥ |
| 逐元素運(yùn)算(點(diǎn)運(yùn)算) | [1, 2, 3] .+ [1, 2, 3] == [2, 4, 6] => true[1, 2, 3] .* [1, 2, 3] == [1, 4, 9] => true |
| 檢測非數(shù)值(NaN) | isnan(NaN) => true 而不是 NaN == NaN => false |
| 三元運(yùn)算符 | a == b ? "Equal" : "Not equal" |
| 短路 AND 和 OR 表達(dá)式 | a && b 和 a || b |
| 對象等價 | a === b |
| :- | :- |
|---|---|
| 上一次運(yùn)算的結(jié)果 | ans |
| 中斷命令執(zhí)行 | Ctrl + C |
| 清屏 | Ctrl + L |
| 運(yùn)行程序文件 | include("filename.jl") |
| 查找 func 相關(guān)的幫助 | ?func |
| 查找 func 的所有定義 | apropos("func") |
| 命令行模式 | ; |
| 包管理模式 | ] |
| 幫助模式 | ? |
| 查找特殊符號輸入方式 | ?☆ # "☆" can be typed by \bigwhitestar<tab> |
| 退出特殊模式,返回到 REPL | 在空行上按 Backspace |
| 退出 REPL | exit() 或 Ctrl + D |
| :- | :- |
|---|---|
| 空值(Null) | nothing |
| 缺失數(shù)據(jù) | missing |
| 浮點(diǎn)數(shù)的非數(shù)值 | NaN |
| 濾除缺失值 | collect(skipmissing([1, 2, missing])) == [1,2] |
| 替換缺失值 | collect((df[:col], 1)) |
| 檢查是否有缺失值 | ismissing(x) 而不是 x == missing |
| :- | :- |
|---|---|
| 類型 | typeof(name) |
| 類型檢查 | isa(name, TypeName) |
| 列出子類型 | subtypes(TypeName) |
| 列出超類型 | supertype(TypeName) |
| 函數(shù)方法 | methods(func) |
| 即時編譯的字節(jié)碼 | code_llvm(expr) |
| 匯編代碼 | code_native(expr) |
| :- | :- |
|---|---|
| 設(shè)置隨機(jī)數(shù)種子 | Random.seed!(seed) |
| 產(chǎn)生隨機(jī)數(shù) | rand() # 均勻分布 [0,1)randn() # 正態(tài)分布 (-Inf, Inf) |
| 產(chǎn)生特定分布的隨機(jī)數(shù) | using Distributionsmy_dist = Bernoulli(0.2) 舉例rand(my_dist) |
| 以概率 p 從 A 中進(jìn)行伯努利抽樣 | randsubseq(A, p) |
| 隨機(jī)重排 A 中的元素 | shuffle(A) |
許多隨機(jī)數(shù)函數(shù)都需要 using Random
# 拋出異常 SomeExcep
throw(SomeExcep())
# 再次引發(fā)當(dāng)前的異常
rethrow()
定義新異常 NewExcep
struct NewExcep <: Exception
v::String
end
Base.showerror(io::IO, e::NewExcep) = print(io, "A problem with $(e.v)!")
throw(NewExcep("x"))
# 拋出帶文本的異常
error(msg)
異常處理流程
try
# 進(jìn)行一些可能會失敗的操作
catch ex
if isa(ex, SomeExcep)
# 處理異常 SomeExcep
elseif isa(ex, AnotherExcep)
# 處理另一個異常 AnotherExcep
else
# 處理其余的異常
end
finally
# 永遠(yuǎn)執(zhí)行這些語句
end
# 類型注釋
var::TypeName
# 類型聲明
struct Programmer
name::String
birth_year::UInt16
fave_language::AbstractString
end
# 可變類型聲明
將 struct 替換為 mutable struct
# 類型別名
const Nerd = Programmer
# 類型構(gòu)造器
methods(TypeName)
# 類型實例
me = Programmer("Ian", 1984, "Julia")
me = Nerd("Ian", 1984, "Julia")
# 子類型聲明
abstract type Bird end
struct Duck <: Bird
pond::String
end
# 參數(shù)化類型
struct Point{T <: Real}
x::T
y::T
end
p = Point{Float64}(1,2)
# 聯(lián)合類型
Union{Int, String}
# 遍歷類型層級
supertype(TypeName) 和 subtypes(TypeName)
# 默認(rèn)的超類型
Any
# 所有字段
fieldnames(TypeName)
# 所有字段類型
TypeName.types
| :- | :- |
|---|---|
| Random | rand, randn, randsubseq |
| Statistics | mean, std, cor, median, quantile |
| LinearAlgebra | I, eigvals, eigvecs, det, cholesky |
| SparseArrays | sparse, SparseVector, SparseMatrixCSC |
| Distributed | @distributed, pmap, addprocs |
| Dates | DateTime, Date |
使用引用 :( ... ) 或塊引用 quote ... end 可以創(chuàng)建一個表達(dá)式,就像 parse(str),和 Expr(:call, ...)。
x = 1
line = "1 + $x" # 一些代碼
expr = Meta.parse(line) # 生成一個 Expr 對象
typeof(expr) == Expr # true
dump(expr) # 打印生成抽象語法(AST)
eval(expr) == 2 # 對 Expr 對象求值: true
Julia 具有同像性:程序被表示為語言本身的數(shù)據(jù)結(jié)構(gòu)。 實際上 Julia 語言里的任何東西都是一個表達(dá)式 Expr。符號(Symbols)即駐留字符串 ,以冒號 : 為前綴。相對于其他類型來說,符號效率更高。它也經(jīng)常用作標(biāo)識符、字典的鍵或者數(shù)據(jù)表里的列名。符號不能進(jìn)行拼接。
讀取流
stream = stdin
for line in eachline(stream)
# 做點(diǎn)啥
end
讀取文件
open(filename) do file
for line in eachline(file)
# 做點(diǎn)啥
end
end
讀取/寫入 CSV 文件
# 讀取 CSV 文件
using CSV
data = CSV.File(filename)
# 寫入 CSV 文件
[label](koajs.md)CSV.write(filename, data)
讀取/保存 Julia 對象
using JLD
# 保存 Julia 對象
save(filename, "object_key", object, ...)
# 讀取 Julia 對象
d = load(filename) # 返回對象的字典
讀取/保存 HDF5
using HDF5
# 保存 HDF5
h5write(filename, "key", object)
# 讀取 HDF5
h5read(filename, "key")
宏允許你在程序中自動生成代碼(如:表達(dá)式)
# 定義
macro macroname(expr)
# 做點(diǎn)啥
end
使用
macroname(ex1, ex2, ...) 或 @macroname ex1, ex2, ...
內(nèi)置的宏
@assert # assert (單元測試)
@which # 查看對特定參數(shù)使用的方法/查找函數(shù)所在的模塊
@time # 運(yùn)行時間與內(nèi)存分配統(tǒng)計
@elapsed # 返回執(zhí)行用時
@allocated # 查看內(nèi)存分配
@async # 異步任務(wù)
using Test
@test # 精確相等
@test x ≈ y # 近似相等 isapprox(x, y)
using Profile
@profile # 優(yōu)化
創(chuàng)建 衛(wèi)生宏 (hygienic macros)的規(guī)則:
local 聲明本地變量eval$(esc(expr))并行計算相關(guān)的工具可以在標(biāo)準(zhǔn)庫 Distributed 里找到
# 啟動帶 N 各 worker 的 REPL
julia -p N
# 可用的 worker 數(shù)量
nprocs()
# 添加 N 個 worker
addprocs(N)
# 查看所有 worker 的 pid
for pid in workers()
println(pid)
end
# 獲得正在執(zhí)行的 worker 的 id
myid()
# 移除 worker
rmprocs(pid)
# 在特定 pid 的 worker 上運(yùn)行 f(args)
r = remotecall(f, pid, args...)
# 或:
r = @spawnat pid f(args)
...
fetch(r)
# 在特定 pid 的 worker 上運(yùn)行 f(args) (更高效)
remotecall_fetch(f, pid, args...)
# 在任意 worker 上運(yùn)行 f(args)
r = @spawn f(args) ... fetch(r)
# 在所有 worker 上運(yùn)行 f(args)
r = [@spawnat w f(args) for w in workers()] ... fetch(r)
# 讓表達(dá)式 expr 在所有 worker 上執(zhí)行
@everywhere expr
# 并行化帶規(guī)約函數(shù) red 的循環(huán)
sum = @distributed (red) for i in 1:10^6
# 進(jìn)行并行任務(wù)
end
# 將 f 用用到集合 coll 中的所有元素上
pmap(f, coll)
| :- | :- |
|---|---|
| 聲明數(shù)組 | arr = Float64[] |
| 預(yù)分配內(nèi)存 | sizehint!(arr, 10^4) |
| 訪問與賦值 | arr = Any[1,2]arr[1] = "Some text" |
| 從 m 到 n 的子數(shù)組 | arr[m:n] |
n 個 0.0 填充的數(shù)組 | zeros(n) |
n 個 1.0 填充的數(shù)組 | ones(n) |
| n 個隨機(jī) Int8 填充的數(shù)組 | rand(Int8, n) |
| 用值 val 填充數(shù)組 | fill!(arr, val) |
| 彈出最后一個元素 | pop!(arr) |
| 彈出第一個元素 | popfirst!(a) |
n 個 #undef 填充的數(shù)組 | Vector{Type}(undef,n) |
n 個從 start 到 stop 的等間距數(shù) | range(start,stop=stop,length=n) |
將值 val 作為最后一個元素壓入數(shù)組 | push!(arr, val) |
將值 val 作為第一個元素壓入數(shù)組 | pushfirst!(arr, val) |
| 刪除指定索引值的元素 | deleteat!(arr, idx) |
| 數(shù)組排序 | sort!(arr) |
將 b 連接到 a 后 | append!(a,b) |
| 轉(zhuǎn)化為字符串,并以 delim 分隔 | join(arr, delim) |
# 數(shù)組比較
a = [1:10;]
b = a # b 指向 a
a[1] = -99
a == b # true
# 復(fù)制元素(而不是地址)/深拷貝
b = copy(a)
b = deepcopy(a)
# 檢查值 val 是否在數(shù)組 arr 中
in(val, arr) # 或
val in arr
# 改變維數(shù)
reshape(1:6, 3, 2)' == [1 2 3; 4 5 6]
| :- | :- |
|---|---|
| 單位矩陣 | I |
| 定義矩陣 | M = [1 0; 0 1] |
| 矩陣維數(shù) | size(M) |
| 選出第 i 行 | M[i, :] |
| 選出第 j 列 | M[:, j] |
| 水平拼接 | M = [a b] 或 M = hcat(a, b) |
| 豎直拼接 | M = [a ; b] 或 M = vcat(a, b) |
| 矩陣轉(zhuǎn)置 | transpose(M) |
| 共軛轉(zhuǎn)置 | M' 或 adjoint(M) |
| 跡(trace) | tr(M) |
| 行列式 | det(M) |
| 秩(rank) | rank(M) |
| 特征值 | eigvals(M) |
| 特征向量 | eigvecs(M) |
| 矩陣求逆 | inv(M) |
解矩陣方程 M*x == v | M\v 比 inv(M)*v 更好 |
| 求 Moore-Penrose 偽逆 | pinv(M) |
if x < y
println("x is less than y")
elseif x > y
println("x is greater than y")
else
println("x is equal to y")
end
for i in 1:10
println(i)
end
for i in 1:10, j = 1:5
println(i*j)
end
for (idx, val) in enumerate(arr)
println("the $idx-th element is $val")
end
while bool_expr
# 做點(diǎn)啥
end
julia> i = 0
julia> while true
global i += 1
i > 5 && break
println(i)
end
for i = 1:6
iseven(i) && continue
println(i)
end
IntN 和 UIntN, 且 N ∈ {8, 16, 32, 64, 128}, BigInt
FloatN 且 N ∈ {16, 32, 64}
BigFloat
typemin(Int8)
typemax(Int64)
Complex{T<:Real}
im
eps() # 等價于 eps(Float64)
round() # 浮點(diǎn)數(shù)圓整
round(Int, x) # 整數(shù)圓整
# 嘗試進(jìn)行轉(zhuǎn)換/可能會報錯
convert(TypeName, val)
# 調(diào)用類型構(gòu)造器轉(zhuǎn)換
TypeName(val)
pi # 3.1415...
π # 3.1415...
im # real(im * im) == -1
using Base.MathConstants
module PackageName
# 添加模塊定義
# 使用 export 讓定義對外可見
end
include("filename.jl")
using ModuleName # 導(dǎo)出所有名稱
# 僅導(dǎo)出 x, y
using ModuleName: x, y
# 僅導(dǎo)出 x, y
using ModuleName.x, ModuleName.y:
# 僅導(dǎo)出 ModuleName
import ModuleName
# 僅導(dǎo)出 x, y
import ModuleName: x, y
# 僅導(dǎo)出 x, y
import ModuleName.x, ModuleName.y
using 和 import 只有一點(diǎn)區(qū)別:使用 using 時,你需要寫 function Foo.bar(.. 來給 Foo 模塊的函數(shù) bar 增添一個新方法; 而使用 import Foo.bar 時,只需寫 function bar(... 就能達(dá)到同樣的效果
# 得到模塊導(dǎo)出名稱的數(shù)組
names(ModuleName)
# 包含未導(dǎo)出的、棄用的
# 和編譯器產(chǎn)生的名稱
names(ModuleName, all::Bool)
# 也顯示從其他模塊顯式導(dǎo)入的名稱
names(ModuleName, all::Bool, imported::Bool)
一個程序包必須先注冊,然后才能在包管理器中看到它。在 Julia 1.0 中,有兩種使用包管理器的方法:
using Pkg 導(dǎo)入 Pkg 模塊,然后用它的函數(shù)管理其他包;],然后按回車。進(jìn)入特殊的交互式包管理模式。 (要從包管理模式返回 REPL,只需要在空行上按退格鍵 BACKSPACE 就行了)注意新的工具總是先添加到交互式模式中,然后才會加入 Pkg 模塊
| :- | :- |
|---|---|
| 列出已安裝的包 | Pkg.status() |
| 更新所有包 | Pkg.update() |
| 安裝包 | Pkg.add("PackageName") |
| 重新構(gòu)建包 | Pkg.build("PackageName") |
| 使用包 | using PackageName |
| 刪除包 | Pkg.rm("PackageName") |
| :- | :- |
|---|---|
| 添加包 | add PackageName |
| 刪除包 | rm PackageName |
| 更新包 | update PackageName |
| 使用開發(fā)版本 | dev PackageName 或 dev GitRepoUrl |
| 返回普通發(fā)行版 | free PackageName |
感谢您访问我们的网站,您可能还对以下资源感兴趣:
国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片