|
4 | 4 |
|
5 | 5 | `eachindex` 通常用于得到数组索引的合适遍历工具。它比使用 `1:length(A)` 兼容性更强,因为 `1:length(A)` 不适用于多维数组、数组 `view` 及其它包可能出现的数组(如索引不从 1 开始的数组)。 |
6 | 6 |
|
7 | | -```julia-repl |
8 | | -julia> A = [10 20; 30 40]; |
9 | | -
|
10 | | -julia> for i in eachindex(A) |
11 | | - println("A[", i, "] == ", A[i]) |
12 | | - end |
13 | | -A[1] == 10 |
14 | | -A[2] == 30 |
15 | | -A[3] == 20 |
16 | | -A[4] == 40 |
| 7 | +```@repl |
| 8 | +A = [10 20; 30 40]; |
| 9 | +
|
| 10 | +for i in eachindex(A) |
| 11 | + println("A[", i, "] == ", A[i]) |
| 12 | +end |
17 | 13 | ``` |
18 | 14 |
|
19 | 15 | 使用 `enumerate` 遍历物品时,得到的值是一对 `(i, v)`,其中 `i` 是从 1 开始的计数器,`v` 是正常遍历物品得到的值。 |
20 | 16 |
|
21 | | -```julia-repl |
22 | | -julia> a = ["a", "b", "c"]; |
23 | | -
|
24 | | -julia> for (index, balue) in enumerate(a) |
25 | | - println("a[$index] = $value") |
26 | | - end |
27 | | -ERROR: UndefVarError: `value` not defined in `Main` |
28 | | -Suggestion: check for spelling errors or missing imports. |
29 | | -Stacktrace: |
30 | | - [1] top-level scope |
31 | | - @ .\REPL[30]:2 |
32 | | -
|
33 | | -julia> for (index, value) in enumerate(a) |
34 | | - println("a[$index] = $value") |
35 | | - end |
36 | | -a[1] = a |
37 | | -a[2] = b |
38 | | -a[3] = c |
39 | | -``` |
40 | | - |
41 | | -`zip` 可用于合并多个可遍历的物品,一直遍历直到其中一个到达末尾。 |
42 | | -```julia-repl |
43 | | -julia> z = zip(1:3, "abcde") |
44 | | -zip(1:3, "abcde") |
| 17 | +```@repl |
| 18 | +a = ["a", "b", "c"]; |
45 | 19 |
|
46 | | -julia> length(z) |
47 | | -3 |
| 20 | +for (index, balue) in enumerate(a) |
| 21 | + println("a[$index] = $value") |
| 22 | +end |
48 | 23 |
|
49 | | -julia> first(z) |
50 | | -(1, 'a') |
| 24 | +for (index, value) in enumerate(a) |
| 25 | + println("a[$index] = $value") |
| 26 | +end |
| 27 | +``` |
51 | 28 |
|
52 | | -julia> collect(z) |
53 | | -3-element Vector{Tuple{Int64, Char}}: |
54 | | - (1, 'a') |
55 | | - (2, 'b') |
56 | | - (3, 'c') |
| 29 | +`zip` 可用于合并多个可遍历的物品,一直遍历直到其中一个到达末尾。 |
| 30 | +```@repl |
| 31 | +z = zip(1:3, "abcde") |
| 32 | +length(z) |
| 33 | +first(z) |
| 34 | +collect(z) |
57 | 35 | ``` |
58 | 36 |
|
59 | 37 | `filter` 用于生成满足特定要求的迭代器,需注意在使用时不与导出的另一个 `filter` 混淆 |
60 | | -```julia-repl |
61 | | -julia> f = Iterators.filter(isodd, [1, 2, 3, 4, 5]) |
62 | | -Base.Iterators.Filter{typeof(isodd), Vector{Int64}}(isodd, [1, 2, 3, 4, 5]) |
63 | | -
|
64 | | -julia> collect(f) |
65 | | -3-element Vector{Int64}: |
66 | | - 1 |
67 | | - 3 |
68 | | - 5 |
| 38 | +```@repl |
| 39 | +f = Iterators.filter(isodd, [1, 2, 3, 4, 5]) |
| 40 | +collect(f) |
69 | 41 | ``` |
70 | 42 |
|
71 | 43 | ## 自定义 |
|
91 | 63 | ``` |
92 | 64 |
|
93 | 65 | 这是一个自定义的样例: |
94 | | -```julia |
| 66 | +```@repl |
95 | 67 | struct n3 |
96 | | - v::Int |
| 68 | + v::Int |
97 | 69 | end |
98 | 70 |
|
99 | 71 | function Base.iterate(i::n3, n::Int=i.v) # 第一次调用时不会有第二个参数 |
100 | | - if n==1 |
101 | | - return nothing # 表示结束 |
102 | | - end |
103 | | - v= n&1==0 ? n>>1 : n*3+1 |
104 | | - return (v, v) # (返回值,下一个状态(作为第二个参数)) |
| 72 | + if n == 1 |
| 73 | + return nothing # 表示结束 |
| 74 | + end |
| 75 | + v= n&1==0 ? n>>1 : n*3+1 |
| 76 | + return (v, v) # (返回值, 下一个状态) |
| 77 | +end |
| 78 | +
|
| 79 | +for i in n3(10) |
| 80 | + println(i, ' ') |
105 | 81 | end |
106 | 82 |
|
107 | | -julia> for i in n3(10) |
108 | | - println(i, ' ') |
109 | | - end |
110 | | -5 |
111 | | -16 |
112 | | -8 |
113 | | -4 |
114 | | -2 |
115 | | -1 |
116 | | - |
117 | | -julia> [n3(27)...] |
118 | | -111-element Vector{Int64}: |
119 | | - 82 |
120 | | - 41 |
121 | | - 124 |
122 | | - 62 |
123 | | - 31 |
124 | | - 94 |
125 | | - 47 |
126 | | - 142 |
127 | | - 71 |
128 | | - 214 |
129 | | - 107 |
130 | | - 322 |
131 | | - 161 |
132 | | - ⋮ |
133 | | - 53 |
134 | | - 160 |
135 | | - 80 |
136 | | - 40 |
137 | | - 20 |
138 | | - 10 |
139 | | - 5 |
140 | | - 16 |
141 | | - 8 |
142 | | - 4 |
143 | | - 2 |
144 | | - 1 |
| 83 | +[n3(27)...] |
145 | 84 | ``` |
146 | 85 |
|
147 | 86 | [^1]: https://docs.juliacn.com/latest/manual/interfaces |
0 commit comments