Python3-设计模式-迭代器模式
Python3中的迭代器
迭代器模式主要是访问集合元素的一中方式,迭代器不会把整个集合对象加载到内存,而是按照顺序将集合中的元素一个一个的进行迭代,这样每次迭代的时候只取少量的元素,比较省内存
注:
1.只能按照顺序一个一个的通过__next__()访问下一个元素,不能随机访问
2.只能从头访问到尾,不能访问到中间元素的时候,在去访问前面的元素
3.Python3中访问下一个元素可以使用标准的函数next(iter)了
4.如果已经迭代完全部元素,再次调用next(item)则引发异常StopIteration
# 使用iter()构造方法创建一个迭代器
it = iter([1, 2, 3, 4, 5, ])
print(next(it)) # 输出结果 1
print(next(it)) # 输出结果 2
print(next(it)) # 输出结果 3
print(next(it)) # 输出结果 4
print(next(it)) # 输出结果 5
print(next(it)) # 输出结果 引发异常:StopIteration
1.使用构造函数创建迭代器
# Python内置的 for...in语法访问集合就是使用的迭代的方式
with open("readme.txt", encoding="utf-8") as log_file:
for line in log_file:
print(line)
2.使用for...in迭代会自动结束,不会出现异常
Python3中的生成器
如果一个函数中出现了yield语句,那么这个函数将不再是普通的函数,它将变成生成器函数,生成器函数返回的是一个迭代器,这个函数可以被yield中断,并记录中断的状态,下次还可以继续执行,可以理解为迭代的开始就是函数的开始,迭代的结束就是函数的结束,生成器是比较快捷的创建一个迭代器的方式
# 生成器函数,为了便于理解这里没有用循环
def generator_func(count):
yield_value = "yield_value的默认值"
print("--------第1个yield之前的代码------------")
print("yield的值:", yield_value)
print("count的值:", count)
count += 1
yield_value = yield count
print("--------第2个yield之前的代码------------")
print("yield的值:", yield_value)
print("count的值:", count)
count += 1
yield_value = yield count
print("--------第3个yield之前的代码------------")
print("yield的值:", yield_value)
print("count的值:", count)
count += 1
yield_value = yield count
print("--------第3个yield之后的代码------------")
print("yield的值:", yield_value)
print("count的值:", count) # 调用生成器函数,返回了一个迭代器对象 gtr
gtr = generator_func(0) # 虽然类型显示 generator(生成器的意思) 但它是个迭代器
# 可以说生成器就是迭代器,返回这种迭代器的函数叫生成器函数
print(type(gtr)) # 我们可以调用 next(gtr) 或 gtr.send(obj) 来执行上一个yield之后的代码
# 没有上一个yield,就执行第一个yield之前的代码
# next(gtr)和gtr.send(obj)的唯一不同是:
# gtr.send(obj)会把上一个yield赋值为obj
# 所以如果第一次迭代使用的是gtr.send(obj)方法
# 那一定要这么写: gtr.send(None),因为在这之前并没有上一个yield
# 而且,gtr.send(obj) + next(gtr)有效执行次数(不报错)之和等于最大迭代次数
# 另外,如果yield之后有个对象,那么在执行next(gtr)或gtr.send(obj)时,会将其返回
# 最后,Python3中的 next(gtr) 等价于 gtr.__next__()
gtr.send(None)
next(gtr)
next(gtr)
生成器代码解析
Python3-设计模式-迭代器模式的更多相关文章
- 19. 星际争霸之php设计模式--迭代器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- java设计模式——迭代器模式
一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2) 为遍 ...
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 迭代器模式
用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构
- 深入浅出设计模式——迭代器模式(Iterator Pattern)
模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我 ...
- JavaScript设计模式 - 迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...
- javascript设计模式-迭代器模式(Iterator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 设计模式 --迭代器模式(Iterator)
能够游走于聚合内的每一个元素,同时还可以提供多种不同的遍历方式. 基本概念: 就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示. 使用迭代器模式的优点: 遍历集合或者数 ...
- js设计模式--迭代器模式
迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...
- javascript设计模式——迭代器模式
前面的话 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也 ...
随机推荐
- GNS3配置问题(持续更新)
GNS3配置问题 1.关于All in One的GNS3提示"判断dynamips版本失败"的解决办法 当我们找到GNS3根目录里的dynamips.exe,执行会报错告诉我们缺少 ...
- GTA5侠盗猎车5中文版破解版绿色版汉化版迅雷下载地址种子实测可用
GTA5(侠盗猎车5)中文版下载地址(实测可用) 迅雷下载地址:https://www.90pan.com/b1548988 一定要关闭安全软件并且加入白名单 实测通过,关闭杀毒软件可以完美运行,最好 ...
- js规则和运算符
通过“+”号或toString()方法将数值转换成字符串. 通过parseInt()将字符串转换成整型. 通过parseFloat()将字符串转换成浮点型. charAt() 获取字符串特定索引处的字 ...
- java中Calender类的详细用法(详解)
一. 如何创建 Calendar 对象 Calendar 是一个抽象类, 无法通过直接实例化得到对象. 因此, Calendar 提供了一个方法 getInstance,来获得一个Calendar对象 ...
- Java实现 LeetCode 61 旋转链表
61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...
- Android如何使用SharedPreferences轻量级储存
SharedPreferences只能用来存一些基本数据类型,并且存下的量比较小 直接附代码 和XMl布局 package com.example.okhttpdemo; import android ...
- java实现取球游戏
/* 今盒子里有 n 个小球,A.B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个, 也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球的 ...
- Grafana 插件地图Worldmap不显示
介绍 最近上了ELK 日志分析,想着手看下用户的分布情况,在kibana 中展示用户分布情况是没有问题的,但是索引添加到Granfana 中的话就无法展示. 问题描述 添加ES索引以后,map地图一片 ...
- 第12章 Java内存模型与线程
参考<深入理解Java虚拟机> 一.Java内存模型 1.Java内存模型 2.内存间交互操作 流程图: 3.volatile关键字 两个特性: 3.1.保证变脸对所有线程的可见性: 由 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...