python 高级特性 (生成器 & yield关键字)

本文深入探讨Python中的生成器概念,包括列表生成式与生成器表达式的区别,通过具体实例讲解如何使用生成器解决内存占用问题,并展示了Fibonacci数列等经典案例的生成器实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成器

读取生成器元素的两种方式:

g.next()
for 循环读取;(生成器实质上是可迭代对象)
1. 列表生成式,当生成元素即打印,会占用内存;

[i for i in range(10000000)]    #打印i会占用系统内存
g= (i for i in range(1000000))  #如果给予赋值的话 就变成生成器
g.next()            #使 g.next() 就可调用生成器的值,每次运行只产生一个值 这样就不占用系统内存了 

下面是一些生成器使用的例子:

>>> g = (i**2 for i in range(3))          
>>> print g.next()
0
>>> print g.next()
1
>>> print g.next()
4
>>> print g.next()               #当没有第四个值的时候在调用生成器就会报错!!!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 
>>> g = (i**2 for i in range(3))
>>> for i in g:          #生成器的值也可以使用for循环来获取
...     print i
... 
0
1
4

Fibonacci数列:
1, 1, 2, 3, 5, 8, 13, 21……..

def fib(max):
n, a,b = 0, 0, 1
while n < max:
print b
a, b = b, a+b          
n += 1
fib(10)

python中两值交换

In [1]: x = 3
In [2]: y =4
 先构造右边的元组(y,x),即(4,3);
 然后将元组的值依次赋给x,y;
In [3]: x, y = y, x
In [4]: print x
4
In [5]: print y
3
In [7]: x,y = (4,3)
yield关键字
生成fib数列的函数,max 代表最终生成的数列元素个数:
def fib(max):
    n, a,b = 0, 0, 1
    while n < max:
    yield b             #yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器
    a, b = b, a+b
    n += 1
g = fib(10)
for i in g:
    print i
yield 一些使用的例子:
def test_yield():
    print "first"
    yield 1
    print "second"
    yield 2
    print "third"
    yield 3
g = test_yield()
print g.next()  
print g.next()
print g.next()

返回值

first
1
second
2
third
3
生成器实战应用: 实现生产者消费者模型(有无缓冲区)

无缓冲区的:

#!/usr/bin/env pyhton
#coding:utf-8

def consumer(name):
    print "%s 准备买辣条" %(name)
    while True:
        kind = yield
        print "客户[%s]买了[%s]口味的辣条......" %(name, kind)

----------

import time            #倒入时间模块
def producer(name):
    # c1 和 c2 是生成器对象;
    c1 = consumer("用户1")
    c2 = consumer("用户2")
    c1.next()
    c2.next()
    print "准备制作辣条......."
    for i in ["酸甜", "五香", "微辣", "特辣"]:
    time.sleep(1)
    print "[%s]制作了[%s]口味的辣条, 准备提供给消费者....." %(name, i)
    c1.send(i)
    c2.send(i)
producer("厨师")

有缓冲区的:

#!/usr/bin/env pyhton
#coding:utf-8

latiao_agency = []
def consumer(name):
    print "%s 准备买辣条" %(name)
    while True:
        kind = yield
        latiao_agency.remove(kind)
        print "客户[%s]买了[%s]口味的辣条......" %(name, kind)
import time
## *kind 是可变参数, 实质 kind 是元组;
def producer(name, *kind):
    print "准备制作辣条......."
    for i in kind:
        time.sleep(1)
        print "[%s]制作了[%s]口味的辣条, 准备提供给消费者....." %(name, i)
        latiao_agency.append(i)

producer("厨师", "酸甜", "五香", "微辣", "特辣")

c1 = consumer("客户1")
c1.next()
c1.send("五香")

print "目前本店辣条口味:",
for i in latiao_agency:
    print i,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值