date: 2016-07-13 12:20 ## 书籍 & 教程推荐 - [知乎周刊 - 编程小白学Python](https://www.zhihu.com/publications/weekly/19550511) - [python 书单, 不将就](http://blog.csdn.net/turingbooks/article/details/46459349) - [廖雪峰的Python3教程](http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000) - [第三方库 awesome python](https://awesome-python.com/) - [realpython - learn python programming by example](https://realpython.com/) - [python course](https://www.python-course.eu/python3_course.php) --- 哲学理念: REPL(交互式解释器) -> import this spaCy+Cython加速NLP 自动化测试框架: RobotFramework RedwoodHQ Jasmine Pytest ## 爬虫 - [anacoda](https://www.anaconda.com/download/): [清华镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/) numpy+pandas+ipython+jupyter - 多版本: PATH - 数据处理: html/json/图片等二进制 - js数据渲染: selenium - httpbin.org: http测试 ## 安装 ```bash choco install python # win, 默认 py3 # pip 加速: win ~/pip/pip.ini; linux ~/.pip/pip.conf [global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com [list] format=columns # pipenv: 管理每个项目的依赖 pip install pipenv # env pip install virtualenv virtualenv --no-site-packages py2 ``` 核心概念: 代码结构 模块(`from import`) 包(`__init__.py`) OO(副作用函数 vs 纯函数) 装饰器(类似 AOP) contextManager(`with as`, 类似 defer) dynamicType mutableType codeStyle(pep8) 文档(sphinx) test(`unittest` `doctest`) 日志(`logging` 诊断/审计) ```py # 从 0 到 19 创建一个连续的字符串(例如「012..1819」) nums = map(str, range(20)) print "".join(nums) foo += 'ooo' # This is bad, instead you should do: foo = ''.join([foo, 'ooo']) foobar = '{foo}{bar}'.format(foo=foo, bar=bar) # It is best # Requests BeautifulSoup lxml # Django Flask Tornado jinja2 # mycli Ansible Puppet # DB # Jenkins Travis-CI # cython Concurrent.futures # ipython numpy Matplotlib Anaconda/Canopy # grpc # pip install grpcio grpcio-tools # xml: untangle xmltodict # json/simplejson json.loads(json_string) json.dumps(dict_data) # Cryptography PyCrypto # ML ``` 字符串: 单引号 / 双引号 都可以 print(), 可以格式化输出 / input() 输入输出 常量: 全大写 关键词: True / False / and or not / None 数值运算符: / 浮点除法 // 整除 类型转换: int(str) 非法数字会报错 / float() / str() / bool() ## 编码 字符编码: ord(char) / chr(int) 网络使用 bytes 进行字符串传输: encode() / decode() len(): 默认计算字符数, 而非 bytes ## list & tuple & dict & set list: 列表(数组) `list = ['a','b','c']` -n: 倒数第n个元素 数组形式访问 / append() / pop() / pop(i) / insert(i, val) / range(): 用来生出序列 / sort(): 会改变key 切片: L[10:20:2], 取第 10-20 个元素, 每2个取1个 列表生成式: `[x * x for x in range(1, 11)]` 生成器: `g = (x * x for x in range(10))` , `next(g)` tuple: 定义就无法修改, 必须在初始化的时候定义好 `t=('a','b','c')`; 如果包含list, 里面的list是可变的 dict: 字典, 即 map / hash, `dict={'a':1, 'b':2}`; 不可变量(数值/字符串)才可以作为 key 数组形式访问 / in 判断 key 是否存在 / get() / pop() set: 没有重复值的集合, `s=set([1,2,3])` add() / remove() / 集合上的 交集+并集 操作 ## 条件 & 循环 使用缩进 语句需要加 : ``` if xxx: xxx elif xxx: xxx else: xxx isinstance([], Iterable) # 判断一个对象是否可 迭代 for k,v in list: # 迭代 xxx while n<100: xxx n++ ``` ## 函数 距离: 数学中的求和 ∑ 参数: 参数个数(数量定&不定); 参数数据类型(可能需要类型检查); 默认值(如果是 list 考虑 [] 还是 None); 使用 list 作为参数; 使用 dict 作为参数 返回值: 多返回值实际是返回一个 **不可变对象** 递归函数(栈 实现) -> 尾递归优化 ``` from abstest import my_abs # from: 文件名; import: 包 pass: 定义一个空的程序段, 什么都不做, 先让流程跑通 def my_func(x): if not isinstance(x, (int, float)): # 抛出异常 raise TypeError('bad operand type') return ++x ``` ## 函数式编程 高阶函数: 可以接收 其他函数 作为 变量 map(func, Iterable) reduce(func, Iterable): func 依次处理2个元素 filter(): 和 map 类似, 用来筛选, 如 **求素数** `sorted([36, 5, -12, 9, -21], key=abs)`: 排序, 如果不传入 key, 则使用 自然排序 使用函数作为返回值 匿名函数 lambda: `f = lambda x: x * x` 装饰器 decorator: 在代码运行的时候动态增加功能, 比如 添加日志功能 偏函数: 定一个新函数名, 来使用不同的参数值默认值 ## 模块 必须包含 `__init__.py`, 指代模块本身 pip: 包管理 ``` echo -e "[global]\nindex-url = http://mirrors.aliyun.com/pypi/simple/\n\n[install]\ntrusted-host=mirrors.aliyun.com\n\n[list]\nformat=columns" > /etc/pip.conf ``` ## 面向对象 type(): 判断对象类型 isinstance(): 判断一个对象是否是某种类型 dir(): 获取对象的所有属性和方法 getattr() / setattr() / hasattr(): 操作属性(其实属性就是一个类的状态) ``` class Student(object): # 根据传入的对象不同使用 继承 def __init__(self, name, score): # 这里定义类初始化时必须绑定的参数, 未使用这里定义的, 可以任意绑定 self.__name = name # 访问控制, 私有变量 self.__score__ = score # 特殊变量 def print_score(self): print('%s: %s' % (self.name, self.score)) def __len__(self): # 扩展 len() 函数, 这样就可以用 len(Student) return 100 ```