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 ...
随机推荐
- 解决 MySQL 的 Table is marked as crashed and should be repaired 问题
解决方法: 找到mysql的安装目录的bin/myisamchk工具,在命令行中输入: myisamchk -c -r ../data/mysql/user.MYI 然后myisamchk 工具会帮助 ...
- pandas常用操作详解——info()与descirbe()
概述 df.info():主要介绍数据集各列的数据类型,是否为空值,内存占用情况: df.describe(): 主要介绍数据集各列的数据统计情况(最大值.最小值.标准偏差.分位数等等). df.in ...
- JavaSE 千寻简学习笔记
JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...
- Solon 1.6.33 发布,更现代感的应用开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- 电子检索实体书「GitHub 热点速览 v.22.12」
不知道有没有小伙伴遇到实体书快速定位指定内容的问题,凭借着记忆里很难快速翻阅到正确的页数,但 paperless-ngx 也许能帮上你的忙,它除了能将你的实体书籍电子化变成文件库里的一员之外,还能帮你 ...
- redis规范(实用)
redis功能强大,数据类型丰富,再快的系统,也经不住疯狂的滥用.通过禁用部分高风险功能,并挂上开发的枷锁,业务更能够以简洁.通用的思想去考虑问题,而不是绑定在某种实现上. Redis 根据不同的用途 ...
- Linux 安装mysql 看这一篇就够了
mysql 安装教程 下载地址:https://downloads.mysql.com 查看系统中默认的mysql 依赖 rpm -qa | grep mysql rpm -qa | grep mar ...
- 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...
- bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)
bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...
- python爬虫 Selenium库学习
一.自动化测试工具,支持多种浏览器,解决JS渲染问题 二.安装 pip3 install Selenium 三.操作介绍(因为是学习别人的课程为了尊重知识产权,部分代码就不显示了) 1驱动浏览器 br ...