我是靠谱客的博主 幸福大米,最近开发中收集的这篇文章主要介绍迭代器和生成器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一,迭代器

迭代器最大的好处是:储存生成数据的方式,较储存生成数据的结果占用较少的内存

若一个对象是可迭代对象,此对象不一定可以进行迭代;若一个对象是迭代器,则此对象一定可以进行迭代。迭代对象也可以同时为迭代器。

1,可迭代对象

如何判断对象是否为可迭代对象呢?在python中万物皆对象,只要在对象内部实现__iter__方法,则对象是可迭代对象,即可以使用for循环。

代码中判断:


from collections import Iterable
isinstance(对象名,Iterable)
# 返回布尔值进行判断
2,迭代器

如何判断对象是否为迭代器对象呢?在认定对象为可迭代对象(对应类中有__iter__方法)后,调用iter方法,对象自动调用__iter__中return,return的返回值应该为一个迭代器。迭代器中应有__iter__方法和__next__方法。调用next(对象)方法并触发对象中的__next__方法中的返回值。若迭代器出现报错 StopIteration时,for循环将自动结束迭代,并不报错。


代码中判断:
from collections import Iterator
isinstance(对象名,Iterator)
# 返回布尔值进行判断
3,总结

迭代一个对象的步骤为:

1)判断对象是否为可迭代对象(对象内部实现__iter__方法)。

2)调用iter方法并触发对象的__iter__方法的返回值(__iter__的返回值应该为一个迭代器)。

3)判断返回对象是否为一个迭代器(迭代器中应有__iter__方法和__next__方法。调用next(对象)方法并触发对象中的__next__方法中的返回值)。

4)判断迭代器如何结束(当迭代器 raise StopIteration时,for循环语句将自动处理,正常结束循环)。

4,为了更好的理解,附上代码

from collections import Iterable,Iterator
class Classmate():
def __init__(self):
self.names = list()
self.current_num = 0
def add(self,name):
self.names.append(name)
def __iter__(self):
"""只要在对象内部实现__iter__方法,
则对象是可迭代对象,即可以使用for循环"""
return self
# 可迭代对象可以返回自己作为迭代器,但是要保证实现了__iter__、__next__方法。
def __next__(self):
if self.current_num < len(self.names):
ret = self.names[self.current_num]
self.current_num += 1
return ret
else:
raise StopIteration # 当迭代器报错StopIteration时,for循环语句将自动处理,正常结束循环。
classmate = Classmate()
classmate.add("老大")
classmate.add("老二")
classmate.add("老三")
print("判断classmate是否是可以迭代对象:",isinstance(classmate,Iterable))
# classmate_iterator = iter(classmate)
print("判断classmate_iterator是否是迭代器:",isinstance(classmate_iterator,Iterator))
print(next(classmate))
for name in classmate:
print(name)

二,生成器

生成器的一大好处是:储存生成数据的方式。较return可返回结果时暂定程序,而后继续执行。

1,什么是生成器

生成器是一类特殊的迭代器, 它不需要再像上面的类一样写__iter__()和__next__()方法了,使用更加方便,它依然可以使用next函数和for循环取值,而当调用next函数并触发__next__返回值无参数时,将会自动报错StopIteration (迭代器无此功能)

2,创建生成器的方法
1)将列表推导式的[] 换成()

nums = (x*2 for x in range(10))
    
next(nums)
/
for i in nums:
2) 函数创建生成器

只要在def中有yield关键字的 就称为 生成器。在函数中只要有yield,那个这就不是一个函数,而是一个生成器模板,在调用函数时就是在创建一个生成器对象。

3,yield生成器在代码中如何执行

当代码执行到yield语句时,将暂停程序,并返回数据,依然可以使用next函数和for循环取值。

当调用next函数并触发__next__返回值无参数时,将自动报错StopIteration。多个生成器对象先后执行,相互无影响。

为便于理解,附上实现 “斐波那契”生成器实例:


def create_num(all_num):
a,b = 0,1
current_num = 0
while current_num < all_num:
yield a
# 如果一个函数中有yield语句,那么这个就不在是函数,而是一个生成器的模板。
a,b = b,a+b
current_num += 1
# 如果在调用create_num的时候,发现这个函数中有yield那么此时,不是调用函数,而是创建一个生成器对象。
加载更多

最后

以上就是幸福大米为你收集整理的迭代器和生成器的全部内容,希望文章能够帮你解决迭代器和生成器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部