Py学习  »  Python

利用你所知道的Python技巧写出更加Pythonic的代码

Python程序员 • 6 年前 • 402 次点击  

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。


我经常在了解到Python的一些新特性和用法时犯一个错误... 我这篇文章讲的就是让你如何避免这个坑的同时也进一步了解enumerate这个函数。


当我学到一个Python新技巧的时候我总会马上感觉到这东西是对我有帮助的,这种感觉差不多就像是我内心很确定地知道它有用处。然而当我坐下来仔细思量一番,我又很难立马找到一个场景去真正的使用这个新技巧。


所以这里的问题就是,你如何将你学到,了解到的新的函数或者模块写成最Pythonic的代码,然后让code reviewer给你点一个大大的赞呢?


有一天我的博客文章订阅者保罗问了我一个问题,这个问题是关于我的另外一篇文章中关于Python的enumerate函数的部分的。


昨天我碰到了一个场景需要我写出一个将enumerate的下标变成哈希表中的值,迭代的元素变成键的字典(差不多类似于{'Bob': 0}这种情况). 我当时是用的列表长度结合zip函数的方式通过字典解析式完成的。

有其他更加Pythonic的方式去解决这个问题吗?

为了让你们更了解当时的具体情况,下面用代码告诉你们保罗究竟想干啥:

其实说白了就是从输入的数组里得到一个以元素->元素下标为格式的键值对的字典,这样就可以通过元素本身去查找它在数组中的位置。


下面是保罗实现这个需求的方法:

看起来还行是吧,不过保罗觉得应该有办法写的更简洁。这跟我经常遇到的情况几乎一模一样。保罗的直觉意识到有办法利用enumerate函数让他的代码更加Pythonic。但是他应该如何实现他这个想法呢?我首先想到的是我们可以通过避免字典解析来缩短一点代码:

稍微简洁了一点(视觉上更清晰了一些),不过正像保罗一样,我对range(len(...))这种结构还是不太满意的。让我们尝试一下使用enumerate():

好了,所以这里我可以利用enumerate对数组中的元素和下标进行一一配对。让我们把上面这个表达转换成字典:

我们已经非常接近最后答案了!上面这种表达可以说基本上就是我们最终想要的结果,唯一不同在于键值的位置反了。所以我们能如何将键值对反过来呢?让我们从新回到字典解析的方法:

哎嘿!就是这样,完美!


我们能从中学到什么?


其实通过上面这样的一个思考过程,在一步步推导和咀嚼后,对于你的进步是很有帮助的。


你看,从始至终保罗的思维都是对的。确实是有通过利用enumerate函数的方法来使代码更简洁的。只是说这种方法的具体原理稍微有点不清晰。


所以当你发现自己也身处这种情况时,请沉下去探索吧!


Python在处理这种类似随手一测的小问题时是非常优秀的语言。就像我在回复保罗的邮件时,我做的第一件事就是打开Python解释器然后自己做一些小实验。


你很难在类似C++这样的编译语言中做到这样的事。这也是Python中你最应该着重利用的特性之一。做到这些,那声"漂亮"就是为你的代码而欢呼的。


英文原文:https://dbader.org/blog/writing-pythonic-code?utm_source=mybridge&utm_medium=web&utm_campaign=read_more
译者:烟熏把里



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/N1GmoUwVRj
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/8465
 
402 次点击