开发环境准备
python 3.x - 版本 3 以上
pyCharm - 推荐的 IDE
pip3 - python 的依赖管理工具
virtualenv - 虚拟环境
一个 web 项目的目录结构示例(flask 为例)
README.md - Git 的工程介绍文件
.gitignore - Git 忽略配置
App.py - flask 的启动文件
config.py - 工程配置
common - 公共方法目录
controller - 对外 http 接口目录
model - 数据目录
service - 主要的逻辑实现目录
doc - 文档目录
开发文档
部署文档
sql - 建表语句目录
log - 日志目录
static - 前端资源目录
test - 单元测试
demo - 使用样例
venv - 虚拟环境, 后面会介绍
开发规范
1 在虚拟环境中运行 python 程序
虚拟环境提供一个隔离环境, 便于项目之前的依赖分割.
安装 virtualenv
pip3 install virtualenv
进入工程目录, 创建 venv 文件夹
只有首次创建环境需要输入该命令
virtualenv --no-site-packages venv
--no-site-packages 指定是一个干净的开发环境
进入 venv
注意之后每次开发需要进入一次 venv
source venv/bin/activate
控制台出现 (venv) 前缀, 说明进入成功
image.PNG
退出 venv
deactivate
在 pycharm 中
通过 preferences --> project --> interpreter --> 创建虚拟环境
image.PNG
2 利用 pip3 管理依赖
上一步骤进入了 venv 环境, 首次进入是一个干净的 no-site-packages 的环境, 利用 requirements.txt 导入项目的依赖
利用 requirements.txt 导入依赖
pip3 install -r requirements.txt
虚拟环境下的依赖有变化, 利用 freeze 来更新 requirements.txt
pip2 freeze>requirements.txt
3 Web 项目部署推荐使用 nginx + gunicorn 的方式
Flask or Django 默认的 httpserver 是 simpleHTTPServer, 单线程, 不适合生产环境使用, 推荐使用 nginx + gunicorn 部署线上环境的 HTTPServer
编程建议
1 使用换行, 空行和空格让代码布局更合理, 更可读
逗号分号之前不要有空格
二元运算前后都有空格, 比如 = ,>, in, not in
可以利用 pycharm 自带的 code format 来调整
2 数据交换不要使用中间变量
- temp = x
- x = y
- y = temp
修改为
x,y = y,x
3 学会利用 Lazy evaluation
if x or y,x 数值更大概率为 true
if x and y,x 更大概率为 false
学会使用生成器表达式 yeild
4 使用枚举来替代数字
eg: 季节, 使用枚举的 spring,summer 来代替程序中本来要使用的 1,2
5 慎重使用 type 来做类型检查
if type(n) is types.IntType
type 检查的类型经常不准
对于用户自定义类型, 不要用 type
实例类型, type 返回结果是 instance, 控制精度比较差
内建类型用 type 检查问题不大, 但是要记住 type 什么时候可用什么时候不可用学习成本高, 所以不建议用
推荐使用: isinstance(object, classinfo)
6 除法操作前都转化为浮点数再计算
python 中除法和取整是一个表达式, 如果不转换为浮点数, 计算结果可能是取整
7 尽量避免 eval 表达式, 防止注释式攻击
8 list 的遍历用 enumerate(), 字典遍历用 iteritems()
9 区别 is 和 ==
is 是内容和地址完全一致, 用于对象比较
== 是值一致, 用于内容比较
10 考虑兼容性, 尽可能使用 Unicode
str = u"sdfsf", 就是字符前都加上 u,
python 的编码问题是一个很头痛的问题, 加上 u 可以减少很多编码问题代码的错误.
11 import 使用规范
优先使用 import A
根据实际情况使用 from A import B
避免使用 from A import * , 容易造成命名空间错误
12 i+ = 1 不等于 ++i
13 用 with 表达式做文件读写
with 表达式会自动处理资源关闭
14 建议 if 后都配套写个 else
else 中如果没有逻辑, 可以输出一条日志
15 python 中的空值判断
注意以下情况都可能相当于其他语言中的 if x == Null
- None
- False
- 0,0L,0.0,0j
- "",(),[],{
- }
- len(),nonzero()
16 字符串连接用 join, 不是 +
- str = "-";
- seq = ("a", "b", "c"); # 字符串序列
- str.join( seq );
17 注意可变对象的复制会共享内存
- lista = [a]
- listb = lista
lista 此时修改也会修改 listb
18 学会使用列表表达式, 简化表达
- In [4]: [i*2 for i in range(10)]
- Out[4]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
- In [5]: [i*2 for i in range(10) if i == 4]
- Out[5]: [8]
19 使用 copy 深拷贝对象
20 使用 Counter 进行计数统计
- import collections
- obj = collections.Counter('aabbccc')
- print(obj)
- # 输出: Counter({
- 'c': 3, 'a': 2, 'b': 2
- })
21 使用 argparse 处理命令行参数
- import argparse
- parser = argparse.ArgumentParser()
- parser.parse_args()
22 使用 pandas 处理大型 CSV 文件
pandas 支持大文件处理
23 使用 multiprocessing(多进程)克服 GIL 的缺陷
注意事项
1 尽量不要用 Fedora 和 RedHat 以及 CentOS 中的 Yum, 当前 Yum 只支持 python2.7, 环境配置很浪费时间.
来源: http://www.jianshu.com/p/18121232d274