python3迭代器和可迭代对象_python3系列五可迭代对象、迭代器和生成器

1.可迭代对象

字符串、集合、列表、字典、元组都是可迭代的对象,数字不是可迭代的,就是可以通过for循环取出元素的对象,都是可迭代对象

如果查看一个变量是否为可迭代:

s = {1, 2, 3, 4}print(type(s)) #

print(isinstance(s,Iterable))

可以被迭代要满足的要求就是可迭代协议,可迭代协议就是内部实现了__iter__方法,即可迭代对象封装中有__iter__方法。

2.迭代器

用变量调用__iter__后就生成一个迭代器,迭代器遵循迭代器协议,必须拥有__iter__方法和__next__方法。

s_iter = s.__iter__() #s_iter是一个迭代器变量

print(s_iter)print(s_iter.__next__())

3.生成器

本质是一个迭代器,不过是由程序员写出来的就叫生成器,系统内置的就叫迭代器;

生成器的两种实现方式:

1)生成器函数

常规函数定义,但是,使用yield语句而不是return语句返回结果;yield语句执行一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从其离开的地方继续执行。例如:

deffunc():yield from range(4)

2)生成器表达式

类似于列表推导,把列表解析的[]换成()得到的就是生成器表达式,但是生成器返回按需产生的结果的一个对象,而不是一次构建一个结果列表;

列表推导方式和生成器都是一种边里的编程方式,只不过生成器更节省内存。

g=(i for i in range(4)) #g是一个生成器

生成器的好处

其不会一下子在内存中生成太多数据,只是在你要的时候才会返回你要的数据。

生成器的例题:

def add(n,i):

return n+ideftest():for i in range(4):yieldi

g=test()#for n in [1,10]:#g =(add(n,i) for i in g)#上面的for循环套用迭代器,等价如下,遇到for循环套生成器,就拆开来做

n = 1g= (add(n, i) for i ing)

n= 10 #覆盖前面n的值

g = (add(n, i) for i in g)

分析:

g只是代表一个生成器对象,没有for,next,list,tuple调用它的时候它是不会执行的,真实的代码执行逻辑如下:

第1次:n = 1, 执行g=(add(n,i) for i in test())

第2次:n = 10,执行g=(add(n,i) for i in (add(n,i) for i in test())) )

g因为前面做过定义,每次需要把之前定义的带入,所以当n=10 的时候,g=(add(10,i) for i in (add(n,i) for i in test())) )),最终的执行结果是[20, 21, 22, 23]

注意点:

因为生成器就是等到用的(比如:打印或者next函数取值等)时候才会进行计算生成,所以等到最后打印的时候才开始计算(即在本程序最后一步的时候才开始计算),而之前所做的循环都是把表达式进行了计算,并没有真的代入数值进行计算。

当开始计算数据的时候,循环已经进行了两次,两次后n的值也因此变成了10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值