栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 中的迭代器与生成器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 中的迭代器与生成器

迭代对象

python中内部含有__iter__方法的对象,都是可迭代对象,使用dir可以看该对象的的以字符串的形式所有方法名。

l1=[1,2,3,4]
s1=100
print('__iter__' in dir(l1)) #True
print('__iter__' in dir(s1))#False

可迭代对象占用内存,不能迭代取值(除去索引、key以为)不理解为啥可迭代对象不能迭代取值的意思,说for循环取值是先转迭代器再取值的不懂呀?

迭代器

迭代器内部含有__iter__和 next__方法的对象就是迭代器,迭代对象不一定就是迭代器,迭代器返回的是一个内存地址。
可迭代对象能否转化为迭代器:可以的,加上__iter()就行

l1=[1,2,3,4]
obj = l1.__iter__()
print(obj)  #

迭代器取值的两种方式:
每__next__一次,取一个值,取完了还next的话,就会报stopIteration的错误

l1 = [1,2,3,4]
obj = iter(l1)
ret = obj.__next__()
print(ret)#1
ret = next(obj)
print(ret)#2
ret = next(obj)
print(ret)#3
ret = next(obj)
print(ret)#4
ret=next(obj)
print(ret)# stopIteration

还有就是可以直接用for循环去取

s1='我是一个字符串'
obj=iter(s1)
for i in range(2):
    print(next(obj))

迭代器就是节省内存,可以通过循环+next方法取值。迭代器去每次取的放到内存空间中,你下次再取时上次取的就释放了,把新的数据放进去。

生成器

生成器本质是迭代器,但是也有不同
创建生成器的三种方式
1、通过生成器函数
生成器函数是普通函数用return返回一个值,还有一种函数用yield返回值,这种函数叫生成器函数,函数调用时返回一个生成器对象。生成器其实是一种特殊的迭代器,生成器一定是迭代器。

def fib(max):
    prev,curr=0,1
    while max>0:
        max-=1
        yield curr
        prev,curr=curr,prev+curr
if __name__=='__main__':
    ret=fib(6)
    for n in ret:
        print(n)

yield vs return
yield 生成器函数可以设置多个,并不会终止函数,return只能有一个,终止函数
2、通过生成器推导式
生成器推导式和列表推导式规则一样只不过需要把[]换成()返回的是生成器对象

x=(x*x for x in range(10))
print(x) # at 0x00000166F8640580>

yield from
在下面的例子中 yield 调用for循环返回的是[1,2,3,4];yield from 返回的是 1,2,3,4这种;这有什么区别?yield from 返回的是列表中的每个元素。将每个可迭代对象中的每一个数据作为生成器结果返回,下面例子中列表是可迭代对象,不是将列表整个作为生成器返回,而是每一个元素作为一个生成器返回。

def func():
    lst=[1,2,3,4]
    yield lst
ret=func()
for i in ret:
    print(i) #[1, 2, 3, 4]
def fuc1():
    lst=[1,2,3,4]
    yield from lst
ret1=fuc1()
for i in ret1:
    print(i)
# 1
# 2
# 3
# 4

python中的迭代器与生成器说一下?
迭代器是python中含有双下划线__next__和__iter__方法的可迭代对象,取值可以使用next方法 后者 for i in 迭代器取值,next 每次只能取一个值,如果取完了还next的话,会报错,优点只有用到取进来的时候才占用内存
生成器就是一种特殊的迭代器,有两种生成方式第一种就是生成器函数,使用yield作为返回值返回,返回的是一个生成器,可以用for 循环取值
另一种可以用生成器推导式生成一个生成器。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号