python技术分享_Python技术分享—生成器

原标题:Python技术分享—生成器

生成器

41ff835c08d840a3bc29899dd70b9087.jpeg

有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的。比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表内,这是粗暴的方式,有如此大的内存么?如果元素可以按照某种算法推算出来,需要就计算到哪个,就可以在循环的过程中不断推算出后续的元素,而不必创建完整的元素集合,从而节省大量的空间。在Python中,这种一边循环一边计算出元素的机制,称为生成器:generator。

生成生成器:

```

g = (x * x for x in range(1, 4))

g

at 0x1022ef630>

```

可以通过next()函数获得generator的下一个返回值,这点和迭代器非常相似:

```

next(g)

1

next(g)

4

next(g)

9

next(g)

Traceback (most recent call last):

File "", line 1, in

next(g)

StopIteration

------------------------------------------------

但更多情况下,我们使用for循环。

for i in g:

print(i)

```

除了使用生成器推导式,我们还可以使用yield关键字。

```

def createNums():

print("----func start------")

a,b = 0,1

for i in range(5):

# print(b)

print("--1--")

yield b

print("--2--")

a,b = b,a+b # a,b = 1, 1 a,b = 1,2

print("--3--")

print("----func end------")

g= createNums()

next(g) # 如果想得到yield的值,可以打印next(g)

```

在 Python中,使用yield返回的函数会变成一个生成器(generator)。 在调用生成器的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行。

```

# 斐波那契函数

def fibonacci(n):

a = 0

b = 1

counter = 0

while True:

if counter > n:

return

yield a # yield让该函数变成一个生成器

a, b = b, a + b

counter += 1

fib = fibonacci(10) # fib是一个生成器

print(type(fib))

for i in fib:

print(i, end=" ")

```

生成器是可以循环的,相比next来说,for循环更友好

```

a = createNums()

这两种取值方式是一样的!!!

a.__next__()

next(a)

for i in a:

print(i)

```

send

```

def test():

i = 0

while i<5:

temp = yield i

print(temp)

i+=1

t = test()

next(t)

next(t)

t.send("juran")

next(t)

--------------------------------------------

t = test()

t.send("juran")

Traceback (most recent call last):

File "/Users/binbin/Desktop/Python/demo.py", line 179, in

t.send("juran")

TypeError: can't send non-None value to a just-started generator

如何解决这个错误?

> next(t)

t.send("juran")

> send(None)

生成器的应用

```

实现多任务

```

def test1():

while True:

print("--1--")

yield None

def test2():

while True:

print("--2--")

yield None

t1 = test1()

t2 = test2()

while True:

next(t1)

next(t2)

```

此文来源于微博和今日头条:逻二妞,转载请注明出处,谢谢

推荐阅读:

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值