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 Trie树实现字典排序
Mar 28 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
Django重置migrations文件的方法步骤
May 01 Python
简单了解python中对象的取反运算符
Jul 01 Python
python开头的coding设置方法
Aug 08 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
django自定义模板标签过程解析
Dec 14 Python
使用Pytorch来拟合函数方式
Jan 14 Python
Python requests获取网页常用方法解析
Feb 20 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
php头像上传预览实例代码
2017/05/02 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
javascript的BOM汇总
2015/07/16 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
合作意向书格式及范文
2014/03/31 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
幼儿教师个人总结
2015/02/05 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL