「埃尔法哥哥」如何减少Python中循环的使用?案例详解

减少Python中循环的使用
如何以及为什么应该在Python中减少循环的使用?
「埃尔法哥哥」如何减少Python中循环的使用?案例详解
文章图片
Python提供给我们多种编码方式 。 这里还要注意:不管你是为了Python就业还是兴趣爱好 , 记住:项目开发经验永远是核心 , 在某种程度上 , 这相当具有包容性 。
来自于任何语言的人都可以编写Python 。
然而 , 学习写一门语言和以最优的方式写一门语言是两件不同的事情 。
在这一系列名为PythonShorts的文章中 , 我将阐述Python提供的一些简单但是非常有用的结构 , 一些小技巧以及一些我在数据科学工作中遇到的案例 。
在这篇文章中 , 我将讨论Python中的for循环 , 以及如何尽量避免使用它们 。
写for循环的3种方式:
让我用一个简单的例子来解释下 。
假设你想取得一个列表中的平方和 。
在机器学习中 , 当我们想计算n维情况下两点之间的距离时 , 我们都会面临这个问题 。
你可以使用循环很容易的做到这一点 。
事实上 , 我想展示给你我看到的用来完成同样任务的三种方式 , 并让你选择你认为最好的方式 。
x=[1,3,5,7,9]
sum_squared=0
foriinrange(len(x)):
sum_squared+=x[i]**2
复制代码
当我在Python代码中看到以上代码的时候 , 我知道这个人是拥有C或者Java背景的 。
完成同样的事情 , 更Pythonic的方式是:
x=[1,3,5,7,9]
sum_squared=0
foryinx:
sum_squared+=y**2
复制代码
这样更好了 。
我没有索引这个列表 。 并且我的代码更具有可读性 。
但是 , 更Pythonic的方式一行就可以完成 。
x=[1,3,5,7,9]
sum_squared=sum([y**2foryinx])
复制代码
这种方法称为ListComprehension , 这很可能是我爱上Python的原因之一 。
你也可以在ListComprehension中使用if 。
假设我们只想要偶数的平方数列表 。
x=[1,2,3,4,5,6,7,8,9]
even_squared=[y**2foryinxify%2==0]
#输出结果:
[4,16,36,64]
复制代码
if-else?
如果我们同时想要偶数的平方数和奇数的立方数呢?
x=[1,2,3,4,5,6,7,8,9]
squared_cubed=[y**2ify%2==0elsey**3foryinx]
#输出结果:
[1,4,27,16,125,36,343,64,729]
复制代码
太棒了!
因此 , 大体上遵循这个具体的准则:每当你想写一个for语句的时候 , 你应该问自己以下的问题 ,
可以不用for做到吗?更Pythonic的风格 。
可以用ListComprehension做到吗?如果是 , 使用它 。
可以不索引数组吗?如果不是 , 考虑使用enumerate 。
什么是enumerate?
有时我们既需要数组中的索引 , 也需要数组中的值 。
在这种情况下 , 我更喜欢使用enumerate而不是索引列表 。
L=['blue','yellow','orange']
fori,valinenumerate(L):
print("indexis%dandvalueis%s"%(i,val))
#输出结果:
indexis0andvalueisblue
indexis1andvalueisyellow
indexis2andvalueisorange
复制代码
有个规则是:
绝不索引一个列表 , 如果你能不使用它 。
尝试使用DictionaryComprehension
也可以尝试使用DictionaryComprehension , 它是Python中相对较新的补充 , 语法和ListComprehension很相似 。
让我用一个例子来解释 。 我想为x中的每个值获取一个dictionary(key:平方值) 。
x=[1,2,3,4,5,6,7,8,9]
{k:k**2forkinx}
#输出结果:
{1:1,2:4,3:9,4:16,5:25,6:36,7:49,8:64,9:81}
复制代码
如果只想得到偶数值的dictionary怎么办?


推荐阅读