Python入门-迭代器和生成器
迭代演示
# 传统数据生成缺陷演示,编号操作未全部使用,会占用内存
#合适的做法,是需要的时候再生产,而不是全部生成好了再用
def generator(maxnum):
print("【代码执行前】")
num = ("数据-{num}".format(num = i) for i in range(maxnum))
print("【代码执行后】")
return num def yield_demo(maxnum):
for i in range(maxnum):
yield "yield数据-{num}".format(num=i) def func_old():
for i in generator(5):
print(i)
def func_new():
for i in yield_demo(5):
print(i) if __name__ == '__main__':
print("============传统自定义方法=========")
print("【代码执行前】")
func_old()
print("【代码执行后】") print("============下面为yield方法=========")
print("【代码执行前】")
func_new()
print("【代码执行后】") #yield是python的关键字,作用与return相似
"""
============传统自定义方法=========
【代码执行前】
【代码执行前】
【代码执行后】
数据-0
数据-1
数据-2
数据-3
数据-4
【代码执行后】
============下面为yield方法=========
【代码执行前】
yield数据-0
yield数据-1
yield数据-2
yield数据-3
yield数据-4
【代码执行后】
"""
演示2
def yield_demo():
print("【yield】代码开始执行")
res = yield "yield数据"
print("【yield】代码执行完毕",res)
yield res
def func_new():
res = yield_demo() # 获取生成器对象,内部包含yield
print("输出生成器对象--默认方法:", res)
print("============下面为yield方法=========") print("输出生成器对象-next方法:", next(res)) #获取返回值
print("向yield发送数据-send方法:", res.send(8)) #发送数据给yield func_new()
"""
输出生成器对象--默认方法: <generator object yield_demo at 0x000001D9825CE970>
============下面为yield方法=========
【yield】代码开始执行
输出生成器对象-next方法: yield数据
【yield】代码执行完毕 8
向yield发送数据-send方法: 8
"""
使用yield生成斐波那契数列
# 根据另外一个生成器创建操作序列
def fibonacci(max=99):
a, b = 0, 1
while a < max:
# print(a, end=",")
yield b
a, b = b , a+b
def fibo_yield(func):
yield from func
if __name__ == '__main__':
# fibonacci()
res = fibo_yield(fibonacci(66))
for i in res:
print(i, end=",")
#1,1,2,3,5,8,13,21,34,55,89,
yield异常处理
# 使用contextlib模块,进行上下文管理 from contextlib import contextmanager
class Message:
def send(self, info):
print("消息发送中")
@contextmanager
def message_wrap():
class __Connect:
def build(self):
print("connect:建立网络连接")
return False def close(self):
print("connect:关闭网络连接")
try:
conn = __Connect()
if conn.build():
yield Message() #获取下一个实例 else:
yield None
except Exception as e:
print("except连接异常:", e)
finally:
conn.close()
if __name__ == '__main__':
with message_wrap() as m:
m.send("www.baidu.com")
"""
connect:建立网络连接
except连接异常: 'NoneType' object has no attribute 'send'
connect:关闭网络连接
"""
yield异常,closeing模块
from contextlib import contextmanager,closing
class Connect:
def __init__(self):
print("connect:开始建立连接")
def send(self, info):
print("消息发送中")
def close(self):
print("connect:关闭网络连接") if __name__ == '__main__':
with closing(Connect()) as c: #自动关闭功能支持
print("消息发送:www.baidu.com") """
消息发送:www.baidu.com
connect:关闭网络连接
"""
Python入门-迭代器和生成器的更多相关文章
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
- Python之迭代器和生成器
Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...
- 【Python】迭代器、生成器、yield单线程异步并发实现详解
转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...
- python的迭代器、生成器、装饰器
迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...
- Python之迭代器,生成器
迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...
- python之迭代器、生成器与面向过程编程
目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...
- day13 python学习 迭代器,生成器
1.可迭代:当我们打印 print(dir([1,2])) 在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...
- Python之迭代器及生成器
一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...
随机推荐
- CF1428B题解
打比赛的时候sb了,用了一个似乎原本可以不用的东西来找环... 首先,根据题意,我们可以连成一张图,而蛇能不能回到自己的家, 只需要在一个环上就行了. 问题是怎么找环,我用了 Tarjan... 具体 ...
- .NET 6学习笔记(2)——通过Worker Service创建Windows Service
通过Visual Studio中的Windows Service模板,我么可以创建.NET Framework版本的Windows Service,网络上对此已有详细且丰富的各路教程.但在我们升级到. ...
- ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用
与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式.第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的 ...
- ssh-ssl编译安装
升级前准备 #下载所需依赖包#yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-d ...
- EasyUI 之datagrid 使用 【DataGrid属性解释】
可选的参数 DataGrid 属性 覆写了 $.fn.datagrid.defaults. 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls ...
- Chrome的安装卸载 以及 chromedriver配置
1终端 将下载源加入到列表 sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ ...
- B树、B+树、B*树三者的对比详解
转载至:https://www.2cto.com/database/201805/745822.html 对比 B+树是B树的变体,B*树又是B+树的变体,是一脉相承法治国拉的,不断解决新一阶段的问题 ...
- linux-安装zookeeper及相关操作
下载两个安装包并解压: 配置jdk环境变量: [root@VM-0-10-centos zookeeper]# cat /root/.bash_profile # .bash_profile # Ge ...
- chubby 是什么,和 zookeeper 比你怎么看?
chubby 是 google 的,完全实现 paxos 算法,不开源.zookeeper 是 chubby的开源实现,使用 zab 协议,paxos 算法的变种.
- Spring 支持的 ORM?
Spring 支持以下 ORM:HibernateiBatisJPA (Java Persistence API)TopLinkJDO (Java Data Objects)OJB