Python 图片处理库: Pillow

Image.open() im.mode, im.size, im.format Image.save() Image.show() 性能很慢, 仅作调试用. Image.convert() 比较常用的函数 Image.crop() Image.paste() Image.split() 将图像分为不同的 band Image.getpixel() Image.putpixel() 很慢 Image.point() 可以接受一个 lookup table, 或者一个函数, 函数接受一个参数, 这个参数可以看做像素点的颜色, 返回值为像素点的新颜色 Image.thumbnail() 生成缩略图, 会直接修改原图, 如果要保留原图需要先用 Image.copy() Image.getbbox() 这个函数好像很好用的样子, 待会儿再尝试 Image.getcolors(maxcolors=256) 获取图片中用到的所有颜色, 返回 [ (count, color),… ] 如果是 RGB 等格式, color 也是一个 tuple, 所以不同的颜色会有很多, 需要传入较大的 maxcolors, 否则会返回 None Image.histogram() 获取图片的直方图, 返回一个list, 如果是灰度图像, 则 list 大小为256, 每个元素表示0-255各个灰度的像素点的个数. 如果是 RGB 图像, 则 list 大小为 256*3.

January 21, 2017

Python logging 基础

一个例子: import logging logger=logging.getLogger(__name__) logger.setLevel(logging.INFO) # 添加handler handler=logging.FileHandler('hello.log') handler.setLevel(logging.INFO) # handler可以有多个,所以用add logger.addHandler(handler) # 设置格式 formatter=logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%H:%M:%S') # formatter只能有一个 logger.setFormatter(formatter) 对于库来说,通常使用 __name__ 来获取 Logger对象,然后只添加一个NullHandler,表示默认不会输出任何log: ...

December 30, 2016

Python 协程基础

基础 定义协程(coroutine)的两种方式:async def或使用generator实现。 基于generator的协程应该使用@asyncio.coroutine修饰,但这并不是严格要求的,基于generator的协程使用yield from语法。 ...

December 25, 2016

Jupyter Notebook 初试

安装 pip3 install jupyter --user Jupyter Notebook的kernel是IPython, 这样Notebook才可以使用Python. 也可以安装kernel, 比如 R, Julia. ...

December 18, 2016

Python 中的时间模块

time time 模块比较简单, 常用的函数只有几个, 但是这个模块中的函数名都很奇怪, 估计是模仿 *inx 的时间函数风格, 也查不到到底是什么的缩写, 那就不管它好了. ...

October 2, 2016

Arrow: better dates and times for Python

Python 中时间处理的库太多, 基本的有time, 复杂的有datetime, 日历处理有Calendar, 各种时区信息的库… 各个库中函数的命名也十分让人崩溃,比如time中的ctime(), asctime(), strftime(), strptime(), localtime()你能记得住这些函数分别接受什么参数, 起什么作用吗? 我觉得挺崩溃的. ...

October 2, 2016

由Python的super()函数想到的

一直都没搞懂Python中的super函数的工作原理, 决定好好地学习一下, 于是就有了下面这篇文章. 首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method calls to a **parent or sibling** class of type. 返回一个代理对象, 这个对象负责将方法调用分配给第一个参数的一个父类或者同辈的类去完成. parent or sibling class 如何确定? 第一个参数的__mro__属性决定了搜索的顺序, super指的的是 MRO(Method Resolution Order) 中的下一个类, 而不一定是父类! super()和getattr() 都使用**__mro__**属性来解析搜索顺序, __mro__实际上是一个只读的元组. MRO中类的顺序是怎么排的呢? 实际上MRO列表本身是根据一种C3的线性化处理技术确定的, 理论说明可以参考这里, 这里只简单说明一下原则: 在MRO中, 基类永远出现在派生类的后面, 如果有多个基类, 基类的相对顺序不变. MRO实际上是对继承树做层序遍历的结果, 把一棵带有结构的树变成了一个线性的表, 所以沿着这个列表一直往上, 就可以无重复的遍历完整棵树, 也就解决了多继承中的Diamond问题. 比如说: class Root: pass class A(Root): pass class B(Root): pass class C(A, B): pass print(C.__mro__) # (<class '__main__....

July 10, 2016

HTTP for Human: 深入研究 Requests

这是一篇学习 Requests 的随笔. Python 回顾 bytearray是一个字节数组, 数组的内容是可变的, 数组中的每一个元素都是 [0, 256)之间的整数 定义为: bytearray([source[, encoding[, errors]]]) 其中source参数有几种情况: If it is a string, you must also give the encoding (and optionally, errors) parameters; bytearray() then converts the string to bytes using str.encode(). If it is an integer, the array will have that size and will be initialized with null bytes. If it is an object conforming to the buffer interface, a read-only buffer of the object will be used to initialize the bytes array....