15.迭代器:工具

1.可迭代对象:

​ 官方声明,只要具有__iter__方法的就是可迭代对象

list,dict,str,set,tuple -- 可迭代对象,使用灵活

#方法一:
list.__iter__()
dict.__iter__()#方法二:
查看源代码#方法三:
print(dir(list))
#官方声明,只要具有__iter__方法的就是可迭代对象
2.迭代器:

官方声明:只要具有__iter__方法__next__方法就是迭代器

f = open("",'w')
f.__iter__()
f.__next__()

将可迭代对象,转换成迭代器

lst = [1,2,3,4,6]
new_lst = lst.__iter__()#将可迭代对象,转换成迭代器new_lst.__iter__()
new_lst.__next__()
print(new_lst.__next__())#每次获取一个值,第一次获取第一个值,以后向后推#自己写 for i in lst(): print(i)
lst = [1,2,3,4,6]
count = len(lst)
new_lst = lst.__iter__()
while count:print(new_lst.__next__())count -= 1#for的本质
lst = [1,2,3,4,6]
new_lst = lst.__iter__()
while 1:try:print(new_lst.__next__())except:break
3.总结:

​ 可迭代对象:

​ 优点:使用灵活,可以直接查看值

​ 缺点:占内存,不能迭代值

​ 迭代器:

​ 优点:节省内存,惰性机制

​ 缺点:使用不灵活,操作较繁琐,不能直接查看元素

迭代器的特性:

  1. 一次性的(用完就没有了)
  2. 不能后退
  3. 惰性机制(节省内存)

可迭代对象:具有__iter__()方法的

可迭代器:具有__iter__()方法和__next__()方法的

迭代器的使用时机:当容器中数据量较多的时候使用迭代器

16.生成器:

迭代器:python中内置的一中节省空间的工具

生成器的本质就是一个迭代器

生成器与迭代器的区别:

​ 迭代器:python自带

​ 生成器:程序员写的

写一个生成器:

​ 将函数中的return改写成yield就是一个生成器,return和yield都是返回:

  1. return和yield都是返回
  2. return和yield都可以写多次
  3. return只执行一次,yield可执行多次
  4. 一个next对应一个yield,会记录停留的位置。超出会报错

g = func()#产生一个生成器

​ 生成器可以使用for循环取值

​ yield from -- 将可迭代对象的元素逐个返回

​ 在函数内部,yield能将for循环和while循环进行暂停

def func():print(123)yield "你好"print(321)yield "我好"
print(func())
#结果:<generator object func at 0x000001913911F0A0>
g = func()
g.__inter__()
print(g.__next__())#会记录停留的位置
def func():if 3 > 2:yield "你好"if 4 > 2:yield "我好"yield "大家好"
g = func()
print(g.__next__())
print(g.__next__())
print(g.__next__())
'''
结果:
你好
我好
大家好
'''#for 循环
for i in g:print(i)

坑:会产生新的生成器

#每次都是新的生成器
print(foo().__next__())
print(foo().__next__())
#用赋值只产生一个生成器
g = foo()
def foo():for i in range(10):passyield icount = 1while 1:yield countcount += 1
g = foo()
#print(next(g))  = print(g.__next__()) --推荐使用next(g)
print(next(g))
print(next(g))
print(next(g))
#next可以在while中停住
'''
结果:
9
1
2
'''

seed() -- 了解

#send()第一次只能传None,用于激活,否则会报错,以后可以传各种数据
def func():a = yield "send激活"print(a)b = yield "send开始"
g = func()
print(g.send(None))
print(g.send(123))

生成器应有场景:

#当有大量的数据时
def func():lst = []for i in range(1000000):lst.append(i)return lst
print(func())
#生成器改进
def func():for i in range(1000000):yield i
g = func()
for i in range(50):print(next(g))

yield from -- 将可迭代对象逐个返回

def func():list1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]yield from list1  #yield list1 会直接返回整个列表
g = func()
print(next(g))
print(next(g))
'''
结果:
牛羊配
老奶奶花生米
'''def func():list1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]lsit2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]yield from list1yield from list2
g = func()
#将lsit1返回完,才会返回list2
print(next(g))
print(next(g))
print(next(g))

