python基础(14):生成器、列表推导式(python3列表推导式)

网友投稿 642 2022-09-12

python基础(14):生成器、列表推导式(python3列表推导式)

python基础(14):生成器、列表推导式(python3列表推导式)

1. 生成器

什么是⽣成器?⽣成器实质就是迭代器。

在python中有三种⽅式来获取⽣成器:

1. 通过⽣成器函数

2. 通过各种推导式来实现⽣成器

3. 通过数据的转换也可以获取⽣成器

⾸先,我们先看⼀个很简单的函数:

def func():

  print("111")

  return 222

ret = func()

print(ret)

结果:

111

222

将函数中的return换成yield就是⽣成器

def func():

  print("111")

  yield 222

ret = func()

print(ret)

结果:

运⾏的结果和上⾯不⼀样,为什么呢?由于函数中存在了yield,那么这个函数就是⼀个⽣成器

函数。这个时候,我们再执⾏这个函数的时候,就不再是函数的执⾏了,⽽是获取这个⽣成器。

如何使⽤呢? 想想迭代器,⽣成器的本质是迭代器,所以,我们可以直接执⾏__next__()来执⾏以下⽣成器。

def func():

  print("111")

  yield 222

gener = func() # 这个时候函数不会执⾏. ⽽是获取到⽣成器

ret = gener.__next__() # 这个时候函数才会执⾏. yield的作⽤和return⼀样. 也是返回数据

print(ret)

结果:

111

222

那么我们可以看到,yield和return的效果是⼀样的,有什么区别呢? yield是分段来执⾏⼀个

函数,return呢? 直接停⽌执⾏函数。

def func():

  print("111")

  yield 222

  print("333")

  yield 444

gener = func()

ret = gener.__next__()

print(ret)

ret2 = gener.__next__()

print(ret2)

ret3 = gener.__next__() # 最后⼀个yield执⾏完毕. 再次__next__()程序报错, 也就是说. 和return⽆关了.

print(ret3)

结果:

111

Traceback (most recent call last):

222

333

  File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 55, in

444

  ret3 = gener.__next__() # 最后⼀个yield执⾏完毕. 再次__next__()程序报错, 也就是说. 和return⽆关了.

StopIteration

当程序运⾏完最后⼀个yield,那么后⾯继续进⾏__next__()程序会报错。好了⽣成器说完了,⽣成器有什么作⽤呢? 我们来看这样⼀个需求,老男孩向JACK JONES订

购10000套学⽣服,JACK JONES就比较实在,直接造出来10000套衣服。

def cloth():

  lst = []

  for i in range(0, 10000):

    lst.append("⾐服"+str(i))

  return lst

cl = cloth()

但是呢,问题来了。老男孩现在没有这么多学⽣啊,⼀次性给我这么多,我往哪⾥放啊. 很尴尬啊,最好的效果是什么样呢? 我要1套,你给我1套,⼀共10000套,是不是最完美的。

def cloth():

  for i in range(0, 10000):

    yield "⾐服"+str(i)

cl = cloth()

print(cl.__next__())

print(cl.__next__())

print(cl.__next__())

print(cl.__next__())

区别: 第⼀种是直接⼀次性全部拿出来,会很占⽤内存,第⼆种使⽤⽣成器,⼀次就⼀个. ⽤多少⽣成多少。⽣成器是⼀个⼀个的指向下⼀个,不会回去,__next__()到哪,指针就指到哪⼉,下⼀次继续获取指针指向的值。

接下来我们来看send⽅法,send和__next__()⼀样都可以让⽣成器执⾏到下⼀个yield。

def eat():

  print("我吃什么啊")

  a = yield "馒头"

  print("a=",a)

  b = yield "⼤饼"

  print("b=",b)

  c = yield "⾲菜盒⼦"

  print("c=",c)

  yield "GAME OVER"

gen = eat() # 获取⽣成器

ret1 = gen.__next__()

print(ret1)

ret2 = gen.

共3页: 上一页123下一页

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:备份还原Exchange2016电子邮件
下一篇:Exchange 2010 规划设计
相关文章

 发表评论

暂时没有评论,来抢沙发吧~