Python技巧二三事

使用 Python 作为研究仿真测试语言已经有一段时间了,慢慢的也积累了一些在科学计算中的技巧。

本文中讲持续记录实践中总结的经验,也包含了学科计算库(NumPySciPy)中的一些效率技巧与统计分析(Pandas)的高级使用方式。

值得注意的是:这里的技巧主要针对 Python3 以及 Python 2.7.0 以上版本,没有测试低版本的兼容性

废话不多说,直接上干货,并持续更新。

单行迭代、循环、遍历

Python 是一种脚本语言,因此有一些语法糖可以提高编程效率。在科学计算中,数据迭代、遍历这种最常见的用法,内容简单,处理麻烦。而 python 存在一些办法可以让这些繁琐的代码语意化,大大的提高了编程效率,方便了维护与改良,传播。

假设我现在有一个数组:data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

初阶:简单遍历

对于需要遍历数组列表中每个元素,并做出相应处理的操作,单行遍历的语法糖效率更高,可读性更好,编码也更简单。下面的代码将要遍历原列表中的每个元素,对其乘以2并返回结果:new_data: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

new_data = [each * 2 for each in data]

上面自然是文艺青年的用法,普通青年的用法如下:

new_data = list()
for each in data:
    new_data.append(each * 2)

进阶:附带条件的操作

更多的时候我们需要对列表中的元素进行筛选,以生成新的列表。下面我们将对原列表中的奇数乘以3:

new_data = [odd * 3 for odd in data if odd % 2 != 0]

高阶:对多个列表的组合迭代

还有时候,一个结果需要在多个列表的互相配合下才能得出,这里主要使用了一些 Python 的内置函数: ==zip==、==enumerate== 等等。下面代码的作用是这样的:[4, 6, 8] = [0, 1, 2] + [4, 5, 6]

a = [0, 1, 2]
b = [4, 5, 6]
  • 使用 zip 将两个数组联起来:

    c = [xa + xb for (xa, xb) in zip(a, b)]
    
  • 使用 enumerate 生成列表的序号:

    c = [index + xb for (index, xb) in enumerate(b)]
    
  • 普通青年写法:

    c = list()
    for index in range(len(a)):
        c.append(a[index] + b[index])
    

条件赋值

很多情况下,对一个数据的赋值需要根据一些条件进行判断,简单的说就是:如果 ==怎么样== 就 ==如此== ; 否则就 ==那般== 。

初学者往往会这样写代码:

if [condition]:
    a = 10
else:
    a = 5
print("a is: %d" % a)

但是进阶的用户也许会尝试这样的代码:

a = 10 if [condition] else 5
print("a is: %d" % a)

同样的,条件赋值可以让你的代码有更高的执行效率也更好的可维护性。又需要的话可以尝试一下哦。