【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 ...
随机推荐
- npm国内镜像
国内使用默认的源安装较慢,镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry h ...
- headfirst python 07 ~ 08
Web 不论你在 web 上做什么, 都离不开请求和响应, web请求作为某个用户交互的结果由web浏览器发送到web服务器, 在web服务器上, 会生成web响应(或应答)并发回到 web 浏览器. ...
- Json Web Token(JWT)
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(Si ...
- Oracle垃圾数据清理相关问题 分类: Oracle 2015-08-06 11:14 12人阅读 评论(0) 收藏
垃圾数据清理,简单的说,就是删除不需要的那些数据,释放存储空间 最常用的就是delete命令.truncate命令,甚至是删除表空间重建,具体操作都很简单,不是本文的重点 下面,总结几个垃圾数据清理常 ...
- spring quartz1.8.6集群结算服务定时任务与appserver独立分开
1.quartz集群如何处理同一个数据库,同一套sqtz表的lock问题,否则会导致打架. 思路如下: 1.com.xxx.quartz.BeanInvokingJobDetailFactoryBea ...
- java.util.HashMap的简单介绍
1. java.util.HashMap的底层实现是数组+链表. 2. 简介put(key, value)方法的执行过程: 1)通过key值,使用散列算法计算出来一个hash值,用来确定该元素需要存储 ...
- scala中隐式转换之总结
1.隐式转换的时机: 1.当方法中的参数的类型与目标类型不一致时 2.当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换 2.隐式解析机制 即编译器是如何查找到缺失信息的,解析具有 ...
- 正确停掉 expdp 或 impdp
1.查看视图dba_datapump_jobs SQL> set line 200 SQL> select job_name,state from dba_datapump_jobs; J ...
- Spring实战系列
作者:arccosxy 转载请注明出处:http://www.cnblogs.com/arccosxy/ 稀里糊涂的做了2年的Java Web后端开发,很多东西连蒙带猜外加百度,也算是完成了几个重要 ...
- DataGridView实时提交
自定义了一个工具,根据DataGridView中的值进行其他操作.在DataGridView中修改了值,直接做其他操作时, 结果DataGridview中的值显示为a,则操作的属性却是没修改后的值b. ...

