减小 Python 中循环的使用python
如何以及为何应该在 Python 中减小循环的使用?web
 on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)](http://static.javashuo.com/static/loading.gif)
Python 提供给咱们多种编码方式。
这里还要注意:无论你是为了Python就业仍是兴趣爱好,记住:项目开发经验永远是核心,若是你没有2020最新python入门到高级实战视频教程,能够去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下能够找到了,里面不少新python教程项目,还能够跟老司机交流讨教!数组
在某种程度上,这至关具备包容性。网络
来自于任何语言的人均可以编写 Python。机器学习
然而,学习写一门语言和以最优的方式写一门语言是两件不一样的事情。学习
在这一系列名为 Python Shorts 的文章中,我将阐述 Python 提供的一些简单可是很是有用的结构,一些小技巧以及一些我在数据科学工做中遇到的案例。编码
在这篇文章中,我将讨论 Python 中的 for
循环,以及如何尽可能避免使用它们。spa
写 for 循环的 3 种方式:
让我用一个简单的例子来解释下。code
假设你想取得一个列表中的平方和。orm
在机器学习中,当咱们想计算 n 维状况下两点之间的距离时,咱们都会面临这个问题。
你可使用循环很容易的作到这一点。
事实上,我想展现给你我看到的用来完成一样任务的三种方式,并让你选择你认为最好的方式。
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 的风格。 - 能够用 List Comprehension 作到吗?若是是,使用它。
- 能够不索引数组吗?若是不是,考虑使用
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
也能够尝试使用 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就业仍是兴趣爱好,记住:项目开发经验永远是核心,若是你没有2020最新python入门到高级实战视频教程,能够去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下能够找到了,里面不少新python教程项目,还能够跟老司机交流讨教!本文的文字及图片来源于网络加上本身的想法,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。