`
wx1568037608
  • 浏览: 34757 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

python yield 和 yield from用法总结

 
阅读更多

#例1. 简单输出斐波那契數列前 N 个数
#缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列
#要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。
def fab1(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b,end=' ')
        a, b = b, a + b
        n = n + 1
fab1(5)  

 

#例 2. 
#缺点:该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,
#最好不要用 List 来保存中间结果,而是通过 iterable 对象来迭代   
def fab2(max): 
    n, a, b = 0, 0, 1 
    L = [] 
    while n < max: 
        L.append(b) 
        a, b = b, a + b 
        n = n + 1 
    return L

 

#例3 
#说明:带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,
#调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!
#在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,
#下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,
#于是函数继续执行,直到再次遇到 yield。
def fab3(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        # print b
        a, b = b, a + b
        n = n + 1
f=fab3(5)
print("f是一个可迭代对象,并没有执行函数")
print(f)
print('fab3返回的是一个iterable 对象,可以用for循环获取值')
for n in f:
    print(n)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#例4:
#说明:yield from iterable本质上等于for item in iterable: yield item的缩写版   
 
def f_wrapper1(f):
    for g  in f:
        yield g
wrap = f_wrapper1(fab3(5))
for in wrap:
    print(i,end=' ')
 
print('\n使用yield from代替for循环')
def f_wrapper2(f):
     yield from f#注意此处必须是一个可生成对象
wrap = f_wrapper2(fab3(5))
for in wrap:
    print(i,end=' ')
print('\n---------------------')
 
 
print('yield from包含多个子程序')
def g(x):
    yield from range(x, 0, -1)
    yield from range(x)
print(list(g(5)))
for g  in g(6):
    print(g,end=',')
     
     
print('\n---------------------')  注意红色部分就是替代的部分,yield from iterable本质上等于for item in iterable: yield item的缩写版   

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#例5 利用yield from语句向生成器(协程)传送数据
#传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。
#如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,换回生产者继续生产,效率极高:
def  consumer_work(len):
    # 读取send传进的数据,并模拟进行处理数据
    print("writer:")
    w=''
    while True:
        w = yield w    # w接收send传进的数据,同时也是返回的数据
        print('[CONSUMER] Consuming %s...>> ', w)
        w*=len #将返回的数据乘以100
        time.sleep(0.1) 
def consumer(coro):
    yield from coro#将数据传递到协程(生成器)对象中
 
 
def produce(c):
    c.send(None)# "prime" the coroutine
    for in range(5):
        print('[Produce] Producing %s----', i)
        w=c.send(i)#发送完成后进入协程中执行
        print('[Produce] receive %s----', w)
    c.close()
     
c1=consumer_work(100)
produce(consumer(c1))<br><br>执行结果:<br>writer:<br>[Produce] Producing %s---- 0<br>[CONSUMER] Consuming %s...>>  0<br>[Produce] receive %s---- 0<br>[Produce] Producing %s---- 1<br>[CONSUMER] Consuming %s...>>  1<br>[Produce] receive %s---- 100<br>[Produce] Producing %s---- 2<br>[CONSUMER] Consuming %s...>>  2<br>[Produce] receive %s---- 200<br>[Produce] Producing %s---- 3<br>[CONSUMER] Consuming %s...>>  3<br>[Produce] receive %s---- 300<br>[Produce] Producing %s---- 4<br>[CONSUMER] Consuming %s...>>  4<br>[Produce] receive %s---- 400<br><br>yield from一般掌握这两种用法即可
分享到:
评论

相关推荐

    python yield和Generator函数用法详解

    此外,Generator函数还可以与Python的`yield from`语法、`asyncio`库中的协程以及生成器表达式等高级特性结合使用,实现更复杂的异步和并发操作。 总结来说,Python的`yield`关键字和Generator函数提供了一种高效的...

    Python yield的用法实例分析

    在这里,`yield from`(Python 3.3+)或`yield`可以用来暂停协程的执行,等待其他任务完成,从而实现非阻塞的I/O操作。 总结起来,Python的`yield`关键字是生成器的核心,它使得函数能够以更灵活的方式生成序列,...

    Python yield 使用方法浅析

    ### Python `yield` 使用方法浅析 #### 一、引言 在Python中,`yield` 是一个强大的关键字,它可以将一个...总之,`yield` 和生成器是Python中非常强大且实用的功能,掌握了它们,你就能够编写出更加优雅高效的代码。

    通过实例简单了解Python中yield的作用

    在Python编程语言中,`yield`关键字是一个非常特殊的功能,它在函数中使用时将该函数转换为一个生成器(generator)。...理解`yield`的工作原理和用法,可以帮助开发者编写出更高效、更灵活的代码。

    python协程说明文档

    Python协程详解 作为一个专业的IT行业大师,我将从给定的文件中生成...yield from x表达式对x对象所做的第一件事是,调用iter(x),从中获取迭代器,因此,x可以是任何可迭代的对象,这只是yield from最基础的用法。

    python_cheatsheet_完美总结.pdf

    Python 3引入了yield from语句,简化了生成器之间的委托,从而使得协作式并发编程更加简单。 17. async和await语法 Python 3.5版本引入了async和await关键字,从而支持异步编程,这使得开发非阻塞IO密集型应用成为...

    python-3_pythondocs中文_python3.8.2文档

    这份文档提供了全面的指南、教程和参考材料,帮助开发者深入理解Python的特性和用法。 首先,Python 3.8.2引入了一些重要的语法更新和改进。例如,赋值表达式(walrus operator :=)允许在条件语句中同时检查和赋值...

    python2/python3

    7. **yield from**:Python 3引入了`yield from`语句,用于将一个生成器的元素直接传递给另一个生成器。 8. **类型注解**:Python 3.5引入了类型注解,允许程序员为函数参数和返回值添加类型信息,以提高代码的...

    Python 3.5.0a2官方文档(Mobi + epub)

    这些官方文档详细阐述了Python 3.5.0a2的所有新特性、语法变化、标准库的更新以及模块的用法,对于学习和开发Python 3.5项目来说是不可或缺的资源。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅,深入理解...

    python-3.7-docs-html

    3. **异步生成器(Asynchronous Generators)**:Python 3.7 引入了异步生成器,允许在 `asyncio` 库中使用 `yield from` 语法,这使得异步代码的编写更加灵活和高效。 4. **更安全的随机数生成**:`random` 模块在...

    Python核心编程(第3版)源码

    14. **Python 3的新特性**:对比Python 2和Python 3的区别,着重介绍Python 3中的新功能和改进,如print函数、新的字符串编码、yield from等。 通过阅读和实践《Python核心编程(第3版)》的源代码,读者可以系统地...

    Thinking_In_Python.pdf_python_thinkinginpython_

    - **模块导入**:学习如何使用`import`引入外部模块,以及`from...import`和`import *`的用法。 4. **面向对象编程**: - **类与对象**:理解面向对象的基本概念,如何定义类,以及类的实例化过程。 - **继承与...

    14张全套Python学习思维导图.zip

    Python是一种广泛使用的高级编程语言,以其简洁明了的语法和强大的功能而闻名。这14张全套Python学习思维导图涵盖了Python的基础到进阶的知识点,是初学者和进阶者提升技能的重要参考资料。 1. **基础语法** - ...

    Python生成器generator原理及用法解析

    生成器还有其他高级用法,如生成器表达式和yield from。生成器表达式类似于列表推导式,但返回一个生成器而不是列表,例如: ```python squares = (x**2 for x in range(10)) ``` `yield from`语法可以将一个生成...

    python速查表

    Python速查表是一种非常实用的工具,...对于初学者,速查表是学习过程中不可或缺的辅助工具,帮助他们理解和记忆Python的各种特性和用法。因此,保持一份详尽的Python速查表在手边,对提高开发效率和学习进度大有裨益。

    Python官方教程中文版3.4.1-带标签

    例如,字典的`view`对象提供了一种查看和操作字典内容的新方式,而`yield from`语句则简化了生成器的嵌套。同时,集合推导式(set comprehension)使得创建集合变得更直观,类似于列表推导式。 在错误处理方面,`...

    Python 3.6.1 Documentation

    Python 3.6.1是Python编程语言的一个重要版本,其官方文档详尽地涵盖了该版本的各种特性、语法和库的使用。...通过阅读和理解这些文档,开发者可以更好地掌握Python 3.6.1的特性和用法,编写出高效、可靠的代码。

Global site tag (gtag.js) - Google Analytics