## 可迭代
l =[ i for i inrange(10)]# l是可迭代的,但不是迭代器for idx in l:print(idx)# range是个迭代器for i inrange(5):print(i)
列表是可迭代对象,但不是迭代器。iter()方法可以将可迭代对象转化为迭代器
```python
l =[1,2,3,4]print(l.__iter__())# iter()触发__next__()方法print(iter(l))
r =iter(l)print(next(r))print(next(r))print(r.__next__())
通过isinstance判断是可迭代对象、是否可迭代
iterable和iterator可以通过iter函数转换
语法:isinstance(iter(‘abc’), Iterator)
# isinstance--判断某个变量是否是一个实例# 判断是否课可迭代from collections import Iterable
from collections import Iterator
l =[1,2,3,4,5]# 判断是否是可迭代对象print(isinstance(l, Iterable))# 判断是否可迭代print(isinstance(l, Iterator))
ll =iter(l)print(isinstance(ll, Iterator))>TrueFalseTrue
## 直接使用生成器
L =[x * x for x inrange(10)]# 放在中括号中是列表生成器
g =(x * x for x inrange(10))# 放在小括号中是生成器print(type(L))print(type(g))><class'list'><class'generator'>
# for循环调用生成器deffib(max):
n, a, b =0,0,1# 注意写法while n <max:print(b)
a, b = b, a + b # 注意写法
n +=1return'Done'
fib(5)>11235
# 斐波那契额数列的生成器写法deffib(max):
n, a, b =0,0,1# 注意写法while n <max:yield b
a, b = b, a + b # 注意写法
n +=1# 需要注意,爆出异常是的返回值是return的返回值return'Done'
g = fib(5)for i inrange(6):
rst =next(g)print(rst)>11235.....
StopIteration: Done
defget_gen():for i inrange(4):
r =yield i
print(r)print('*'*20)
res = get_gen()print(next(res))# send() 与生成器交互
res.send(5)print(next(res))# throw() 抛出异常,可自定义异常类型
res.throw(Exception,"测试throw()函数自定义异常类型")print(next(res))# close()关闭生成器
res.close()print(next(res))