day4 迭代器与生成器解析
一、迭代器
迭代器是访问集合元素的一种方式。其实迭代器就是一种列表,只是访问集合元素的时候比较特殊,具有一些特定功能,记忆功能,能够记住用户上一次的状态。迭代器是访问集合元素的一种方式。并且,迭代器只能前进,不能后退。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
特定:
(1).访问者不需要关心迭代器内部的文件,仅需通过next()方法不断去取下一个内容;
(2).不能随机访问集合中的某个值,只能从头到尾依次访问;
(3).访问到一半时不能往回退;
(4).便于循环比较大的数据集合,节省内存生成一个迭代器。
iter()用来声明迭代器,示例如下:
names = iter(["alex","sb",11,22,"gengchangxue"])
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
运行结果如下:
alex
sb
11
22
gengchangxue
Traceback (most recent call last):
File "/home/zhuzhu/day4/iterator.py", line 7, in <module>
print(names.__next__())
StopIteration
从上面结果可以看出,迭代器是使用__next__()方法来遍历集合中的每一个元素,当超过列表的长度的时候会出现错误,stoplteration(停止迭代)。上面集合有5个元素,我们去了6次,结果就报错。迭代器只能从元素的第一个值开始遍历,直到所有的元素遍历完为止。中间过程不能后退,也不能取中间某个特定位置的值。
迭代器中只有一个__next__()方法,用来去元素。
二、生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。
其实,生成器(generator)函数中包含yield,yield的作用与return作用类似,只是yield结束本地循环之后,记录程序运行的状态,能够保持在当前状态,当用户再一次调用的时候,会从这里开始,重新进行循环,并且,yield能够返回一个值给函数,并且yield与send结合还能够接收返回值。
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
上面我们写了一个函数,并且调用这个函数,但是print()语句并没有执行。下面来看看atm的类型:
print(type(atm))
运行如下:
<class 'generator'>
可以看出,atm是一个生成器,生成器的调用要使用__next__()方法。实例如下:
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
print(atm.__next__())
print(atm.__next__())
生成器的作用,我们之前学的程序都是串行的,从上到下进行执行,如果中间某个过程没有执行,那么会一直等待,但是我们使用yield就能够保持记忆功能。让程序其做其他的事情,作用之后在回来继续做这件事情,比如我们去做一个大保健,做完之后重新回来取钱。
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
print(atm.__next__())
print(atm.__next__())
print("叫个大保健")
print(atm.__next__())
运行结果如下:
100
败家子,又来取钱了!...
100
叫个大保健
败家子,又来取钱了!...
100
yield就是保存函数的状态,可以让我们先去完成其他事情,然后继续执行。生成器在某些时候很有用,比如我们想保存之前用户的状态,以便用户下次登录能够知道之前的信息。比如银行的系统,用户取钱之后肯定要进行减去金额,并且保存之前操作的状态。
day4 迭代器与生成器解析的更多相关文章
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
- 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数 :*args和**kwargs def index(name,age): print(na ...
- Python自动化运维之7、生成器、迭代器、列表解析、迭代器表达式
迭代器和生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...
- Python基础(8)_迭代器、生成器、列表解析
一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- Python之迭代器和生成器
Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...
- Python可迭代对象、迭代器和生成器
Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...
- Python 迭代器和列表解析
Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
随机推荐
- 【DP】【CF9D】 How many trees?
传送门 Description 给你两个正整数\(n,h\),求由\(n\)个点组成的高度大于等于\(h\)的二叉树有多少个 Input 一行两个整数\(n,h\) Output 一个整数代表答案. ...
- 转--snmp如何被tr069替代
Form:本期话题:技术点详解---新型网管理念TR-069 一. 带内网管与带外网管 网络设备是一种资产,资产往往都需要进行管理,网络设备也不例外,网络设备的作用是网络互联,网络应用是一种实时交互性 ...
- python学习笔记(六) 函数式编程
一 函数对象 函数同样可以作为对象复制给一个变量,如下: f = abs; print(f(-10)) f = 'abs'; print(f) def add(a,b,f): return f(a) ...
- 修改Tomcat端口
1.自己的tomcat修改端口号,在tomcat解压缩目录中conf目录下又一个server.xml,将HTTP协议的端口修改为自己想要的即可 <Connector port="808 ...
- PL/SQL Developer 中的问题:Initialization error Could not load ".../oci.dll"解决方法
---------------------------------------------------------------------------------------------------- ...
- Oracle把本地的dmp备份文件导入到本地的Oracle数据库中语句
----------------------------------------------------------------------------- 导入语法 imp usename/passw ...
- 816B. Karen and Coffee 前缀和思维 或 线段树
LINK 题意:给出n个[l,r],q个询问a,b,问被包含于[a,b]且这样的区间数大于k个的方案数有多少 思路:预处理所有的区间,对于一个区间我们标记其(左边界)++,(右边界+1)--这样就能通 ...
- css纯数字或字母换行
#div { word-wrap:break-word; word-break:break-all; }
- 解决 sun.security.validator.ValidatorException: PKIX path building failed
今天用java HttpClients写爬虫在访问某Https站点报如下错误: sun.security.validator.ValidatorException: PKIX path buildin ...
- 【POJ】2774 Long Long Message
[题意]给定两个字符串S和T,求最长公共子串.len<=10^5. [算法]后缀自动机 [题解]对字符串S建SAM,然后令串T在S上跑匹配. 这是自动机最原本的功能——匹配,就是串T在SAM(S ...