- 原文地址:Minimize for loop usage in Python
- 原文做者:Rahul Agarwal
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:qiuyuezhong
- 校对者:MollyAredtana、shixi-li
如何以及为何应该在 Python 中减小循环的使用?前端
Python 提供给咱们多种编码方式。python
在某种程度上,这至关具备包容性。android
来自于任何语言的人均可以编写 Python。ios
然而,学习写一门语言和以最优的方式写一门语言是两件不一样的事情。git
在这一系列名为 Python Shorts 的文章中,我将阐述 Python 提供的一些简单可是很是有用的结构,一些小技巧以及一些我在数据科学工做中遇到的案例。github
在这篇文章中,我将讨论 Python 中的 for
循环,以及如何尽可能避免使用它们。后端
让我用一个简单的例子来解释下。数组
假设你想取得一个列表中的平方和。机器学习
在机器学习中,当咱们想计算 n 维状况下两点之间的距离时,咱们都会面临这个问题。oop
你可使用循环很容易的作到这一点。
事实上,我想展现给你我看到的用来完成一样任务的三种方式,并让你选择你认为最好的方式。
x = [1,3,5,7,9]
sum_squared = 0
for i in range(len(x)):
sum_squared+=x[i]**2
复制代码
当我在 Python 代码中看到以上代码的时候,我知道这我的是拥有 C 或者 Java 背景的。
完成一样的事情,更 Pythonic 的方式是:
x = [1,3,5,7,9]
sum_squared = 0
for y in x:
sum_squared+=y**2
复制代码
这样更好了。
我没有索引这个列表。而且个人代码更具备可读性。
可是,更 Pythonic 的方式一行就能够完成。
x = [1,3,5,7,9]
sum_squared = sum([y**2 for y in x])
复制代码
这种方法称为 List Comprehension,这极可能是我爱上 Python 的缘由之一。
你也能够在 List Comprehension 中使用 if
。
假设咱们只想要偶数的平方数列表。
x = [1,2,3,4,5,6,7,8,9]
even_squared = [y**2 for y in x if y%2==0]
# 输出结果:
[4,16,36,64]
复制代码
if-else
?
若是咱们同时想要偶数的平方数和奇数的立方数呢?
x = [1,2,3,4,5,6,7,8,9]
squared_cubed = [y**2 if y%2==0 else y**3 for y in x]
# 输出结果:
[1, 4, 27, 16, 125, 36, 343, 64, 729]
复制代码
太棒了!
所以,大致上遵循这个具体的准则:每当你想写一个 for
语句的时候,你应该问本身如下的问题,
for
作到吗?更 Pythonic 的风格。enumerate
。什么是 enumerate
?
有时咱们既须要数组中的索引,也须要数组中的值。
在这种状况下,我更喜欢使用 enumerate 而不是索引列表。
L = ['blue', 'yellow', 'orange']
for i, val in enumerate(L):
print("index is %d and value is %s" % (i, val))
# 输出结果:
index is 0 and value is blue
index is 1 and value is yellow
index is 2 and value is orange
复制代码
有个规则是:
毫不索引一个列表,若是你能不使用它。
也能够尝试使用 Dictionary Comprehension,它是 Python 中相对较新的补充,语法和 List Comprehension 很类似。
让我用一个例子来解释。我想为 x 中的每一个值获取一个 dictionary(key:平方值)。
x = [1,2,3,4,5,6,7,8,9]
{k:k**2 for k in x}
# 输出结果:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
复制代码
若是只想获得偶数值的 dictionary 怎么办?
x = [1,2,3,4,5,6,7,8,9]
{k:k**2 for k in x if x%2==0}
# 输出结果:
{2: 4, 4: 16, 6: 36, 8: 64}
复制代码
若是想同时获得偶数值的平方和奇数值的立方怎么办?
x = [1,2,3,4,5,6,7,8,9]
{k:k**2 if k%2==0 else k**3 for k in x}
# 输出结果:
{1: 1, 2: 4, 3: 27, 4: 16, 5: 125, 6: 36, 7: 343, 8: 64, 9: 729}
复制代码
最后,我要说的是,虽然看上去很容易将从其余语言得到的知识移用到 Python 上,但若是继续这样作,你将没法理解到 Python 的优美。当咱们用 Python 的方式使用它,它的功能要强大得多,也要有趣得多。
因此,当须要 for
循环的时候,使用 List Comprehensions 和 Dictionary Comprehensions。当须要数组索引的时候,使用 enumerate
。
避免像传染病同样的循环
从长远来看,你的代码将更具可读性和可维护性。
另外,若是您想了解更多关于 Python 3 的知识,我想推荐密歇根大学的一门优秀课程 Intermediate level Python。必定要去看看。
未来我也会写更多适合初学者的文章。请让我知道你对这个系列的见解。关注个人 Medium 或订阅个人博客以了解相关信息。
和往常同样,我欢迎反馈和建设性的评论,能够经过 Twitter 联系 @mlwhiz。
最初在 2019 年 4 月 23 号发布于 mlwhiz.com。
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。