码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器、生成器 day13

时间:2018-02-06 20:34:39      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:意义   dir   rabl   对象   int   --   fun   height   tuple   

一 迭代器

迭代器的由来pythone2.2引进的,是一种序列(也是一种数据类型),也是为类对象提供一个序列的入口。

for 循环
str list tuple dict set 文件句柄
可迭代:
s = abc
for i in s:
    print(i)
技术分享图片

 不可迭代

iterable
for i in 55:
    print(i)
技术分享图片

 

 


什么是可迭代对象?
方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
遵循可迭代协议
s = abc
print(__iter__ in dir(s))
print(__iter__ in dir(333))
技术分享图片

 


可迭代对象,iterable 与迭代器有什么关系
可迭代对象 ---> 转化成迭代器
可迭代对象.__iter__() ---> 迭代器
s = abc

s1 = s.__iter__()
print(s1) #iterator  遵循迭代器协议
技术分享图片 

 

迭代器取值:
s2 = abcd
s3 = s2.__iter__()
print(s3.__next__())
print(s3.__next__())
print(s3.__next__())
print(s3.__next__())
print(__iter__ in dir(s2))
print(__iter__ in dir(s3))
print(__next__ in dir(s2))
print(__next__ in dir(s3))

技术分享图片

只含有__iter__方法的数据是可迭代对象
含有__iter__方法,并且含有__next__方法的数据是迭代器
l = [1,2,3,4]
#print(dir(l))
print(__iter__ in dir(l))#判断l是不是可迭代对象
print(__next__ in dir(l))#判断l是不是迭代器
liter = l.__iter__()#l转换成迭代器
print(liter.__next__())#输出值
print(liter.__next__())
print(liter.__next__())
print(liter.__next__())
print(liter.__next__())#没有第五项所以报错
技术分享图片

 



方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
遵循可迭代协议
s = abc
print(__iter__ in dir(s))
print(__iter__ in dir(333))
技术分享图片

 



方法二 测试他是迭代器还是可迭代对象
l = [1,2,3]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable))
print(isinstance(l,Iterator))
print(isinstance(l_iter,Iterator))
print(isinstance(l,list))
技术分享图片

 



迭代器的意义?
1,迭代器节省内存.
2,迭代器惰性机制.
3,迭代器不能反复,一直向下执行.

for循环的机制.
内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
,然后在调用__next__方法.
他有异常处理的方法.
for i in [1,2,3]:
    print(i)
技术分享图片

 

l = [1,2,3]
l_iter = l.__iter__()
while True:
    try:
        print(l_iter.__next__())
    except StopIteration:
        break
可迭代对象:str list tuple dict set range
迭代器: 文件句柄
print(__iter__ in dir(range(10)))
print(__next__ in dir(range(10)))
技术分享图片

 

l=[1,2,3,4,5]
s=l.__iter__()
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
# print(s.__next__())
while True:
    try:
        print(s.__next__())
    except:StopIteration
    break

技术分享图片

 迭代器:文件句柄是一个迭代器

二  生成器

 

什么是生成器?
生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.\
1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.
def func():
    print(111)
    return 222
ret = func()
print(ret)
技术分享图片

 


生成器函数 生成器
def gener():
    print(aaa)
    yield 222
    print(bbb)
    yield 333
    print(ccc)
g = gener()
print(g)
print(g.__next__())
print(g.__next__())
return yield 区别
技术分享图片

 

return 返回给调用者值,并结束此函数.
yiled 返回给调用者值,并将指针停留着当前位置.
def cloth():
    for i in range(10000):
        print(衣服%s%i)
cloth()
技术分享图片

 

 


def cloth():
    for i in range(8):
        yield 衣服%s%i

g_cloth = cloth()
print(g_cloth.__next__())
print(g_cloth.__next__())
for i in range(2):
    print(g_cloth.__next__())
for i in range(2):
    print(g_cloth.__next__())
技术分享图片

 



send
1,send 和next功能一样
2, 给上一个yiled 整体发送一个值
send不能给最后一个yield发送值
获取第一个值的时候,不能用send 只能用next
def gener():
    yield 222
    count = yield 333
    print(-------->,count)
    yield aaa
    yield bbb
g = gener()
print(g.send(AAA))
print(g.send(None))
print(g.send(AAAA))
print(g.send(wwwwww))
技术分享图片

 

 

def gener():
    yield 222
    count = yield 333
    print(-------->,count)
    coubt1=yield 444
    print(coubt1)
    yield bbb
g = gener()
print(g.__next__())
print(g.send(None))
print(g.send(AAAA))
print(g.send(ccc))
技术分享图片

 

 


迭代器、生成器 day13

标签:意义   dir   rabl   对象   int   --   fun   height   tuple   

原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8423191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!