【python基础】迭代器和生成器函数
1、迭代器协议:
1、迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)
2、可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义了一个__iter__()方法)
3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
注意:
iter.ls__next__() #__next__() ---->next() __next__() 是迭代器内置函数,而next() 是python内置函数,两者效果相同
字符串、列表、元组、字典、集合等 都不是可迭代对象,但是能够被for循环,
for循环其实就是先把它们转化为可迭代对象( li.__iter__()或者iter(li) ),然后进行__next__()方法一个个取出
>>> a = iter([1,2,3,4,5])
>>> a
<list_iterator object at 0x101402630>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration >>>for i in range(a):
print(i)
>>>1
>>>2
>>>3
>>>4
>>>5
#当遇到StopIteration时停止迭代
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器;
li = ['鸡蛋%s'%i for i in range(10)] #生成器表达式
print(li)
在函数中只能有一个return 返回,但是却可以有多个yield 生成器返回
def func():
print('')
print('')
yield 1
print('aaa')
yield ('bbb')
yield "success"
print('ccc')
yield "enter" fx = func()
print(fx.__next__()) # 第一次使用__next__()打印到yield 1 的位置, 1111 2222 1
print(fx.__next__()) # 第二次使用__next__()打印到yield 'bbb' 的位置, aaa bbb
print(fx.__next__()) #success
print(fx.__next__()) #ccc enter
有效利用yield生成器这个工具可以有效地节约系统资源,避免不必要的内存占用。
yield生成器每次生出一个值占用较少的内存,就像餐馆里上餐是做好一个菜上一个菜而不是把全部菜都做好了之后再上菜
"""yield i+1 每次向内存中放入一个值,占用较少的内存"""
def func1():
for i in range(100):
yield i+1 f1 = func1()
print('来了第%s个人'%(f1.__next__())) #来了第1个人
print('来了第%s个人'%(f1.__next__())) #来了第2个人
print('来了第%s个人'%(f1.__next__())) #来了第3个人 """return ret 是将生成的[1,2,3,4...100]数组直接放在内存中,耗费较多内存"""
def func2():
ret = []
for i in range(100):
ret.append(i+1)
return ret
f2 = func2()
print("来了第%s个人"%(f2[1])) #来了第2个人
yield比return占用较少内存
补充知识点:
三元表达式:
"""三元表达式"""
name = 'jt'
res = 'xiong' if name == 'jt' else 'zhang'
print(res)
列表解析:
egg_list = []
for i in range(10):
egg_list.append('鸡蛋%s'%i)
print(egg_list)
"""列表解析"""
li = ['鸡蛋%s'%i for i in range(10)]
print(li) #打印出来的结果都是:
['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
"""列表解析与三元表达式结合"""
li = ['鸡蛋%s'%i for i in range(10) if i>5]
print(li)
#打印出来的结果都是:
['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] #注意:
#li = ['鸡蛋%s'%i for i in range(10) if i>5 else i<2] #没有4元表达式 这种写法错误
【python基础】迭代器和生成器函数的更多相关文章
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- python基础--迭代器、生成器、内置函数、面向对象编程
迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...
- python基础-迭代器和生成器
一.递归和迭代 1.递归:(问路示例) 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 2.迭代:简单理 ...
- python基础--迭代器、生成器
(1)迭代器 可迭代对象和迭代器的解释如下: ''' 什么是对象?Python中一切皆对象,之前我们讲过的一个变量,一个列表,一个字符串,文件句柄,函数名等等都可称作一个对象,其实一个对象就是一个实例 ...
- Python基础—迭代器、生成器(Day13)
一.迭代器 1.可迭代对象:遵循可迭代协议,内部含有__iter__方法的对象就叫做可迭代对象.(str.list.tulpe.dict.set) 查询数据类型的方法 s = 'laonanhai' ...
- python基础一 day14 生成器函数进阶
def generator(): print(123) content = yield 1 print('=======',content) print(456) arg = yield 2 '''' ...
- python基础一 day14 生成器函数进阶(1)
- python基础——迭代器
python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
随机推荐
- 前端异常监控 - BadJS
前端异常监控 - BadJS 简介:BadJS 是 web 前端异常监控解决方案,提供一种 web 页面的脚本错误监控.上报.统计.查看等系统化的跟踪解决方案.目前BadJS覆盖了腾讯课堂.公众号.邮 ...
- 分布式系统CAP理论与CA选择
总结: CAP指的是数据一致性.服务可用性.分区容错性:(这里的一致性指的是强一致性,又叫原子性或线性一致性:可用性指的是所有读写操作都要能终止,没有时延上的要求) 分布式系统中P是必选项:在P必选的 ...
- gSOAP 在windows下的安装与使用(mingw32)
gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以简单快速地开发出SOAP/XML的服务器端和客户端.由于 gSOAP具 有相当不错的兼容性,通过gSOAP,我们就可以调用由Jav ...
- [AWS] User management
IAM用户管理 Ref: AWS系列-创建 IAM 用户 Ref: AWS系列:深入了解IAM和访问控制 是什么? IAM enables you to control who can do what ...
- "佛祖保佑 永无bug" 注释模板设置详解(仅供娱乐)
1.注释模板效果图 今天在网上看到一段有趣的注释,佛祖保佑 永无bug, 效果如下图所示: 代码如下所示: /** * _ooOoo_ * o8888888o * 88" . " ...
- SpringBoot-服务端参数验证-JSR-303验证框架
1. springboot 默认集成了 hibernate-validator,它默认是生效的,可以直接使用. 比如: @RestController @RequestMapping("/h ...
- 【Oracle】删除所有表
BEGIN FOR cur_rec IN (SELECT object_name, object_type FROM user_objects WHERE object_type IN ('TABLE ...
- UML类图中的几种关系的画法和含义
UML的类图中,一共有以下六大关系: 泛化(Generalization), 实现(Realization), 依赖(Dependence),关联(Association),聚合(Aggregatio ...
- git 搭建本地仓库
文档 创建仓库 mkdir project cd project/ git init git remote add origin /d/project/.git // 仓库创建好了 echo hell ...
- python金融与量化分析------Matplotlib(绘图和可视化)
-----------------------------------------------------------Matplotlib:绘图和可视化------------------------ ...

