python---生成器对象[自定义迭代器],生成器表达式

目录

生成器对象

yield 关键字作用

生成器表达式


生成器对象

生成器本质还是迭代器,只不过是我们自己通过写代码产生的, 也有__iter__ 和__next__方法.

生成器对象也是节省空间存储的, 特性与迭代器对象一致.

当函数体代码中含有yield关键字时,第一次调用函数并不会执行函数体代码, 而是将函数变成了生成器. 验证方法: 是否含有iter() 和 next()方法..


def index():
    print('你还记得我吗?')
    yield 123
    yield 123, 111
    print('是不是忘记我了!!!')
    yield 666

没有调用之前 index函数只是一个普通函数

print(index)   # <function index at 0x00000265AAC060D0>

加括号调用并接受结果: 不执行代码 而是变成了生成器对象(迭代器)

res = index()
print(res)  # <generator object index at 0x000001B792F5E150>

变成生成器之后调用__next__就会开始执行函数体代码

print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())


# 你还记得我吗?
# 123
# (123, 111)
# 是不是忘记我了!!!
# 666

如果函数体代码中含有多个yield关键字  执行一次__next__返回后面的值并且让代码停留在yield位置 
再次执行__next__基于上次的位置继续往后执行到下一个yield关键字处
如果没有了 再执行也会报错  StopIteration

# Traceback (most recent call last):
#   File "C:/me/JetBrains/pythonProject/迭代器生成器/生成器.py", line 14, in <module>
#     print(res.__next__())
# StopIteration

yield 类似于普通函数中的return关键字, yield后边有多少数据便返回多少数据. 

yield 关键字作用

1. 在函数体代码中出现, 可以将函数变成生成器.

2. 在执行过程中, 可以将后面的值返回去, 类似于return.

3. 可以暂停住代码的运行

4.还可以接受外界的传值(了解)

 
def study(name):
    print(f'{name}准备学习')
    while True:
        course = yield
        print(f'{name}正在学习{course}')
res = study('yietong')

res.__next__()
res.__next__()
res.__next__()
res.__next__()

res.send('English')
res.send('Chinese')

# yietong准备学习
# yietong正在学习None
# yietong正在学习None
# yietong正在学习None
# yietong正在学习English
# yietong正在学习Chinese

生成器表达式

res = (i for i in 'yietong')
print(res)  # <generator object <genexpr> at 0x0000013764C2E150>

print(res.__next__())  # y
print(res.__next__())  # i
print(res.__next__())  # e
print(res.__next__())  # t
print(res.__next__())  # o

生成器内部的代码只有在调用__next__迭代取值的时候才会执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值