Python style——用Python独有的风格写Python代码


作者:littlewhite

现在很多计算机专业出身的人第一编程语言都是C/C++或JAVA,但是在工作中,不可避免的需要用到一些脚本语言,比如Python。脚本语言用来做基础调研和模型开发最适合不过,当你觉得shell命令组合运行效率太低,而C代码开发效率太低的时候,Python就派上用场了。但是很多人在初学习Python的时候会以被以往的编程思维模式影响,这样写出来的代码冗长且效率低下,这里专门总结一些用Python独有的风格去实现一些简单的功能,展示一下Python独有的魅力

1、给定一个序列A,求方差

我们先来看下求方差的公式
Var(X) = E[(X-\mu)^2]
基本的定义大家应该都知道,这里稍作说明:E[X]是随机变量X的期望值,平均数μ=E[X]
目测一下最直观的实现方式就是构建一个新的序列并求平均值,实现如下:

## 先求序列平均数u
u = 1.0*sum(A)/len(A)
## 构建序列B
B = []
for in in range(1, len(A)):
    B.append((A[i] - u)**2)
## 求B的平均数
V = 1.0*sum(B)/len(B)

看上去思路清晰,也很容易让人看懂,但这种代码和用C写出来的有什么区别呢,其实用Python有更简洁的写法:

V = sum([(x - 1.0*sum(A)/len(A))**2 for x in A])/len(A)

这里的核心部分是[(x - 1.0*sum(A)/len(A))**2 for x in A],这个用到了Python的列表解析
列表解析是神马东东,下面举个例子就很清楚,想知道定义的自行百度Google
假设现有列表A = [1, 2, 3]
定义列表B = [x+1 for x in A]
那么B = [2, 3, 4]
大致明白了吧,生成的列表B和A是一样长的,B的每个元素B[i]是由A的对应元素A[i]进行一次计算得到的,这个计算公式就是你在for前面定义的,这里是A[i] + 1
好了,该收场了,但是上面的求方差的方式并不是最理想的,因为sum(A)/len(A)在进行列表解析的时候每次迭代都会被计算一次,当然你可以在前面先用变量记录下该值,但如果只用一行代码且彻底解决这个问题,就需要将方差的公式做一下变形如下:
Var(X) = E[X^2-2XE(X)+(E[X])^2]=E[X^2]-2E[X]E[X]+(E[X])^2=E[X^2]-(E[X])^2
根据这个公式再加上列表解析,就可以得出最优的一个方案,大家可以自己先想想,文章末尾会给出答案。

To be continued..

 

本文遗留问题的参考答案:
1、方差

V = 1.0*sum([x*x for x in A])/len(A) - (1.0*sum(A)/len(A))**2

发表评论

电子邮件地址不会被公开。 必填项已用*标注