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 常用string函数详解
May 30 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
python 垃圾收集机制的实例详解
Aug 20 Python
你真的了解Python的random模块吗?
Dec 12 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
什么是Python包的循环导入
Sep 08 Python
如何通过python计算圆周率PI
Nov 11 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手册及PHP编程标准
2006/12/17 PHP
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
总结一些js自定义的函数
2006/08/05 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
javascript history对象详解
2017/02/09 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
简单易懂的python环境安装教程
2017/07/13 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Python如何将字符串转换为日期
2020/07/31 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
Ruby如何创建一个线程
2013/03/10 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
人事代理委托书
2014/09/27 职场文书
商务英语求职信范文
2015/03/19 职场文书
2015年宣传工作总结
2015/04/08 职场文书