Julia介面 Iteration介面 迭代

2021-09-12 11:08:06 字數 2205 閱讀 5877

1、簡介

julia提供的各種介面為自定義型別擴充套件功能。

本文討論一下iteration介面。

自定義的型別實現這裡介面就可以實現迭代功能,也就是可以直接在for迴圈這樣使用:

假如iter是你的自定義型別:

for i in iter   # or  "for i = iter"

# body

end

等同於:

next = iterate(iter)

while next !== nothing

(i, state) = next

# body

next = iterate(iter, state)

end

2、如何實現

要實現iteration介面需要實現iterate(iter, state)方法,這個方法在base包裡面,它的含義是返回iter的下乙個元素和其狀態state,如果沒有就返回nothing, state可以是索引。

我們定義乙個型別squares,它有乙個count域:

struct squares

count::int

end

然後定義他的iterate方法,要顯性的指定報名:

base.iterate(s::squares, state=1) = state > s.count ? nothing : (state*state, state+1)
state小於count是計算它的平方值,然後+1,否則返回nothing。

定義好之後用for迴圈迭代如下:

julia> for i in squares(5)

println(i)

end14

91625

3、其他與迭代相關方法

julia> 25 in squares(10)

true

julia> using statistics

julia> mean(squares(3))

4.666666666666667

julia> std(squares(100))

3024.355854282583

4、實現其他迭代集合方法

我們還可以為squares實現其他與迭代集合有關的方法:

eltype(返回集合元素型別), length(返回集合元素個數),

julia> base.eltype(::type) = int # note that this is defined for the type

julia> base.length(s::squares) = s.count

julia> sum(squares(100))

338350

預設的sum方法是通過迴圈迭代計算所有元素的和:

我們可以重新實現sum方法使其更高效,使用公式直接求和

julia> base.sum(s::squares) = (n = s.count; return n*(n+1)*(2n+1)÷6)

julia> sum(squares(1803))

1955361914

5.反向迭代

要實現反向迭代,需要實現iterators.reverse的iterate方法,t指型別,這裡我們實現iterators.reverse,

collect收集集合元素,也可以用for迭代:

julia> base.iterate(rs::iterators.reverse, state=rs.itr.count) = state < 1 ? nothing : (state*state, state-1)

julia> collect(iterators.reverse(squares(4)))

4-element array:

16 9

4 1

julia> for i in iterators.reverse(squares(5))

println(i)

end251694

1

Julia介面 Iteration介面 迭代

1 簡介 julia提供的各種介面為自定義型別擴充套件功能。本文討論一下iteration介面。自定義的型別實現這裡介面就可以實現迭代功能,也就是可以直接在for迴圈這樣使用 假如iter是你的自定義型別 for i in iter or for i iter body end等同於 next it...

Python學習筆記 迭代Iteration

usr bin env python3 coding utf 8 d for key in d 預設迭代是key print key acb 迭代value for value in d.values print value 312 for k,v in d.items print k,v c 3 ...

julia常用矩陣函式 Julia中的函式

如何宣告函式 julia為我們提供了一些編寫函式的方法。第乙個需要function和end關鍵字 function sayhi name println hi name,it s great to see you endfunction f x x 2end 我們可以像這樣呼叫已宣告的函式 sayh...