python的迭代器,可迭代对象,生成器理解

上篇文章, python itertools 里面实现的groupby方法。里面用到了object, id, iter等很基础的方法, 看的有点晕。这里重新整理一下迭代器,可迭代对象, 生成器。复习一下,加深印象。

python语言很容易上手。比如for循环。

a = [1, 2, 3, 4]
for i in a:
	print(i)

不需要获取key, 直接就遍历了一遍。但是其他语言呢?比如c?

a_list = [1, 2, 3, 4]
for(int i=0; i<a_list.length(); i++)
	printf(a_list[i])

其他的语言都是用下标来遍历对象的, 如果你觉得python的语言底层可能用的是下标,那么你可以自行尝试一下集合。这里要说明的是,只有字符串,列表,元组是满足下标,也就是序列的情况,而字典,集合,文件这些都不满足。但是他们都可以用for循环来一个一个的取出来,why?

因为它们不是用的序列来取的!!!可以用for循环的容器(列表,集合,字典,元组…),说明它们是可迭代对象, 想取出来它们里面的值,你得用迭代器的方法来取。

迭代器对象就是一个一个的取数,一旦变成迭代器,数据就是一次性的,就只能取一次,下次取还需要重新从列表里面再次生成迭代器对象。

可迭代对象通过iter方法,就可以变成一个迭代器,变成迭代器之后,就可以通过next的方法来取数,next一次可以取出来一个数,如果取完了, 会触发StopIteration。 for 循环里面会判断,如果发现触发了StopIteration,就直接return.

迭代器说完了就得说生成器。生成器就是特殊的迭代器,生成器无非就是更优雅一点,说白了,如果让你自己实现for循环,你不需要再用iter 和 next方法了, 你只需要用一个yield就行了。而如果有值需要返回的时候,你也不用自己append了,你只需要yield要返回的值,就解决了。

not use yield

def something():
    result = []
    for ... in ...:
        result.append(x)
    return result

use yield

def iter_something():
    for ... in ...:
        yield x

再三提醒,生成器和迭代器,它们都是一次性的,如果使用一次之后,它们就为空了!特别需要注意!!!

如果我有没写清楚,或者看完后有疑问的地方,欢迎向我提问!

参考:

http://python.jobbole.com/87805/
https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
https://www.jb51.net/article/143757.htm

猜你喜欢

转载自blog.csdn.net/funnyPython/article/details/83278867