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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
跟老齐学Python之不要红头文件(1)
Sep 28 Python
Python中list列表的一些进阶使用方法介绍
Aug 15 Python
Python制作钉钉加密/解密工具
Dec 07 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
Jul 19 Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 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
多重?l件?合查?(二)
2006/10/09 PHP
一个MYSQL操作类
2006/11/16 PHP
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
类如何去实现接口
2013/12/19 面试题
项目经理的岗位职责
2013/11/23 职场文书
学校清明节活动总结
2014/07/04 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书