Python 迭代,for...in遍历,迭代原理与应用示例


Posted in Python onOctober 12, 2019

本文实例讲述了Python 迭代,for...in遍历,迭代原理与应用。分享给大家供大家参考,具体如下:

迭代是访问集合元素的一种方式。什么时候访问元素,什么时候再迭代,比一次性取出集合中的所有元素要节约内存。特别是访问大的集合时,用迭代的方式访问,比一次性把集合都读到内存要节省资源。

demo.py(迭代,遍历):

import time
from collections import Iterable
from collections import Iterator
# 有__iter__方法的类是Iterable(可迭代的)。
# 既有__iter__方法又有__next__方法是Iterator(迭代器)。
class Classmate(object):
  def __init__(self):
    self.names = list()
    self.current_num = 0
  def add(self, name):
    self.names.append(name)
  def __iter__(self):
    """Iterable对象必须实现__iter__方法"""
    return self # __iter__方法必须返回一个Iterator(既有__iter__方法,又有__next__方法)
  # __next__的返回值就是for循环遍历出的变量值
  def __next__(self):
    if self.current_num < len(self.names):
      ret = self.names[self.current_num]
      self.current_num += 1
      return ret
    else:
      raise StopIteration # 抛出StopIteration异常时,for遍历会停止迭代
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))
# classmate_iterator = iter(classmate) # iter()会调用对象的__iter__方法
# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))
# print(next(classmate_iterator))  # next()会调用对象的__next__方法
for name in classmate: # 遍历时会先调用classmate的__iter__方法(必须返回Iterator对象)。
  print(name)  # 遍历出的name就是返回的Iterator对象的__next__方法的返回值
  time.sleep(1) # 当__next__抛出StopIteration异常时,for遍历会停止迭代

运行结果:

老王
王二
张三

demo.py(迭代的应用):

li = list(可迭代对象)    # 将可迭代对象转换成list类型。 底层就是通过迭代实现的。
print(li)
tp = tuple(可迭代对象)    # 将可迭代对象转换成tuple类型。
print(tp)
# for ... in 可迭代对象     # for遍历也是通过迭代实现的

如上例改写如下:

示例1:

class Classmate(object):
  def __init__(self):
    self.names = list()
    self.current_num = 0
  def add(self, name):
    self.names.append(name)
  def __iter__(self):
    """Iterable对象必须实现__iter__方法"""
    return self # __iter__方法必须返回一个Iterator(既有__iter__方法,又有__next__方法)
  # __next__的返回值就是for循环遍历出的变量值
  def __next__(self):
    if self.current_num < len(self.names):
      ret = self.names[self.current_num]
      self.current_num += 1
      return ret
    else:
      raise StopIteration # 抛出StopIteration异常时,for遍历会停止迭代
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
li = list(classmate)  # 将可迭代对象转换成list类型。 底层就是通过迭代实现的。
print(li)

输出:

['老王', '王二', '张三']

示例2:

class Classmate(object):
  def __init__(self):
    self.names = list()
    self.current_num = 0
  def add(self, name):
    self.names.append(name)
  def __iter__(self):
    """Iterable对象必须实现__iter__方法"""
    return self # __iter__方法必须返回一个Iterator(既有__iter__方法,又有__next__方法)
  # __next__的返回值就是for循环遍历出的变量值
  def __next__(self):
    if self.current_num < len(self.names):
      ret = self.names[self.current_num]
      self.current_num += 1
      return ret
    else:
      raise StopIteration # 抛出StopIteration异常时,for遍历会停止迭代
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
tp = tuple(classmate)  # 将可迭代对象转换成tuple类型。
print(tp)

输出:

('老王', '王二', '张三')

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
Python中的下划线详解
Jun 24 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
python调试工具Birdseye的使用教程
May 25 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 #Python
Python Collatz序列实现过程解析
Oct 12 #Python
python logging日志模块原理及操作解析
Oct 12 #Python
Python爬虫之urllib基础用法教程
Oct 12 #Python
python 生成器和迭代器的原理解析
Oct 12 #Python
python 表格打印代码实例解析
Oct 12 #Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 #Python
You might like
PHP如何抛出异常处理错误
2011/03/02 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
复选框全选与全不选操作实现思路
2013/08/18 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
Python中列表(list)操作方法汇总
2014/08/18 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
python3实现字符串操作的实例代码
2019/04/16 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
对python中list的五种查找方法说明
2020/07/13 Python
python import 上级目录的导入
2020/11/03 Python
卫校中专生个人自我评价
2013/09/19 职场文书
平面设计师的工作职责
2013/11/21 职场文书
校本教研工作方案
2014/01/14 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
2015年教研组工作总结
2015/05/04 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
关于使用Redisson订阅数问题
2022/01/18 Redis