java

iterator

iterable

python

iterable/可迭代的

         当对象中存在iter方法时,该对象就是iterable对象,若一般对象实现iter方法时,它将成为iterable,其在python中iterable的有以下:[列表、字典、元组]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
l = [1,2,3]
dir(l) # _iter_
iter(l) # <list_iterator at 0x69c8048>


In [12]: iter(123)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-7ce543a15833> in <module>()
----> 1 iter(123)

TypeError: 'int' object is not iterable


In [21]: dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

In [22]: iter(dict)
Out[22]: <dict_keyiterator at 0x59d81d8> #返回一个键的可迭代对象

In [25]: next(dict) #字典不是一个迭代器,它只是一个迭代对象
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-25-9c216d0aadb1> in <module>()
----> 1 next(dict)

TypeError: 'dict' object is not an iterator


In [23]: l = [1,2,3]

In [24]: iter(l)
Out[24]: <list_iterator at 0x69ea710> #返回一个值本身的可迭代对象

自定义迭代对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
In [42]: class String(object):
...:
...: def __init__(self, val):
...:
...: self.val = val
...:
...: def __str__(self):
...:
...: return self.val
...:
...: def __iter__(self):
...:
...: print("This is __iter__ method of String class")
...:
...: return iter(self.val) #self.val is python string so iter() will return it's iterat
...:

In [43]: s = String("test")

In [44]: iter(s)
This is __iter__ method of String class
Out[44]: <str_iterator at 0x56c1400>

iterator/迭代器

         当对象中存在iter方法,并且存在next()方法时,它将是一个iterator,迭代器可用for lopp 进行获取值,可以调用next()方法进行获取值。
         iterator对象存在一次性特点,当使用next()或next()获得值时,若对象不存在下一个值时,raise stopIteration 异常
         iter()函数为一个可迭代对象返回一个迭代器,如果给iter函数传入一个迭代器,它就直接返回那个迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#迭代器 实现逻辑
class Iterator:

def __init__(self, iterable)

self.iterable = iterable

def __iter__(self): #iter should return self if called on iterator

return self

def next(self): #Use __next__() in python 3.x

if condition: #it should raise StopIteration exception if no next element is left to return

raise StopIteration

javaScript

iterator

1.8
1
2
3
4
5
6
7
8
9
10

let someString = "someString";

typeof someString[Symbol.iterator];

let iterator = someString[Symbol.iterator]();

iterator + "";

iterator.next();

iterable

1.8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

let user = { "name": "test1", "age": 3 };

userIterable = {
[Symbol.iterator]() {
let keys = Object.keys(user);
var index = 0;
return {
next() {
if (keys.length > index) {
let key = keys[index++];
return { value: {key: key, value: user[key]}, done: false };
} else {
return { value: null, done: true };
}
},
return(v) {
console.log("Done");
return { value: v, done: true };
}
}
}
};

for(var s of userIterable){
console.info(s);
};

generator

1.8
1
2
3
4
5
6
7
8
9
10
11
12
13
14

//function* defined generator function
function* generator(){
yield 1;
yield 2;
yield 3;
yield 4;
};

let ge = generator();
console.info(ge.next().value);

//check userIterable[Symbol.iterator] type
typeof userIterable[Symbol.iterator]
× 请我吃糖~
打赏二维码