04_08、生成器

一、迭代取值和索引取值的对比

迭代取值是除了索引取值之外的第二种取值方法

迭代取值:

1. 不依赖于索引取值,__next__()取值
2. 不能重复取值,只能从左往右一个一个取值

索引取值:

1. 必须要是一个容器类型
2. 可以重复取值

二、生成器

生成器就是自定义的迭代器

函数里面有yield关键字之后,函数调用之前还是函数,一旦调用函数变成了生成器

一旦是生成器,就可以__next__取值了

函数中的yield关键字的用法:__next__一下,走一个yield,光标就停在了yield
如果再次__next__,会从上一次停留的yield位置继续往下走

 

三、练习生成器实现range功能

复制代码
def my_range(start, stop=None, step=1):
    if not stop:
        stop = start
        start = 0
    while start < stop:
        yield start
        start += step


for i in my_range(1, 9, 3):
    print(i)
复制代码

 

四、yield传值

只需了解:res.send(‘值’)可以给yield传值即可

此处send有两处操作:

1是调用res.__next__,把函数变成可迭代对象

2是把值传给yield

复制代码
def index(name):
    print('%s 准备干饭' % name)
    while True:
        food = yield # yield后不写默认为None
        print('%s 开干 %s' % (name, food))

res=index('ly')
res.__next__()
# res.__next__()

res.send('苹果')
res.send('橘子')
复制代码

五、yield和return的对比

yield:

1. 函数内遇到yield关键字把函数变成了生成器
2. yield 也可以返回值,并且支持返回多个(元组形式)
3. 遇到yield,函数不会结束,而是"停住"
4. yield 也支持传值


return

1. 后面可以跟返回值,也支持返回多个(元组形式)
2. 函数遇到return,会立马结束

 

posted @   三三得九86  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示