python中实现迭代器(iterator)的方法示例

概述

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

延迟计算或惰性求值 (Lazy evaluation)

迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。

今天创建了一个实体类,大致如下:

class Account():
 def __init__(self,
   account_name,
   account_type,
   account_cost,
   return_amount=0):
 self.account_name = account_name # 账户名
 self.account_type = account_type # 账户类型
 self.account_cost = account_cost # 月结费用
 self.return_amount = return_amount # 返还金额

然后创建一个实体列表:

accounts = [Account("张三", "年费用户", 450.00, 50),
  Account("李四", "月结用户", 100.00),
  Account("杨不悔", "月结用户", 190.00, 25),
  Account("任我行", "月结用户", 70.00, 10),
  Account("凌未风", "年费用户", 400.00, 40)]

我想要执行next()功能,也就是需要的时候“next”一下,得到List中的下一个元素。

直接测试一下:

结果发现List不支持next()特性。这时候,List只是一个iterable,而不是iterator。

iterable和iterator的区别如下:

  1. iterable —— 只实现了__iter__的对象;
  2. iterator —— 同时实现了__iter__和__next__方法的对象。

其中, __iter__返回iterator对象, __next__则返回迭代过程的下一个元素。

1. 让列表成为iterator

要让前面的accounts List成为iterator只需简单的一个iter()函数:

accounts_iterator = iter(accounts)
(next(accounts_iterator)).account_name

结果如下图所示:

这么简单的函数,估计还是有不少Python开发者不知道吧?

2. 自定义iterator对象

扩展开来讲,如何定义自己的iterator对象呢?其实也就是按照上面的定义,实现__iter____next__方法。

我们接下来定义一个AccountIterator类:

class AccountIterator():
 def __init__(self, accounts):
 self.accounts = accounts # 账户集合
 self.index = 0

 def __iter__(self):
 return self

 def __next__(self):
 if self.index >= len(self.accounts):
  raise StopIteration("到头了...")
 else:
  self.index += 1
  return self.accounts[self.index-1]

运行结果如:

通过这一阵折腾,next()功能就实现了。Python有不少意外的功能,还等着我们不断去探究,也许这就是Python的魅力及极客之处。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • 使用nodejs、Python写的一个简易HTTP静态文件服务器

    日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript.CSS.HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果. 比如,我们的 CDN 域名是:http://a.mycdn.com,本地对应的目录是:D:\workassets,我们希望所有对 http://a.mycdn.com/* 的访问被映射到本地的 D:\workassets\* 下

  • python 开发的三种运行模式详细介绍

    Python 三种运行模式 Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用python既取决于你自己的业务场景,也取决于你自己的python应用能力.就我个人而言,我觉得python作为既可以用来进行业务的开发,也可以进行产品原型的开发.一般来说,python的运行主要下面这三种模式. 1.单循环模式 单循环模式使用的最多,也最简单,当然也最稳定.为什么呢,因为单循环本来代码就写的很少,出错

  • 一步步教你用Python实现2048小游戏

    前言 2048游戏规则:简单的移动方向键让数字叠加,并且获得这些数字每次叠加后的得分,当出现2048这个数字时游戏胜利.同时每次移动方向键时,都会在这个4*4的方格矩阵的空白区域随机产生一个数字2或者4,如果方格被数字填满了,那么就GameOver了. 主逻辑图 逻辑图解:黑色是逻辑层,蓝色是外部方法,红色是类内方法,稍后即可知道~ 下面容我逐行解释主逻辑main()函数,并且在其中穿叉外部定义的函数与类. 主逻辑代码解读(完整代码见文末) 主逻辑main如下,之后的是对主函数中的一些方法的解读

  • Python的Flask框架及Nginx实现静态文件访问限制功能

    Nginx配置 Ngnix,一个高性能的web服务器,毫无疑问它是当下的宠儿.卓越的性能,灵活可扩展,在服务器领域里攻城拔寨,征战天下. 静态文件对于大多数website是不可或缺的一部分.使用Nginx来处理静态文件也是常见的方式.然而,一些静态文件,我们并不像任何情况下都公开给任何用户.例如一些提供给用户下载的文件,一些用户上传的涉及用户隐私的图片等.我们我希望用户登录的情况下可以访问,未登录的用户则不可见. 粗略的处理,在后端程序可以做过滤,渲染页面的时候,在视图逻辑里面验证用户登录,然后

  • Python 3.x 连接数据库示例(pymysql 方式)

    由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 pymysql 模块. pymysql 模块可以通过 pip 安装.但如果你使用的是 pycharm IDE,则可以使用 project python 安装第三方模块. [File] >> [settings] >> [Project: python] >> [Project Interpreter] >> [Install按钮] 由于Python

  • Python使用中文正则表达式匹配指定中文字符串的方法示例

    本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

  • python django 访问静态文件出现404或500错误

    django static文件夹下面的内容方法不了 出现404 500错误 需要查看自己的settings文件确保有一下内容 import os PROJECT_ROOT = os.path.dirname(__file__) DEBUG = True STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(PROJECT_ROOT, 'static'), ) STATICFILES_FINDERS = ( 'django.contri

  • Python中二维列表如何获取子区域元素的组成

    用过NumPY的应该都知道,在二维数组中可以方便地使用区域切片功能,如下图: 而这个功能在Python标准库的List中是不支持的,在List中只能以一维方式来进行切片操作: 但有时候我只想用一下这个功能,但又不想引入NumPY.其实这时候我也是可以在Python中实现的.这时候,只需在一个类中实现__getitem__特殊方法: class Array: """实现__getitem__,支持序列获取元素.Slice等特性""" def __i

  • Python的Bottle框架中返回静态文件和JSON对象的方法

    代码如下: # -*- coding: utf-8 -*- #!/usr/bin/python # filename: todo.py # codedtime: 2014-8-28 20:50:44 import sqlite3 import bottle @bottle.route('/help3') def help(): return bottle.static_file('help.html', root='.') #静态文件 @bottle.route('/json:json#[0-9

  • python解决汉字编码问题:Unicode Decode Error

    前言 最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件.文档之前是由base64编码,导致所有汉字读取显示乱码.项目组把base64废弃之后,先后出现两个错误: ascii codec can't encode characters in position ordinal not in range 128 UnicodeDecodeError: 'utf8' codec can't decode byte 0x. 如果对于ascii.unicode和utf-8还不了解的小伙伴

随机推荐