python三大神器===》迭代器
迭代器:
1.认识迭代器
迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
我们怎样才能判定一个对象是都是可以迭代的呢?
2.可迭代对象
list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,这类对象被称为可迭代对象
3. 如何判断一个对象是否是一个可迭代对象
可以使用 isinstance() 判断一个对象是否是 Iterable 对象
from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象 # 列表是可迭代对象
result = isinstance([1,2], Iterable)
print(result) # 元组是可迭代对象
result = isinstance((1,2), Iterable)
print(result) # 字符串是可迭代对象
result = isinstance("hello", Iterable)
print(result) # 字典是可迭代对象
result = isinstance({"a": 10, "b": 100}, Iterable)
print(result) # 数字不是可迭代对象
result = isinstance(100, Iterable)
print(result) # 定义类
class MyClass(object):
pass # 创建对象
c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)
运行结果
True
True
True
True
False
False
4.如何将一个不可迭代的对象转换为可迭代对象:
在探讨这个问题之前我们需要了解,可迭代对象的本质:可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。而在python中内置的魔法方法__iter__()方法可以将一个对象转换为可迭代对象,因此只要一个类中有__iter__()方法,那么这个类实例出的对象就是个可迭代对象,接下来我们你验证下:
from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象 class MyClass(object):
# 可迭代对象的本质是,类中是否定义了 __iter__() 方法
def __iter__(self):
return self c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)
运行结果
true
5.创建一个迭代器类
那么上面的创建的迭代对象能用next()访问吗?结果肯定是不能的,我们虽然在类中定义了一个__iter__()方法,但我们并没有定义一个函数去迭代这个类,这时我们需要用python的内置方法__next__()去迭代这个对象,接下来我们会分别创建一个迭代器和迭代对象去s验证:
from collections import Iterable
from collections import Iterator class StudentList(object): def __init__(self):
# 创建列表
self.items = list() def addItem(self,item):
# 追加元素到列表中
self.items.append(item) def __iter__(self): # 创建迭代器对象
studentIterator = StudentIterator(self.items) # 返回迭代器对象
return studentIterator # 定义迭代器
class StudentIterator(object):
# 定义构造方法
# 1)完成 索引下标定义和初始化
# 2)接收要遍历的列表值 def __init__(self, items): self.items = items
self.current_index = 0 def __iter__(self):
return self def __next__(self):
# 判断位置是否合法
if self.current_index < len(self.items):
# 根据current_index 返回列表值
item = self.items[self.current_index]
# 让 下标+1
self.current_index += 1
# 返回元素内容
return item else:
# 停止迭代
# 主动抛出异常,迭代器没有更多的值(到了迭代器末尾)
raise StopIteration # 实例化对象
stulist = StudentList() stulist.addItem("小明")
stulist.addItem("小红")
stulist.addItem("小刚")
# 检查是否是可迭代对象
result = isinstance(stulist, Iterable)
print(result) for value in stulist:
print(value) image-20180704185515374
运行结果
小明
小红
小刚
注意:如果我们用next()访问的次数超过迭代对象的范围会报错,也许你会疑问为什么平时我们遍历列表,元组等可迭代对象时为什么没有这种情况,那是因为python内部在我们遍历可迭代对象时超出范围会自动停止,我们定义迭代器类时直接抛出错误了,没有做那么复杂的处理。
python三大神器===》迭代器的更多相关文章
- Python 三大神器
Python 三大神器 Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/l ...
- Python三大器之迭代器
Python三大器之迭代器 迭代器协议 迭代器协议规定:对象内部必须提供一个__next__方法,对其执行该方法要么返回迭代器中的下一项(可以暂时理解为下一个元素),要么就引起一个Stopiterat ...
- python三大神器之迭代器
可迭代协议: 内部含有__iter__方法的值/变量都是可迭代的.可迭代类型和python语言之间的协议. 可迭代对象: iterable,内部包含__iter__()函数. 迭代器: iterato ...
- Python三大神器:装饰器,迭代器,生成器
一.装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义的函数func1, ...
- python三大神器===》装饰器
1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大‘神器’(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情 ...
- python三大神器之生成器
生成器Generator: 本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) 特点:惰性运算,开发者自定义 在python中有三种方法来获取生成器: 1.通过生成 ...
- python三大神器之一fabric使用
fabric 是一个python包 是一个基于ssh的部署工具包 通常用来对网站 微服务等等的批量部署 例如 我有5台线上服务器 可以通过一台对着5台分发,实现自动部署的目的. 简单介绍下 fabri ...
- python三大神器
Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/latest/instal ...
- python三大神器之装饰器
装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: import time def func1(): print('in func1') def timer(func): def in ...
随机推荐
- iOS 混合开发之 Cordova 实践
在15年时,之前公司使用 Cordova 做混合开发使用,后来公司没有用到了,现在重新记录下. Cordova (官网:http://cordova.apache.org/)简介: Apache Co ...
- vue 和 jquery混合使用
有时候只要想到要用的 vue.js 的时候就会惯性的想起用vue-cli手脚架搭建一个项目,但是有时候的业务场景并不适合用vue-cli手脚架,这个时候使用vue+jquery混合使用,把他们的优点结 ...
- C — 小知识
老是记错int与void*之间的转换,所以记录一个,顺便用一下一些宏.预处理... int与void*的转换.打印变量名: #include <stdio.h> // 打印变量名 #def ...
- Hash Table(散列表)
这篇主要是基础的数据结构学习,写的时候才明白了书上说到的一些问题,由于该篇仅仅只是对这种数据结构进行一个理解,所以很基础,关于h(x)函数也只是简单的运用了除法散列,然后为了应对冲突,我用的是链接法. ...
- [经验] 如何将 Java 项目发布到云服务器上并可以访问
环境: 云服务器 Linux centos7.6 1: 安装 Tomcat (apache-tomcat-9.0.26.tar.gz) 下载压缩包 --> 通过SSH上传到云服务器 --> ...
- CentOS上安装elasticsearch
1.安装docker yum install docker 2.启动docker systemctl start docker 查看docker版本: docker -v 之后只要启动机器就会自动开启 ...
- 安装oracle11g时出现:在注册表中没有找到指定的主目录名
我碰到这个问题,不过我没去管它.直接安装了,后来数据库实例,什么的都能安装,目前没有发现什么问题. 造成这个的原因:是卸载oracle时注册表没有彻底删除! 如果后面出现问题,再记录.
- JavaScript判断两个对象内容是否相等
ES6中有一个方法判断两个对象是否相等,这个方法判断是两个对象引用地址是否一致 let obj1= { a: 1 } let obj2 = { a: 1 } console.log(Object.is ...
- [转]Shell编程
原文链接 Shell编程其实真的很简单(一) 如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux.说起来似乎shell编程很屌啊,然而不用担心,其实she ...
- ehcache配置文件
ehcache.xml: <?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi=& ...