python的迭代器坑_python 入坑路-迭代器

迭代器

可以作用域for 循环的数据类型有以下几种:

一类是集合数据类型,如:list,tuple,dict,set,str 等:

一类是 generator ,包括生成器和带 yield 的生成器函数 generator function.

这些可以直接作用域for 循环的对象统称为可迭代对象:Iterable.

可以使用 isinstance() 判断对象是否是 Iterable 对象:

By the way: 可迭代就是可以 循环。可以循环的对象 Iterable

1 from collections importIterable2

3 print(isinstance([],Iterable))4

5 print(isinstance((),Iterable))6 print(isinstance("",Iterable))7 print(isinstance(123,Iterable))8

9 #输出

10 True11 True12 True13 False

生成器不但可以作用于 for 循环,还可以被 next()函数不断调用并返回下一个值

知道最好抛出 stopIteration 错误表示无法继续返回下一个值。

可以被 next() 函数调用并不断返回下一个值得对象称为 迭代器:Iterator

可以使用isinstance() 判断一个对象是否是 Iterator 对象:

1 a=isinstance((x for x in range(10)),Iterator)2 print(a)3

4 deffib(max):5 n,a,b=0,0,1

6 whileTrue:7 yieldb8 a,b=b,a+b9 n+=1

10 return "niubi"

11

12 b=fib(10)13 print(type(b))14 print(isinstance(b,Iterator))15

16 #输入

17 True18

19 True

by the way : 用 dir 查看可以调用的方法。

生成器都是 Iterable 对象,但是 list,dict str 虽然是Iterable,却不是Iterator

把list ,dict,str等Iterable 变成Iterator ,可以使用函数 Iter()

1 a2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]3

4 iter(a)5

6

7 a8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]9

10 type(a)11 list12

13 c=iter(a)14

15 type(c)16 list_iterator

你可能会问,为什么 list dict str 等数据类型不是一个 Iterator?

因为PYTHON 的Iterator 对象时一个数据留,

迭代器:可以看做是一个有序序列,但是却不能提前知道序列的长度,只有不断通过next()

函数实现 按需计算一下数据,所以Iterator的计算惰性,只有在需要返回下一个数据时才会计算

by the way:惰性计算,只有走到这一步才计算,不像列表已经计算好了

Iterator 甚至可以表示一个无限大的数据流。

小结:

凡是可以作用域for 循环的对象都是 Iterable 类型

凡是可以作用域next() 函数的对象都是Iterator类型,它表示一个惰性序列:

集合数量类型,如 list dict, str ,set 等是Iterable 但是不能Iterator,

可以通过 iter() 函数获得一个Iterator() 对象。

by the way: 在py 3.x  range(10)  range(0,10) 相当于迭代器

在py 2.x, range(10) 是生成一个0,1,2,3,4...9 列表, xrange 相当于 3.0 range()

python ,for  其实就是通过 next()  实现的,

1 for x in [1,2,3,4,5,,6]:2 pass

3

4

5 #等价于

6

7 it=iter([1,2,3,4,5,6])8 whileTrue:9 try:10 x=next(it)11 exceptStopterationg:12 break

by the way : 文件封装, for 循环 等很多底层都是用这个实现的。重要的概念,必须掌握。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值