1. python是动态强类型的语言。
动态还是静态指的是编译器还是运行期确定类型
强类型指的是不会发生隐式类型转换。比如js能够执行1+"1",但是python不行,所以python是弱类型的语言。
2. 鸭子类型
当一只鸟走起来像鸭子、游泳起来像鸭子、叫气力啊也像鸭子,那么这只鸟就可以被称为鸭子。
鸭子类型关注的是对象的行为,而不是类型。比如file,StringIO,socket对象都支持read/write方法,再比如定义了iter魔术方法的对象可以用for迭代。
3. monkey patch
所谓的monkey patch就是运行时替换。
4. 自省
运行时判断一个对象类型的能力。
python一切皆对象,用type, id, isinstance获取对象类型信息。
5. 列表和字典推导
如 [i for i in range(10) if i % 2 == 0],如果[]改为(),则为生成器
6. python2和python3
- print成为函数
- 编码问题。python3不再有unicode对象,默认str就是unicode
- 除法变化。python3除号返回浮点数,如果要返回整数,应使用//
- 类型注解。帮助IDE实现类型检查
- 优化的super()方便直接调用父类函数
- 高级解包操作。a, b, *rest = range(10)
- keyword only arguments。限定关键字参数
- chained exceptions。python3重新抛出异常不会丢失栈信息
- 一切返回迭代器。range, zip, map, dict.values, etc. are all iterators
- 性能优化等。。。
7. python如何传递参数
python既不是值传递也不是引用传递,唯一支持的参数传递是共享传参。
call by object(call by object reference or call by sharing)
call by sharing(共享传参),函数形参获得实参中各个引用的副本。
变量一切都是对象。list是可变对象,string是不可变对象
总结一下:根据对象的引用来传递,根据对象是可变对象还是不可变对象,得到两种不同的结果。如果是可变对象,则直接修改。如果是不可变对象,则生产新对象,让形参指向新对象
8. python可变/不可变对象
不可变对象: bool/int/float/tuple/str/frozenset
可变对象:list/set/dict
练习题:
# 1
def clear_list(l)
l = []
ll = [1,2,3]
clear_list(ll)
print(lll)
# 2
def fl(l=[1]):
l.append(1)
print(l)
fl()
fl()
# 记住:默认参数只计算一次
**9. *args, kwargs
用来处理可变参数,args被打包成tuple,kwargs被打包成dict
传递方式有两种
# 第一种
foo(1,2,3)
foo(a=1,b=2)
# 第二种
foo(*[1,2,3])
foo(**dict(a=1,b=2)})
10. python异常机制
BaseException
下面有SystemExit/KeyboardInterrupt/GeneratorExit/Exception(其他异常都属于它)
try:
# func # 可能会抛出异常的代码
except (Exception1, Exception2) as e: # 可以捕获多个异常并处理
# 异常处理的代码
else:
# pass # 异常没有发生的时候代码逻辑
finally:
pass # 无论异常有没有发生都会执行的代码,一般处理资源的关闭和释放
11. 自定义异常
继承Exception实现自定义异常,给异常加上一些附加信息
不用baseException是因为这样的话ctrl+c的keybord异常就用不了了
12. python性能分析与优化,GIL
- cpython解释器的内存管理并不是线程安全的
- 保护多线程情况下对python对象的访问
- cpython使用简单的锁机制避免多个线程同时执行字节码
GIL的影响
限制了程序的多核执行
- 同一个时间只能有一个线程执行字节码
- CPU密集程序难以利用多核优势
- IO期间会释放GIL,对IP密集程序影响不大
对IO密集程序影响不大
如何规避GIL的影响
区分CPI和IO密集程序
- CPU密集可以使用多进程+进程池
- IO密集使用多线程/协程
- cpython扩展
13. 服务端性能优化措施
web应用一般语言不会成为瓶颈
- 数据结构与算法优化
- 数据库层:索引优化,慢查询消除,批量操作减少IO,NoSQL
- 网络IO:批量操作,pipeline操作,减少IO
- 缓存:使用内存数据库 redis/memcached
- 异步:asyncio,celery
- 并发:gevent/多线程
14. python生成器与协程
Generator
- 生成器就是可以生成值的函数
- 当一个函数里有了yield关键字就成了生成器
- 生成器可以挂起执行并且保持当前执行的状态
协程不懂
15. python3原生协程
async/await支持原生协程
16. python单元测试
三无代码不可取(无稳定、无注释、无单测)
- 保证的代码逻辑的正确性
- 单侧影响设计,易测的代码往往是高内聚低耦合的
- 回归测试,防止改一处整个服务不可用
单元测试相关的库
- nose/pytest较为常用
- mock模块用来模拟替换网络请求等
- coverage统计测试覆盖率
17. python深拷贝与浅拷贝
网友评论