迭代器

'iterable' 可迭代的

内部含有__iter__方法的数据类型就是可迭代的 —— 可迭代协议

print(dir([]))
print(dir({}))
print(dir(5))
print('__iter__' in dir('abc')) # True
ret = 'abc'.__iter__()
print(ret)
'iterator' # 迭代器

迭代器可以理解为一个容器,我们从这个容器当中一个接着一个的把值取出来的过程就是迭代的过程
如何从迭代器中取值

print(ret.__next__())  # a
print(ret.__next__()) # b
print(ret.__next__()) # c
print(ret.__next__()) # StopIteration l = ['ha','hei','he']
lst_iter = l.__iter__()
print(lst_iter.__next__())
print(lst_iter.__next__())
print(lst_iter.__next__())

可迭代的 可迭代对象 python一切皆对象
迭代器

print(dir(l))
print(dir(lst_iter))
print(set(dir(lst_iter)) - set(dir(l))) # {'__next__', '__setstate__', '__length_hint__'}

lst_iter.__setstate__ # 设置从哪开始迭代
可迭代的必须含有__iter__方法 # 可迭代协议
迭代器比可迭代的多一个__next__方法
迭代器:包含__next__,__iter__方法的就是迭代器 # 迭代器协议
包含__next__方法的可迭代对象就是迭代器
迭代器是可迭代的的一部分
获得迭代器:可迭代的调用__iter__
使用迭代器:迭代器.__next__()

print('__iter__' in dir(lst_iter))
print('__next__' in dir(lst_iter))

如何判断一个变量是不是迭代器或者可迭代的

# print('__iter__' in dir(lst_iter))
# print('__next__' in dir(lst_iter))
from collections import Iterable
from collections import Iterator
print(isinstance('a',str))
print(isinstance([1,2,3,4],Iterable))
print(isinstance([1,2,3,4],Iterator))
print(isinstance(1,Iterable))
print(isinstance(1,Iterator))
print(isinstance(lst_iter,Iterator))

可迭代的:__iter__
迭代器:__iter__和__next__
迭代器和可迭代的关系:可迭代的包含迭代器
迭代器和可迭代的判断:两种方法

迭代器的工作原理
l_iter = [1, 2, 3, 4, 5].__iter__()
迭代器只是记录当前这个元素和下一个元素

print('__iter__' in dir(range(10)))
print('__next__' in dir(range(10)))
range_iter = range(10).__iter__()
print(range_iter.__next__())
print(range_iter.__next__())

迭代器的特点
惰性运算
从前到后一次去取值,过程不可逆,不可重复
节省内存

for item in [1,2,3]:
pass
# list_iter = [1,2,3].__iter__()
# list_iter.__next__()

用while循环模拟for循环的方式 —— for循环是了依赖迭代器的,且我们自己也可以仿照着写

l = [1,2,3,4,5]
l_iter = l.__iter__()
while True:
try:
print(l_iter.__next__())
except StopIteration: # 遇到StopIteration就break
break

for循环是让我们更简单的使用迭代器
用迭代器取值就不需要关心索引或者key的问题了

目前我们已知的可迭代的都是python提供给我们的
range()
文件f
enumerate()
在平时写代码的过程中,我们用for循环就够了

day13 迭代器的更多相关文章

  1. python 全栈开发,Day13(迭代器,生成器)

    一.迭代器 python 一切皆对象 能被for循环的对象就是可迭代对象 可迭代对象: str,list,tuple,dict,set,range 迭代器: f1文件句柄 dir打印该对象的所有操作方 ...

  2. Python—day13 迭代器、迭代器对象、for循环对象、生成器、枚举对象

    一.迭代器 1.迭代器概念: 器:包含了多个值的容器 迭代:循环反馈(一次从容器在取出一个值) 迭代器:从装有多个值的容器在一次取出一个值 ls=[3,5,7,1,9] 遍历:被遍历的对象必须是有序容 ...

  3. DAY13 迭代器与生成器

    一.迭代器 定义:器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 优点:不依赖索引,完成取值 缺点:不能计算长度,不能指定位取值(只 ...

  4. python学习 day13 迭代器,生成器,枚举对象

    一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...

  5. day13: 迭代器和生成器

    1,思考所有可以被for循环的:list,tuple,set,dict,range,enumerate,f,str,差不多了,为何这些数据类型可以被for循环呢? 2,一个标准的装饰器函数 from ...

  6. day13迭代器与生成器

    三个作业: # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 login_dic = {'alex':False} def ...

  7. python基础一 day13 迭代器

    # 双下方法# print([1].__add__([2]))# print([1]+[2]) # 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:# i## for ...

  8. day13. 迭代器与高阶函数

    一.迭代器 """ 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象) 概念: 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果 ...

  9. day13,day14

    day13 迭代器 什么是迭代器? 迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而进行的 器:迭代取值的工具 为何要用迭代器? 迭代器提供了一种通用的不依赖于索引的迭代取值方式 如何用迭代 ...

随机推荐

  1. hdu6006 Engineer Assignment 状态dp 定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。

    /** 题目:hdu6006 Engineer Assignment 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意:已知n个工程,每个需要某 ...

  2. tomcat修改默认端口

    1.webserver: tomcat2.version:   Apache Tomcat/7.0.293.operation: 修改默认端口 3.1 修改tomcat目录下的/conf/server ...

  3. JDK1.5中支持的 for循环的语法

    JDK1.5中支持的 for循环的语法 解答: for(type element : array) { System.out.println(element) } type 集合(不仅仅指Collec ...

  4. js禁止别人查看源码

    1.直接按F12 2.Ctrl+Shift+I查看 3.鼠标点击右键查看 4.Ctrl+u=view-source:+url 把以上三种状态都屏蔽掉就可以了,document有onkeydown(键盘 ...

  5. MySQL服务停止,无法启动了~

    怎么解决mysql服务无法启动的问题

  6. "_dns_free_resource_record", referenced from:问题

    本文转载至 http://blog.csdn.net/woaifen3344/article/details/41309471 _dns_free_resource_r_dns_free环信SDK集成 ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

    问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...

  8. 《程序员级别鉴定书》 ----中级.NET开发者

    面向接口.面向对象和面向方面编程区别 面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章链接面向接口编程详解(一)——思想基础) 面向接口编程 接口是一组规则集合 面向对象编程 对具有相同 ...

  9. Codeforces Round #210 (Div. 1).B

    经典的一道DP题. 题目明显是一道DP题,但是比赛的时候一个劲就在想怎么记录状态和转移.最后想到了一种n^3的方法,写了下,不出所料的超时了. 看了别人的代码才发现竟然是先二分然后再进行DP,像这种思 ...

  10. hdu4328(经典dp用悬线法求最大子矩形)

    http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右 ...