python基础--生成器和迭代器

1. 迭代器

1.1 定义

  • 可迭代对象(Iterable): 直接作用于for循环的变量,内部实现了__iter__()方法
  • 迭代器(Iterator): 不但可以作用于for循环,还可以被next调用,内部实现了__iter__()和__next__()方法
  • list是典型的可迭代对象,但不是迭代器
## 可迭代
l = [ i for i in range(10)]

# l是可迭代的,但不是迭代器
for idx in l:
    print(idx)

# range是个迭代器
for i in range(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))

>True
 False
 True

2. 生成器

2.1 定义

  • 生成器(generator):一边循环一边计算的机制/算法,存储计算规则节约内存,提高性能。
  • 需要满足三个条件:
    1. 每次调用都生产出for循环需要的下一个元素
    2. 如果达到最后一个,爆出StopIteration异常
    3. 可以被next函数调用
  • 生成器的典型用法是在for中使用,典型生成器就是range

2.2 生成器创建

## 直接使用生成器
L = [x * x for x in range(10)] # 放在中括号中是列表生成器
g = (x * x for x in range(10)) # 放在小括号中是生成器

print(type(L))
print(type(g))

><class 'list'>
 <class 'generator'>

  • 创建生成器
    - 函数中包含yield,则叫generator
    - next调用,遇到yield返回
# 生成器案例--函数

def odd():
    print("Step 1")
    yield 1
  print("Step 2")
    yield 2
  print("Step 3")
    yield 3
  return None

s0 = odd()

s1 = next(s0)
print(s1)
s2 = next(s0)
print(s2)
s3 = next(s0)
print(s3)

>Step 1
 1
 Step 2
 2
 Step 3
 3

# for循环调用生成器
def fib(max):
    n, a, b = 0, 0, 1 # 注意写法
  while n < max:
        print(b)
        a, b = b, a + b  # 注意写法
  n += 1

  return 'Done'

fib(5)


>1
 1
 2
 3
 5
# 斐波那契额数列的生成器写法
def fib(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 in range(6):
    rst = next(g)
    print(rst)
   
>1
 1
 2
 3
 5
 .....
 StopIteration: Done

3. 生成器和迭代器区别

  • 生成器是迭代器的一种。生成器相比迭代器多了3种方法:
    - send(): 发送数据,可以和生成器进行数据交互
    - close(): 关闭生成器
    - throw():抛出 ValueError异常

def get_gen():
    for i in range(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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值