Python语言基础

语言特性
  1. 动态强类型语言(不少人误以为是弱类型)
  2. 动态还是静态指的是编译期还是运行期确定类型
  3. 强类型指的是不会发生隐式型转换
 
优缺点
  1. 胶水语言,轮子多,应用广泛
  2. 语言灵活,生产力高
  3. 性能问题,代码维护问题,Python2/3兼容问题
 
鸭子类型
  1. 关注点在对象的行为,而不是类型(duck typing)
  2. 比如 file,StringIO,socket 对象都支持 read/write 方法(file like object)
  3. 再比如定义了 __iter__ 魔术方法的对象可以用 for 迭代
 
monkey patch
  1. 所谓的 monkey patch 就是运行时替换
  2. 比如 gevent 库需要修改内置的 socket
  3. from gevent import monkey; monkey.patch_socket()
 
自省(Introspection)
  1. 运行时判断一个对象的类型的能力
  2. Python 一切皆对象,用 type,id,isinstance 获取对象类型信息
  3. Inspect 模块提供了更多获取对象信息的函数
 
列表或字典推导式
  1. 比如 [i for i in range(10) if i % 2 == 0]
  2. 一种快速生成 list/dict/set 的方式。用来替代 map/filter 等
  3. (i for i in range(10) if i % 2 == 0) 返回生成器
 
Python之禅
  1. Tim Peters 编写的关于 Python 编程的准则
  2. import this
  3. 编程拿不准的时候可以参考
 
Python3改进
  1. print 成为函数
  2. 编码问题。Python3 不再有 Unicode 对象,默认 str 就是 unicode
  3. 除法变化。Python3 除号返回浮点数
  4. 类型注解(type hint)。帮助 IDE 实现类型检查
  5. 优化 super() 方便直接调用父类函数
  6. 高级解包操作。a, b, *rest = range(10)
  7. Keyword only arguments。限定关键字参数
  8. Chained exceptions。Python3 重新抛出异常不会丢失栈信息
  9. 一切返回迭代器 range, zip, map, dict.values, etc.are, alliterators
  10. 生成的 pyc 文件统一放到 __pycache__
  11. 一些内置库的修改。urllib, selector 等
  12. 性能优化等
 
Python3新增
  1. yield from 链接字生成器
  2. asyncio 内置库,async/await 原生协程支持异步编程
  3. 新的内置库 enum, mock, asyncio, ipaddress, concurrent.futures 等
 
2/3的兼容工具
  1. six 模块
  2. 2to3 等工具转换代码
  3. __future__
 
传递参数(一个容易混淆的问题)
  1. 传递值还是引用呢?都不是。唯一支持的参数传递是共享传参
  2. Call by Object(Call by Object Reference or Call by Sharing)
  3. Call by sharing(共享传参)。函数形参获得实参中各个引用的副本
  4. 默认参数只计算一次
 
可变/不可变的对象
  1. 哪些是可变对象?哪些不可变?
  2. 不可变对象 bool/int/float/tuple/str/frozenset
  3. 可变对象 list/set/dict
  4. 可变对象每次赋值的时候拷贝自身的引用,而不可变对象则是创建一个新的对象
 
*args, **kwargs含义是什么
  1. 用来处理可变参数
  2. *args 被打包成 tuple
  3. **kwargs 被打包成 dict
 
使用异常的常见场景
  1. 网络请求(超时、连接错误等)
  2. 资源访问(权限问题、资源不存在)
  3. 代码逻辑(越界访问、KeyError等)
 
Cpython GIL
  1. Cpython 解释器的内存管理并不是线程安全的
  2. 保护多线程情况下对 Python 对象的访问
  3. Cpython 使用简单的锁机制避免多个线程同时执行字节码
 
GIL的影响
  1. 同一个时间只能有一个线程执行字节码
  2. CPU 密集程序难以利用多核优势
  3. IO 期间会释放 GIL,对 IO 密集程序影响不大
 
规避GIL影响
  1. CPU 密集可以使用多进程 + 进程池
  2. IO 密集使用多线程/协程
  3. cython 扩展
 
剖析程序性能
  1. 二八定律,大部分时间耗时在少量代码上
  2. 内置的 profile/cprofile 等工具
  3. 使用 pyflame(uber开源) 的火焰图工具
 
服务端性能优化(Web应用一般语言不会成为瓶颈)
  1. 数据结构与算法优化
  2. 数据库层:索引优化,慢查询消除,批量操作减少 IO、NoSQL
  3. 网络IO:批量操作,pipeline 操作减少 IO
  4. 缓存:使用内存数据库 redis/memcached
  5. 异步:asyncio,celery
  6. 并发:gevent/多线程
 
生成器
  1. 生成器就是可以生成值的函数
  2. 当一个函数里有了 yield 关键字就成了生成器
  3. 生成器可以挂起执行并且保持当前执行的状态
 
 基于生成器的协程
  1. pep 342(Coroutines via Enhanced Generators)增强生成器功能
  2. 生成器可以通过 yield 暂停执行和产出数据
  3. 同时支持 send() 向生成器发送数据和 throw() 向生成器抛异常
 
 协程注意点
  1. 协程需要使用 send(None) 或者 next(coroutine)来预激(prime)才能启动
  2. 在 yield 处协程会暂停执行
  3. 单独的 yield value 会产出值给调用方
  4. 可以通过 coroutine.send(value) 来给协程发送值,发送的值会赋值给 yield 表达式左边的变量 value = yield
  5. 协程执行完成后(没有遇到下一个 yield 语句)会抛出 StopIteration 异常
 
单元测试
  1. 针对程序模块进行正确性检验
  2. 一个函数,一个类进行验证
  3. 自底向上保证程序正确性
 
单元测试的重要性
  1. 保证代码逻辑的正确性(甚至有些采用测试驱动开发(TDD))
  2. 单测影响设计,易测的代码往往是高内聚低耦合的
  3. 回归测试,防止改一处整个服务不可用
 
单元测试库
  1. nose/pytest 较为常用
  2. mock 模块用来模拟替换网络请求等
  3. coverage 统计测试覆盖率 

转载于:https://www.cnblogs.com/mxsf/p/11348172.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值