Python开发入门——迭代的基本使用


Posted in Python onSeptember 03, 2020

介绍

本文主要介绍Python中迭代的基本知识和使用

什么是迭代

在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)。

在Python中,迭代是通过 for ... in 来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码:

for (i=0; i<list.length; i++) {
  n = list[i];
}

可以看出,Python的for循环抽象程度要高于Java的for循环。

因为 Python 的 for循环不仅可以用在list或tuple上,还可以作用在其他任何可迭代对象上。

因此,迭代操作就是对于一个集合,无论该集合是有序还是无序,我们用 for 循环总是可以依次取出集合的每一个元素。

注意: 集合是指包含一组元素的数据结构,我们已经介绍的包括:

  1. 有序集合:list,tuple,str和unicode;
  2. 无序集合:set
  3. 无序集合并且具有 key-value 对:dict

而迭代是一个动词,它指的是一种操作,在Python中,就是 for 循环。

迭代与按下标访问数组最大的不同是,后者是一种具体的迭代实现方式,而前者只关心迭代结果,根本不关心迭代内部是如何实现的。

索引迭代

Python中,迭代永远是取出元素本身,而非元素的索引。

对于有序集合,元素确实是有索引的。有的时候,我们确实想在 for 循环中拿到索引,怎么办?

方法是使用 enumerate() 函数:

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
...   print index, '-', name
... 
0 - Adam
1 - Lisa
2 - Bart
3 - Paul

使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。但是,这不是 enumerate() 的特殊语法。实际上,enumerate() 函数把:

['Adam', 'Lisa', 'Bart', 'Paul']

变成了类似:

[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]

因此,迭代的每一个元素实际上是一个tuple:

for t in enumerate(L):
  index = t[0]
  name = t[1]
  print index, '-', name

如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为:

for index, name in enumerate(L):
  print index, '-', name

这样不但代码更简单,而且还少了两条赋值语句。

可见,索引迭代也不是真的按索引访问,而是由 enumerate() 函数自动把每个元素变成 (index, element) 这样的tuple,再迭代,就同时获得了索引和元素本身。

迭代dict的value

我们已经了解了dict对象本身就是可迭代对象,用for循环直接迭代dict,可以每次拿到dict的一个key。
如果我们希望迭代 dict 对象的value,应该怎么做?

dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
  print v
# 85
# 95
# 59

如果仔细阅读Python的文档,还可以发现,dict除了values()方法外,还有一个 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一样:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.itervalues()
# <dictionary-valueiterator object at 0x106adbb50>
for v in d.itervalues():
  print v
# 85
# 95
# 59

那这两个方法有何不同之处呢?

  1. values() 方法实际上把一个 dict 转换成了包含 value 的list。
  2. 但是itervalues()方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
  3. 打印 itervalues() 发现它返回一个 对象,这说明在Python中,for循环可作用的迭代对象远不止list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环,而内部如何迭代我们通常并不用关心。

如果一个对象说自己可迭代,那我们就直接用for循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。

迭代dict的key和value

我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value?答案是肯定的。

首先,我们看看 dict 对象的 items() 方法返回的值:

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
>>> print d.items()
[('Lisa', 85), ('Adam', 95), ('Bart', 59)]

可以看到,items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:

>>> for key, value in d.items():
...   print key, ':', value
... 
Lisa : 85
Adam : 95
Bart : 59

和 values() 有一个 itervalues() 类似, items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。

结语

以上就是Python开发入门——迭代的基本使用的详细内容,更多关于python 迭代的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python查询sqlite数据表的方法
May 08 Python
python 写入csv乱码问题解决方法
Oct 23 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
python 执行shell命令并将结果保存的实例
May 11 Python
解析PyCharm Python运行权限问题
Jan 08 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
python相对企业语言优势在哪
Jun 12 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python爬虫筛选工作实例讲解
Nov 23 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 #Python
Python多分支if语句的使用
Sep 03 #Python
Python判断字符串是否为合法标示符操作
Sep 03 #Python
图解Python中深浅copy(通俗易懂)
Sep 03 #Python
python简单实现9宫格图片实例
Sep 03 #Python
django使用graphql的实例
Sep 02 #Python
django数据模型中null和blank的区别说明
Sep 02 #Python
You might like
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
python中MySQLdb模块用法实例
2014/11/10 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
区域总监的岗位职责
2013/11/21 职场文书
求职自荐书范文
2013/12/04 职场文书
主题教育活动总结
2014/05/05 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
先进人物事迹材料
2014/12/29 职场文书