【python基础】十、Python 生成器 迭代器

生成器

推导式的弊端

受内存限制,列表容量 有限
而且,创建一个包含100万元素的列表,却只是用其中某几个,
浪费空间。
所以 如果列表元素可以按照某算法推算出来,在后续使用中不断推算,
边循环,边计算 --> 生成器 generator

三个创建、三种使用

  • 创建生成器
# 1 列表推导式 --> 列表生成器
# [0,3,6,9,12,15,18,21,....,27]

nl_1 = [x * 3 for x in range(20)]
print(type(nl_1))   # <class 'list'>
# 生成器:
gl_1 = (x * 3 for x in range(7))
print(type(gl_1))   # <class 'generator'>

  • 使用生成器
# 使用方法一
print(gl_1.__next__())

# 使用方法二
print(next(gl_1))

# StopIteration 超出 则 抛出 异常
while True:
    try:
        g = next(gl_1)
    except Exception as e:
        print(e)
        break
    else:
        print(g)
  • 创建 yield 生成器
# yield 关键字
def func():
    n = 0
    while True:
        n += 1
        yield n

g = func()
print(g)
print(next(g))
  • 如果生成器需要往里送值使用send方法
def gen():
    i = 0
    while i < 5:
        temp = yield i
        print('temp ', temp)
        i += 1
    return None
g=gen()
g0 = g.send(None)
print(g0)
g1 = g.send('呵呵')
print(g1)
g2 = g.send('oo')
print(g2)

进程 线程 协程

  • 一个线程下面 多个协程
def task_1(n):
    for i in range(n):
        print('Doing task 1, coding ', i)
        yield None  # 增加yield 利用其 暂停功能


def task_2(n):
    for i in range(n):
        print('我正在做第二个任务,现在是 ', i)
        yield


# 任务1、2 交替运行
g1 = task_1(8)
g2 = task_2(5)

while True:
    try:
        next(g1)
        g2.__next__()
    except:
        break
  • 生成器 generator

    1. 列表生成式 产生
      • g = [x for x in range(20)]
    2. 函数 yield
  • 产生元素

    1. next(generator)
    2. generator.next()
    3. generator.send(xx)
  • 应用:协程 --> 提高效率

可迭代的对象

  1. 生成器
  2. 元组 列表 集合 字典 字符串
  • 如何判断可迭代
from collections import Iterable
bl = isinstance(list, Iterable)
b2 = isinstance('abc', Iterable)
b3 = isinstance(generator, Iterable)

迭代器 Iterator

迭代 是访问集合元素的一种方式,迭代器可以记住遍历的位置
迭代器 从第一个元素开始,知道元素全部访问结束
迭代器 只能向后
可以被 next() 调用 并不断返回下一个

  • 可迭代的 不一定就是 迭代器

    • 列表 可迭代。 但不是 迭代器 需 使用 iter
lt1 = [1,2,4,5,6]
it_lt1 = iter(lt1)

print(next(it_lt1))
print(next(it_lt1))
print(next(it_lt1))   

在b站学习中

个人主页

学习链接

欢迎 批评 指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值