最近从传统图像处理转到深度学习,c++换python,虽然有一点代码基础,但是python的语言风格和数据类型定义还是有很大区别的,直接看一些经典模型的代码看不太懂,所以还需要补一补python的基础。
一、python语法
1.1 OrderedDict
-
官方介绍
按照有序插入顺序存储的有序字典
class OrderedDict(dict): 'Dictionary that remembers insertion order'
-
基础用法
from collections import OrderedDict if __name__ == '__main__': ordDic = OrderedDict() ordDic["name"] = "小明" ordDic["age"] = "18" ordDic["three"] = "3" ordDic["four"] = "4" ordDic["five"] = "5" for key in ordDic: print(key) #------------------------------# 输出: name age three four five # 按照插入的顺序依次输出
-
常用函数
import collections dic = collections.OrderedDict() # clear(清空有序字典) dic.clear() # copy(拷贝) new_dic = dic.copy() # items(返回由“键值对组成元素“的列表) dic.items() # keys(获取字典所有的key) dic.keys() # values(获取字典所有的value,返回一个列表) dic.value() # pop(获取指定key的value,并在字典中删除) dic.pop("name") # 删除name, 注意必须指定关键字key # popitem(按照后进先出原则,删除最后加入的元素,返回key-value) dic.popitem() # 删除最后加入的 dic.popitem(last=False) # 删除第一个加入的
二、python面向对象
2.1 python类的方法中的 冒号(:)和箭头(->)
冒号表示希望传入实参的类型
箭头表示希望返回什么类型
class Employee:
'所有员工的基类'
empCount = 0
# 函数参数中的冒号是参数的类型建议符,告诉程序员希望传入的实参的类型。函数后面跟着的箭头是函数返回值的类型建议符,用来说明该函数返回的值是什么类型。
# 值得注意的是,类型建议符并非强制规定和检查,也就是说即使传入的实际参数与建议参数不符,也不会报错
def __init__(self, name: int = "morenzhi", salary: int = "10"):
self.name = name
self.salary = salary
Employee.empCount += 1
# 这里输出一下self,self 代表的是类的实例,代表当前对象的地址
# 此外,self也可以换成别的
def printSelf(ddd) -> int:
print(ddd)
return "jiantoufanhui"
def displayCount(self):
print("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print("Name : ", self.name, ", Salary: ", self.salary)
def testClass():
emp1 = Employee()
emp2 = Employee("emp1", 200)
emp3 = Employee("emp1", 300)
# 输出一串地址
print(emp1.printSelf())
print(emp1.name)
print(emp2.name)
if __name__ == '__main__':
testClass()
2.2 python中类的继承
-
继承的定义还是很简单的。这里先自己定义一个 ConvBNActivation 类,在后面括号中写入 nn.Sequential,表示继承这个类
# ConvBNActivation继承nn.Sequential # 卷积BN以及激活函数 class ConvBNActivation(nn.Sequential): def __init__(self, .................... ....................) print("ConvBNActivationInit") print(nn.Sequential)
-
我们在Sequential(父类)中新加一个打印,测试一下父子类运行的顺序
class Sequential(Module): print("SequentialInit")
-
在主函数中运行(实例化)一下ConvBNActivation
if __name__ == '__main__': ConvBNActivation(10,10)
-
输出
所以,运行顺序是先运行父类,后运行子类
此外,可以在需要的位置使用
super().父类方法
来调用父类方法的执行,这个点比较简单,就不做测试了。