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时间戳与时间字符串互相转换实例代码
Nov 28 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
Python+selenium 获取一组元素属性值的实例
Jun 22 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
python多进程控制学习小结
Oct 31 Python
在Python中append以及extend返回None的例子
Jul 20 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
深入解析NumPy中的Broadcasting广播机制
May 30 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
模仿OSO的论坛(四)
2006/10/09 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
js里的prototype使用示例
2010/11/19 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
python字符串string的内置方法实例详解
2018/05/14 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
存储过程的优点有哪些
2012/09/27 面试题
Unix/Linux开发面试题
2016/08/16 面试题
学生自我鉴定
2013/12/18 职场文书
总经理职责
2013/12/22 职场文书
颁奖典礼主持词
2014/03/25 职场文书
课外访万家心得体会
2014/09/03 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL