Julia語言程式基礎

聽風走了八千里發表於2021-04-16

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...

相關文章