生成器 生成器函数

生成器generator

1. 定义:能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。
2. 作用:在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空间。数据量越大,优势越明显。
3. 以上作用也称之为延迟操作或惰性操作,通俗的讲就是在需要的时候才计算结果,而不是一次构建出所有结果。

生成器函数

1. 定义:含有yield语句的函数,返回值为生成器对象。
2. 语法

– 创建:
def 函数名():

yield 数据

– 调用:
for 变量名 in 函数名():
语句
3. 说明:
– 调用生成器函数将返回一个生成器对象,不执行函数体。
– yield翻译为”产生”或”生成”
4. 执行过程:
(1) 调用生成器函数会自动创建迭代器对象。
(2) 调用迭代器对象的__next__()方法时才执行生成器函数。
(3) 每次执行到yield语句时返回数据,暂时离开。
(4) 待下次调用__next__()方法时继续从离开处继续执行。
5. 原理:生成迭代器对象的大致规则如下
– 将yield关键字以前的代码放在next方法中。
– 将yield关键字后面的数据作为next方法的返回值。
“”"
yield
练习:exercise01

"""
class MyRange:
    """
        可迭代对象
    """
    def __init__(self, stop):
        self.__stop = stop

    # 程序执行过程:
    #    调用不执行
    #    调用__next__才执行
    #    到yield暂时离开
    #    再次调用__next__继续执行
    #    ...
    # 程序执行原理: "你看见的代码,实际不是这个样子"
    #    将yield关键字以前的代码定义到next方法中
    #    将yield关键字以后的数据作为next方法返回值
    # def __iter__(self):
    #     print("准备数据")
    #     yield 0
    #
    #     print("准备数据")
    #     yield 1
    #
    #     print("准备数据")
    #     yield 2
    #
    #     print("准备数据")
    #     yield 3
    #
    #     print("准备数据")
    #     yield 4

    def __iter__(self):
        begin = 0
        while begin < self.__stop:
            yield begin# 暂时离开,再次调用继续执行
            begin += 1

mr = MyRange(10)
iterator = mr.__iter__()
while True:
    try:
        # 2. 获取下一个元素
        item = iterator.__next__()
        print(item)
    # 3. 如果没有元素则结束循环
    except StopIteration:
        break



# for item in MyRange(5):
#     print(item)  # 0 1 2 3 4

# 循环一次  计算一个  返回一个
# for item in MyRange(99999999999999999999999999999999999999999):
#     print(item)
"""
    生成器表达式
    练习:exercise05
"""
list01 = [43, 4, 54, 5, 66, 77]

# 将list01中所有元素增加10之后,存入list02
# list02 = []
# for item in list01:
#     list02.append(item + 10)

list02 = [item + 10 for item in list01]
# for item in list02:
#     print(item)
# -------------------------------------------------
# -------------------------------------------------
# def get_elements():
#     for item in list01:
#         yield item + 10

# generate01 = (item + 10 for item in list01)
# for item in generate01:
#     print(item)

for item in (item + 10 for item in list01 if item % 2):
    print(item)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值