探索Julia(part10)--自定义函数
學(xué)習(xí)筆記,僅供參考,有錯(cuò)必糾
參考自:Julia數(shù)據(jù)科學(xué)應(yīng)用–Zacharias Voulgaris;官方文檔
使用Julia-1.1.1
自定義函數(shù)
Functions
在Julia中,函數(shù)是將參數(shù)值的元組映射到返回值的對(duì)象。Julia函數(shù)不是純粹的數(shù)學(xué)函數(shù),因?yàn)楹瘮?shù)可以改變程序的全局狀態(tài),并受其影響,在Julia中定義函數(shù)的基本語(yǔ)法是:
function f(x,y)x + y end在Julia中還有第二種更簡(jiǎn)潔的定義函數(shù)的語(yǔ)法。上面演示的傳統(tǒng)函數(shù)聲明語(yǔ)法等價(jià)于以下緊湊的"賦值形式":
f(x,y) = x + y在賦值形式中,函數(shù)體必須是單個(gè)表達(dá)式,盡管它可以是復(fù)合表達(dá)式(參見(jiàn)復(fù)合表達(dá)式)。簡(jiǎn)短、簡(jiǎn)單的函數(shù)定義在Julia中很常見(jiàn)。
函數(shù)調(diào)用使用傳統(tǒng)的括號(hào)語(yǔ)法:
f(2,3) #返回值 5函數(shù)名后不加括號(hào),則表達(dá)式f指的是函數(shù)對(duì)象,可以像任何值一樣傳遞:
g = f; g(1, 2) #返回值 3和變量一樣,Unicode也可以用于函數(shù)名:
∑(x,y) = x + y; ∑(1, 2) #返回值 3return關(guān)鍵字
默認(rèn)情況下,函數(shù)返回的值是最后一個(gè)計(jì)算表達(dá)式的值,該表達(dá)式是函數(shù)定義體中的最后一個(gè)表達(dá)式,return關(guān)鍵字將導(dǎo)致函數(shù)立即返回,例如:
function g2(x,y)return x * yx + y end;調(diào)用:
g2(5, 6) #返回值 30返回值類(lèi)型
可以在函數(shù)聲明中使用::操作符指定返回值類(lèi)型,這將返回值轉(zhuǎn)換為指定的類(lèi)型:
function g3(x, y)::Int8return x * y end;查看返回值類(lèi)型:
typeof(g3(3, 4)) #返回值 Int8對(duì)于不需要返回值的函數(shù)(僅用于某些副作用的函數(shù)),Julia約定是不返回值:
function printx(x)println("x = $x")return nothing end這是一種約定,因?yàn)閚othing不是一個(gè)Julia關(guān)鍵字,而是唯一的nothing類(lèi)型的單例對(duì)象。
Operators Are Functions
在Julia中,大多數(shù)操作符是支持特殊語(yǔ)法的函數(shù)(具有特殊求值語(yǔ)義的操作符,如&&和||例外,這些運(yùn)算符則不能為函數(shù)),我們可以應(yīng)用他們使用圓括號(hào)參數(shù)列表,就像其他任何函數(shù)一樣:
julia> 1 + 2 + 3 6julia> +(1,2,3) 6中綴形式(infix form)與函數(shù)應(yīng)用程序形式(function application form)完全相同,實(shí)際上,前者被解析為在內(nèi)部生成函數(shù)調(diào)用,這也意味著我們可以分配和傳遞操作符,比如+和*,就像你對(duì)待其他函數(shù)值一樣:
julia> f1 = +;julia> f1(1,2,3) 6具有特殊名稱(chēng)的操作符
一些特殊表達(dá)式對(duì)應(yīng)于調(diào)用具有不明顯名稱(chēng)的函數(shù),這些是:
| [A B C ...] | hcat |
| [A; B; C; ...] | vcat |
| [A B; C D; ...] | hvcat |
| A' | adjoint |
| A[i] | getindex |
| A[i] = x | setindex! |
| A.n | getproperty |
| A.n = x | setproperty! |
匿名函數(shù)
Julia中的函數(shù)是一類(lèi)對(duì)象:它們可以被賦給變量,并使用標(biāo)準(zhǔn)的函數(shù)調(diào)用語(yǔ)法從已賦值的變量中調(diào)用。它們可以用作參數(shù),也可以作為值返回。它們也可以匿名創(chuàng)建,無(wú)需給出名稱(chēng),例如:
julia> x -> x^2 + 2x - 1 #3 (generic function with 1 method)Julia創(chuàng)建了一個(gè)函數(shù),參數(shù)為x,返回多項(xiàng)式x^2 + 2x - 1在該值處的值。請(qǐng)注意,該函數(shù)返回結(jié)果是一個(gè)泛型函數(shù),且具有基于連續(xù)編號(hào)的編譯器生成的名稱(chēng)。
匿名函數(shù)的主要用途是將它們傳遞給其他函數(shù),作為一個(gè)參數(shù)。一個(gè)典型的例子是map方法,它對(duì)數(shù)組中的每個(gè)值應(yīng)用一個(gè)函數(shù),并返回一個(gè)包含結(jié)果值的新數(shù)組:
julia> map(x -> x^2 + 2x - 1, [1,3,-1]) 3-element Array{Int64,1}:214-2接受多個(gè)參數(shù)的匿名函數(shù),可以被寫(xiě)為:
(x, y, z) -> 2x + y - z一個(gè)零參數(shù)匿名函數(shù)被寫(xiě)為:
()->3不帶參數(shù)的函數(shù)可能看起來(lái)很奇怪,但對(duì)于“延遲”計(jì)算很有用。
總結(jié)
以上是生活随笔為你收集整理的探索Julia(part10)--自定义函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 孟子曰人皆有不忍人之心翻译
- 下一篇: 探索Julia(part11)--自定义