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入门之modf()方法的使用
May 15 Python
Python读写unicode文件的方法
Jul 10 Python
python相似模块用例
Mar 04 Python
Django rest framework工具包简单用法示例
Jul 20 Python
面向初学者的Python编辑器Mu
Oct 08 Python
Python语言快速上手学习方法
Dec 14 Python
python读取各种文件数据方法解析
Dec 29 Python
详解python中init方法和随机数方法
Mar 13 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
Python遍历字典方式就实例详解
Dec 28 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
如何创建一个Flask项目并进行简单配置
Nov 18 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
PHP4实际应用经验篇(1)
2006/10/09 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
Flask之flask-session的具体使用
2018/07/26 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
Python内置异常类型全面汇总
2020/05/28 Python
python 进程池pool使用详解
2020/10/15 Python
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
什么是规则表达式
2012/05/03 面试题
行政总经理岗位职责
2013/12/05 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
二年级学生评语大全
2014/04/23 职场文书
2014年测量员工作总结
2014/12/12 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技