memo: Python | iter

  • iterable 是存储多个值的对象,并可以逐个返回它的值

generator defined by yield

  • itertools.cycle(iterable) vs while True: 前者生成的 iterator 可以无限次重复遍历一个有限的 iterable,而while True 只会遍历一遍 iterable。 so

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    def myGenerator():	# define a iterable
        yield 1
        yield 2
    
    def loop_iterator(iterable=[]):
        for val in itertools.cycle(iterable): # turn to iterator
            yield val	# this func is a generator
    
    gen = loop_iterator(iterable=myGenerator())	# create a generator
    next(gen)
    

    Contrast:

    1
    2
    3
    4
    5
    6
    
    def loop_while(iterable):
        while True:
            for val in iterable:
                yield val	# define a generator
    gen = loop_while(myGenerator())
    next(gen)
    
  • yield 关键字用于 generator function 中,返回一个值,但不终止函数执行,等待下一次调用再继续 GfG-yield。 Generator function 创建一个 generator object,也就是iterable,它可以用 __next__() 方法或 for 循环遍历。 定义 generator function 只需要 yield 关键字,比较方便,而定义 iterator 需要定义 __next__()__iter__() 方法 GfG-gener

iterator has next

  • iterator 是实现了__iter__()__next__() 方法的对象,而 list, tuple, dict, set 都是 iterable 对象,它们都可以调用自己的 iter() 方法变成一个 iterator。

for 循环遍历 iterable 时其实创建了一个iterator,每次循环执行__next__()方法 w3school

1
2
3
myList = [1,2,3]
myIterator = iter(myList) # 或 ls.__iter__()
print(next(myIterator)) # traverse the next value