yield 和 生成器(generator)

2024-06-10 17:44
文章标签 生成器 generator yield

本文主要是介绍yield 和 生成器(generator),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python3

迭代器

https://www.runoob.com/python3/python3-iterator-generator.html

#!coding:utf8#author:yqq
#date:2020/1/14 0014 15:21
#description:class MyNumber:def __init__(self, init_number = 1 , bound_number = 99999):self.n  = init_numberself.bound = bound_numberdef __iter__(self):  #实现  __iter__ 方法return self def __next__(self): #实现  __next__ 方法x = self.nif x > self.bound:raise StopIterationself.n += 1return  xdef main():num_iter = MyNumber(init_number=9, bound_number=888)print(  next(num_iter)  )print(  next(num_iter)  )print(  next(num_iter)  )# for i in num_iter:#     print(i)# while True:#     print(next(num_iter))while True:try:print(next(num_iter))except StopIteration:print('over')breakexcept  Exception as e:print(f'error: {e}')passif __name__ == '__main__':main()

yield 和 生成器(generator)

  • 列表生成器

    >>> [i for i in range(10)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  • 生成器函数

    #!coding:utf8#author:yqq
    #date:2020/1/14 0014 15:29
    #description:
    #  对于yield的理解:
    #      生成器函数遇到 yield, 立即返回, 并保存现场(保存了变量的值), 下次再次从yield后的语句执行
    #    换句话说: yield保存了函数执行过程中的 "中间状态"  下次再次从"中间状态" 继续执行def my_fib(nmax = 99):""":param nmax: 最大数, 防止无限生成下去:return:"""counter  =  nmaxa , b = 0, 1yield a   # 第一个数 0yield b   # 第二个数  1for i in range(counter):yield a + ba, b = b, a + bdef main():fib_gen = my_fib()# print(next(fib_gen))# print(next(fib_gen))# print(next(fib_gen))# print(next(fib_gen))# print(next(fib_gen))for n in fib_gen:print(n)passif __name__ == '__main__':main()
    

基于生成器的协程

使用 @asyncio.coroutine 修饰函数

此装饰器 已弃用 并计划觉得 Python 3.10 中移除。


import asyncio@asyncio.coroutine
def old_style_coroutine():print('old_style_coroutine()')yield from asyncio.sleep(1)async def main():await old_style_coroutine()asyncio.run( main() )

async 和 await

从 Python3.7开始 使用 async和await 代替 @asyncio.coroutineyield from

asyncio官方文档: https://docs.python.org/zh-cn/3/library/asyncio.html

https://www.cnblogs.com/dhcn/p/9032461.html

#!coding:utf8#author:yqq
#date:2020/1/14 0014 11:49
#description:import requests
import asyncio
import timeasync def test2(i):print('\n')print('------进入test2-------------')print('-------开始 await  other_test()------')r = await other_test(i)print('-------结束 await  other_test()------')print(i,r)print('----------结束test2------------------')print('\n')async def other_test(i):print('\n')print('-----------进入 other_test()-----------')print('开始 http  get 请求')r = requests.get(i)print('结束 http get请求')print(i)print('开始 休眠 4s')if 'sina' in i:await asyncio.sleep(5)  #挂起当前协程, 让出cpu给其他协程(继续事件循环)await asyncio.sleep(0.1)  #挂起当前协程, 让出cpu给其他协程(继续事件循环)# time.sleep(4)  #如果改成 time.sleep(4)  则完全是同步方式(顺序执行) 会阻塞事件循环print(f'\033[32m 结束 {i} 休眠 \033[0m')print(time.time()-start)print('--------结束other_test------------------')print('\n')return rurl = ["https://www.jd.com","https://www.sina.com","https://www.baidu.com"]print('开始创建事件循环 ')
loop = asyncio.get_event_loop()print('开始生成 task')
task = [asyncio.ensure_future(test2(i)) for i in url]start = time.time()print('开始运行事件循环')
loop.run_until_complete(asyncio.wait(task))print('\n')
print('结束运行事件循环')
endtime = time.time()-startprint(endtime)print('关闭事件循环')
loop.close()

异步echo_server

from curio import run, spawn
from curio.socket import *async def echo_server(address):sock = socket(AF_INET, SOCK_STREAM)sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)sock.bind(address)sock.listen(5)print('Server listening at', address)async with sock:while True:client, addr = await sock.accept()await spawn(echo_client, client, addr)async def echo_client(client, addr):print('Connection from', addr)async with client:while True:data = await client.recv(100000)if not data:breakawait client.sendall(data)print('Connection closed')if __name__ == '__main__':run(echo_server, ('',25000))

这篇关于yield 和 生成器(generator)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048839

相关文章

纸牌函数生成器

此模板用来生成纸牌类的测试数据,本人手打,不合理或缀余的地方希望大神指出。 T=10000(测试数据组数), t (两摞相等的牌,每摞牌的数量); 每张牌用A,2~9,T,J,Q,K;表示牌面大小; 用S,H,C,D;表示花色。 共52张牌。 #include<stdio.h>#include<time.h>#include<stdlib.h>#include<string.

【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程酒吧一群美女车展模特大屏幕视频改字AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

利用Mybatis-generator工具自动生成代码

配置JAVA环境变量; 执行生成代码之前,我们须要做的准备工作。  1、新建一个文件夹,作为我们的工作空间,例如:  D:\generator  注意:这里的路径不要带有中文字符,这是规范,即使带有中文字符不会出什么问题。  2、在 generator 这路径下  (1)放置 mybatis-generator-core-1.3.2.jar;  (2)放置 mysql-connector-ja

[Python]生成器和yield关键字

生成器和yield关键字 1.生成器介绍: 概述: ​ 它指的是 generator, 类似于以前学过的: 列表推导式, 集合推导式, 字典推导式… 作用: ​ 降低资源消耗, 快速(批量)生成数据. 实现方式: ​ 1.推导式写法. my_generator = (i for i in range(5)) ​ 2.yield写法. def get_generator():for i

Mybatis自动生成器的使用方式

文章目录 编写generator配置文件配置maven插件第一种启动方式第二种启动方式 编写generator配置文件 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration

【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程豪车劳斯莱斯库里南中控改名软件AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件 把AE模板导入AE软件 修改图片或文字 渲染出视频

【Python知识宝库】迭代器与生成器:高效处理大数据集

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、迭代器:逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器:按需生成数据的魔法1. 生成器的定义2. 创建生成器生成器函数生成器表达式 3. 生成器的优势 三、迭代器和生成器在处理

Mybatis 逆向生成工具mybatis-generator-core-1.3.2.jar的使用

mybatis-generator-core-1.3.2.jar用来生成我们的项目代码,今天分享一下,这个工具,神器之处,在于不仅仅生成dao,mapper还有service层,web层都可以根据数据库反射生成出来。上图 如图,使用mybatis,无非就用××××EntitySqlProvider或××××EntityMapper.xml两种形式书写sql语句,生成方法本文均提供 展开图

使用Mybatis Generator插件生成纯净代码,自定义扩展注释和注释,xml映射文件,不用修改源码!!!

先看效果: (基于Mybatis-generator-core-1.4.0) 生成模型(实体): 根据MySQL库中的tb_prod_info表字段及注释自动生成. package com.ezsyn.cloudstudy.product.dao.entity;import io.swagger.annotations.ApiModelProperty;import lombok.Gette