Python 这门语言的, 入门容易, 精通难, 难在语法糖吧. Python有很多trick, 可以让代码更优雅,高效,高质量.
2016年6~8月我周末都是在听一些公开课,在cs212上学了一些更Pythonic的写法:
找出一个列表中元素出现次数最多的元素:
1 | a = [1,2,3,4,2,2,3,3,3,1] |
关于 Super
1,
1 | .__init__()是为了继承父类的init. |
#常见的Python写法:
###生成器(gernerator), yield, .next()
1 | g = (x * x for x in range(10)) |
迭代器:
1 | L = [x * x for x in range(10)] |
列表生成式:
1 | [x * x for x in range(1, 11) if x % 2 == 0] |
map / reduce / Filter:
1 | >>>map(函数, 可迭代的对象) |
匿名函数
一些魔法方法
枚举
利用collections.deque 保留有限的历史纪录:
使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并 且这个队列已满的时候,最老的元素会自动被移除掉。
1 | q = deque(maxlen=3) |
如何在循环中获取下标:
1 | for idx, val in enumerate(ints): |
如何判断一个对象是否拥有某个属性:
1 | if hasattr(a, 'property'): |
@staticmethod和@classmethod的区别
is是身份测试,==是相等测试:
1 | a = 'pub' |
如何获取文件扩展名:
1 | import os |
如何获取list中包含某个元素所在的下标:
1 | [“foo”,“bar”,“baz”].index('bar') |
浅拷贝深拷贝
- 对象的赋值是:获得了当前元素的地址元素以及子元素的地址
- 浅拷贝: 浅拷贝仅仅复制了容器中元素的地址
- 深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样
总结: 浅拷贝深拷贝的问题还是跟Python的引用机制有关, 说白了, append,pop这些操作, 不更换地址.
而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。
也就是说, 地址里的内存元素不可变, 只能另外申请一个内存.