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

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

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

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

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

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

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

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

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

0e26d838bbf24bb28367132266d46a7d.png

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

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

eaf759359d2745eaa8d20d20c94ee4c0.png

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

046cbb59bf8c47ac88d0e31b5b905b55.png

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

2764181b458742b08204136e12ae5bea.png

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

7ddd6c719829458eba9f12af1eea1e24.png

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

1ff663f3122b476b9611e5998a47ef92.png

哎嘿!就是这样,完美!

我们能从中学到什么?

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

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

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

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

你很难在类似C++这样的编译语言中做到这样的事。这也是Python中你最应该着重利用的特性之一。做到这些,那声"漂亮"就是为你的代码而欢呼的。英文原文:https://dbader.org/blog/writing-pythonic-code?utm_source=mybridge&utm_medium=web&utm_campaign=read_more

译者:烟熏把里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值