- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
建议15:使用 enumerate() 获取序列迭代的索引和值
基本上所有的项目中都存在对序列进行迭代并获取序列中的元素进行处理的场景。这是一个非常普通而且简单的需求,相信很多人一口气能写出N种实现方法。举例如下。
方法一 在每次循环中对索引变量进行自增。
li = [a', 'b', 'c', 'd', 'e'] index=0 for i in li: print "index:",index,"element:",i index+=1
方法二 使用range()和len()方法结合。
li = ['a', 'b', 'c', 'd', 'e'] for i in range(len(li)): print "index:",i,"element:",li[i]
方法三 使用while循环,用len()获取循环次数。
li = ['a', 'b', 'c', 'd', 'e'] index=0 while index < len(li): print "index:",index,"element:",li[index] index+=1
方法四 使用zip()方法。
li = ['a', 'b', 'c', 'd', 'e'] for i, e in zip(range(len(li)), li): print "index:",i,"element:",e
方法五 使用enumerate()获取序列迭代的索引和值。
li = ['a', 'b', 'c', 'd', 'e'] for i,e in enumerate(li): print "index:",i,"element:",e
这里推荐的是使用方法五,因为它代码清晰简洁,可读性最好。函数enumerate()是在Python2.3中引入的,主要是为了解决在循环中获取索引以及对应值的问题。它具有一定的惰性(lazy),每次仅在需要的时候才会产生一个(index,item)对。其函数签名如下:
enumerate(sequence, start=0)
其中,sequence可以为序列,如list、set等,也可以为一个iterato或者任何可以迭代的对象,默认的start为0,函数返回本质上为一个迭代器,可以使用next()方法获取下一个迭代元素,如下所示:
>>> li = ['a', 'b', 'c', 'd', 'e'] >>> print enumerate(li) <enumerate object at 0x00373E18> >>> e = enumerate(li) >>> e.next() (0, 'a') >>> e.next() (1, 'b')
enumerate()函数的内部实现非常简单,enumerate(sequence,start=0)实际相当于如下代码:
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1
因此利用这个特性用户还可以实现自己的enumerate()函数。比如,myenumerate()以反序的方式获取序列的索引和值。
def myenumerate(sequence): n = -1 for elem in reversed(sequence): yield len(sequence)+n, elem n =n-1 li = ['a', 'b', 'c', 'd', 'e'] for i,e in myenumerate(li): print "index:",i,"element:",e
程序输出如下:
index: 4 element: e index: 3 element: d index: 2 element: c index: 1 element: b index: 0 element: a
需要提醒的是,对于字典的迭代循环,enumerate()函数并不适合,虽然在使用上并不会提示错误,但输出的结果与期望的大相径庭,这是因为字典默认被转换成了序列进行处理。
personinfo = {'name': 'Jon', 'age': '20','hobby':'football'} for k, v in enumerate(personinfo): print k,v 输出为: 0 hobby 1 age 2 name
要获取迭代过程中字典的key和value,应该使用如下iteritems()方法:
for k,v in personinfo.iteritems(): print k,":",v
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论