Python 生成器、推导式及匿名函数

一、生成器

1.1 初识生成器

什么是生成器?这个概念比较模糊,各种文献都有不同的理解,但是核心基本相同。生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念。不是相同么?为什么还要创建生成器?生成器和迭代器也有不同,唯一的不同就是:迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来的,(比如文件句柄,iter([1,2,3])。生成器是需要我们自己用python代码构建的工具。最大的区别也就如此了。

1.2 生成器的构建方式

在python中有三种方式来创建生成器:

  1. 通过生成器函数
  2. 通过生成器推导式
  3. python内置函数或者模块提供(其实1,3两种本质上差不多,都是通过函数的形式生成,只不过1是自己写的生成器函数,3是python提供的生成器函数而已)

1.3 生成器函数

我们先来研究通过生成器函数构建生成器。

首先,我们先看一个很简单的函数:

def func():
    print(666)
    return 777
ret = func()
print(ret)
#result
666
777

将函数中的return换成yield,这样func就不是函数了,而是一个生成器函数

def func():
    print(11)
    yield 22

我们这样写没有任何的变化,这是为什么呢? 我们来看看函数名加括号获取到的是什么?

def func():
    print(666)
    yield 777
ret = func()
print(ret) # <generator object func at 0x00000273DDDBEF68>

运行的结果和最上面的不一样,为什么呢?? 由于函数中存在yield,那么这个函数就是一个生成器函数.
我们在执行这个函数的时候.就不再是函数的执行了.而是获取这个生成器对象,那么生成器对象如何取值呢?
之前我们说了,生成器的本质就是迭代器.迭代器如何取值,生成器就如何取值。所以我们可以直接执行next()来执行以下生成器

def func():
    print("666")
    yield 777
gener = func()  # 这个时候函数不会执⾏. ⽽是获取到⽣成器
ret = gener.__next__()  # 这个时候函数才会执⾏
print(ret) # 并且yield会将func生产出来的数据 777 给了 ret。 
# result
666
777

并且我的生成器函数中可以写多个yield。

def func():
    print("666")
    yield 777
    print("888")
    yield 555
gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__() # 最后⼀个yield执⾏完毕. 再次__next__()程序报错,StopIteration
print(ret3)
# result
666
777
888
555

当程序运行完最后一个yield,那么后面继续运行next()程序会报错,一个yield对应一个next,next超过yield数量,就会报错,与迭代器一样。

yield与return的区别:

  • return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。
  • yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。

举例

我们来看一下这个需求:你向楼下卖小笼包的老板订购了300个包子,包子铺老板非常实在,一下就全部都做出来了

def eat():
    list1 = []
    for i in range(1,301):
        list1.append('小笼包'+str(i))
    return list1
e = eat()
print
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值