最近在看和使用github上的代码的时候,越来越发现不同来源的代码风格差异很大,个人的代码一般都比较直观,而大厂的代码都有一些固定的习惯。最近一直在看OpenAI的深度强化学习的python代码,发现了一些平时个人不怎么常用,但是却很不错的常用法,因此记录学习一下。
1 enumerate()
用于包装循环,返回索引和内容:
list1 = [2, 3, 4]
for i, eve in enumerate(list1):
print(i, eve)
结果会是:
1 2
2 3
3 4
之前自己喜欢用for in range(len(…))的方式,但是不如这种方式直观。
2 father.init(self, paras)
大厂的算法程序喜欢多使用继承关系,将共有的一些属性和方法作为基类去实现,然后子类去继承或者重写父类。
虽然以前学过这种基本的面向对象设计思想,但是在实际中真正看到其应用还是感觉很不一样。
比如实现多种DQN算法,DQN就是父类,DDQN就是子类。
多使用继承的机制,可以让算法的代码更容易理解和规范。
3 *para
a = 1
b = 2
c = a, b
上面的代码中c就会变成一个tuple,元组。
但是python中的元组还有解包的作用,比如函数想要传两个参数,则可以这样做:
def d(a, b):
return a + b
d(*c)
*就代表了对元组中的元素进行解包,算是程序的简化方法。
4 numpy.array
自己一般喜欢使用list列表,觉得是python原生的东西很好用,但是实际上numpy里的array底层计算效率更高(网上说的),主要是一些方法和属性很适合数组操作,因此当list中全是数时建议使用numpy.array。
a = [1, 2]
b = [3, 4]
c = a + b # [1, 2, 3, 4]
a = np.array(a)
b = np.array(b)
c = a + b # np.array([4, 6])