转载于:https://www.cnblogs.com/Onlywang/p/11218929.html

python函数知识四 迭代器、生成器相关推荐

  1. python基础知识7——迭代器,生成器,装饰器

    迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...

  2. python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器

    8.1 可迭代对象(Iterable) 大部分对象都是可迭代,只要实现了__iter__方法的对象就是可迭代的. __iter__方法会返回迭代器(iterator)本身,例如: >>&g ...

  3. python学习day13 day14 迭代器 生成器

    迭代器 可迭代的: list dic str set tuple f = open() range() enumerate # 显示列表所拥有的所有方法 print(dir([])) 双下方法:很少直 ...

  4. Python函数知识总结

    小白如何成为python数据分析师 第 十三天 ---->函数知识点总结 ​ 几天没有更新啦!因为没人催更,主要是时间来不及,今天就将这几天所学关于函数知识做个梳理,总结.如有不足,还请指出,谢 ...

  5. Python 3 学习——函数扩展and迭代器生成器装饰器

    Python 学习的第九小节 写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享 一.学习笔记 1. 高阶函数 函数名可以作为函数参数输入 .可以进行赋值.还可以作为返回值. 2.作用域 ...

  6. Python基础知识(四)--函数

    def functionName(arguments):    #函数名(参数列表_可选) suite                       #函数体 def get_int(msg): whi ...

  7. day4 高阶函数 嵌套函数 装饰器 内置函数 列表生成式 迭代器 生成器

    一.函数即变量 1.赋值效果图 a = 1  b = a def func(): print('hello') func 是函数名,相当于变量名,print('hello')是函数体,相当于变量的值, ...

  8. python六十四: 迭代器协议

    迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代.(只能往后走,不能往前退). 可迭代对象:实现了迭代器协议的对 ...

  9. python函数的四个特点_Python面向对象三大特征之封

    本文,我们先说封装,封装就是根据职责将属性和方法封装到一个抽象的类中: 一.面向对象基本概念 我们之前学习的编程方式就是面向过程的 面向过程和面向对象,是两种不同的编程方式 对比 面向过程 的特点,可 ...

最新文章

  1. 视频物体分割--One-Shot Video Object Segmentation
  2. SAP RETAIL WA01 创建分配表报错 - Plant 0000000039 Confirmation date not maintained.-
  3. Android Camera MSM HAL
  4. linux下vi命令大全[转]
  5. Python获取昨天、今天、明天开始、结束时间戳
  6. Spring【AOP模块】就是这么简单
  7. Python学习笔记:接下来
  8. Django create和save方法
  9. 设置分区的三种方法coalesce、repartition、partitionBy
  10. 剑指offer 矩形覆盖
  11. java httpclient post 上传文件_httpclient通过post multipart/form-data 上传文件
  12. GoogLeNet的心路历程(一)
  13. c语言练习题:求1-1/2+1/3-1/4+... -1/100的值
  14. Python 之 函数基础
  15. node npm 更新到最新(Ubuntu系统)
  16. Android免费获取短信验证码
  17. SAP MM-MB52 物料库存查询简单操作
  18. Java实现阿里云云通短信通知发送
  19. 编译原理——程序编译的基本流程
  20. [bzoj 4833]最小公倍佩尔数

热门文章

  1. 2018-2019-2 20175204 张湲祯 实验五《网络编程与安全》实验报告
  2. Django model 中的 class Meta 详解
  3. rem和em学习笔记及CSS预处理
  4. imoocLinux环境变量配置文件笔记
  5. Android之Service与IntentService的比较
  6. 笑话(15) 这是地球
  7. 编译安卓的一些知识点
  8. 前端vue显示柱状图_Vue接入Echarts 显示柱状图饼图
  9. django mysql内存泄漏_Django的:使内存的关系,而不保存到数据库
  10. 重磅!《Apache Flink 十大技术难点实战》发布