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中黄金分割法实现方法
May 06 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
Python字符串格式化的方法(两种)
Sep 19 Python
Python之读取TXT文件的方法小结
Apr 27 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
pandas 选择某几列的方法
Jul 03 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python logging模块的使用总结
Jul 09 Python
Python list运算操作代码实例解析
Jan 20 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
Python求区间正整数内所有素数之和的方法实例
Oct 13 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
支持oicq头像的留言簿(二)
2006/10/09 PHP
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
js继承的实现代码
2010/08/05 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jquery获取节点名称
2015/04/26 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
node网页分段渲染详解
2016/09/05 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
Python实现队列的方法
2015/05/26 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python高斯消除矩阵
2019/01/02 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
幼儿评语大全
2014/04/30 职场文书
应急处置方案
2014/06/16 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
保送生自荐信范文
2015/03/26 职场文书
学生通报表扬范文
2015/05/04 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
小学数学国培研修日志
2015/11/13 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技