
仅以此篇记录一下个人常用的 Python 处理日期的库与函数,主要涉及的类库有 Python 自带的 datetime, time 和 calendar,以及第三方的 dateutil。说到日期处理基本上要覆盖的概念有 date, time, datetime, timezone, calendar, 时间的比较与差值,解析与格式化显示等。
在 datetime 模块中类之间的继承关系如下:
object
├── date
│ └── datetime
├── time
├── timedelta
└── tzinfo
└── timezone我们着重体验一下前面粗体显示的 datetime, date, time, timedelta 对象, timezone 也不是不重要,有时候也可能只需要处理本地时间。 Read More

继续阅读 《Python Tricks: The Book》,书中说到 "Objects Can Behave Like Functions", 就是把对象当成函数来调用,在普通对象后加个括号就能调用相应的
__call__函数。下面是书中的例子class Adder:
def __init__(self, n):
self.n = n
def __call__(self, x):
return self.n + x然后是应用类
Adder的代码plus_3 = Adder(3)
plus_3(4) # 普通对象 plus_3 当成函数来用上面
plus_3是一个普能的对象,并非一个函数,但如果把它当成函数来看待,那么plus_3(4)就会去寻找相应的__call__函数。 Read More
本文为阅读 《Python Tricks: The Book》一书的 3.5 Function Argument Unpacking 的笔记与扩充理解。函数参数拆解是定义可变参数(VarArgs)*args和**kwargs的反向特性。*args和**kwars是函数可定义一个形参来接收传入的不定数量的实参。
而这里的函数参数拆解是形参定义多个,在调用时只传入一个集合类型对象(带上 * 或 ** 前缀),如list,tuple,dict, 甚至是generator, 然后函数能自动从集合对象中取得对应的值。
如果能理解下面赋值时的参数拆解和 Python 3.5 的新增***操作,那么于本文讲述的特性就好理解了。
唯一的不同时作为参数的集合传入函数时必须前面加上*或**, 以此宣告该参数将被拆解,而非一个整体作为一个函数参数。加上*或**与 Java 的@SafeVarargs有类似的功效,最接近的是 Scala 的 `foo(Array[String]("d", "e") : _*)` 写法。参见:Java 和 Scala 调用变参的方式 Read More
借鉴于其他多数语言中集合的 map/reduce 操作,也想总结一下在 Python 中如何对集合进行 map/reduce。而不是对于 Python 集合只会用简单的
for ... in遍历,处于之间的是 Python 的 Comprehension 操作,更倾向于译作推导; 在 Scala 中也有类似的for-comprehension语法。因此本文将涉及到三个方面的知识,基本的集合遍历操作,集合的推导,与 filter/map/reduce 操作。我无法写出诸如 掌握 Python 集体看这一篇就够了 的文章,但基本由本篇出发能了解到 Python 集合的基本遍历,转换操作。其余如切片,和更多能作用于 Python 集合的函数未有提及, 请查阅相关文档。
集合的基本遍历操作
这一块主要是复习功课, 希望由此熟练掌握常用的集合遍历操作方式 Read More
这几天一直浸淫在对 Python 的学习当中,对于一个更习惯 Java 语言的人来说,在接接触 Python 各种概念时会不停的与 Java 进行碰撞。譬如这里要说到的线程,Python 能如何像 Java 一样创建并执行单个线程,以及是否也能使用线程池来进行多作务的执行呢?
整个读完了《THE Quick Python Book》一书也只字未提多线程,然而对于有长时间的 IO 等待的程序,对于当今普及的多核以及核内超线程的 CPU 来说,不使用多线程来并行或并发处理任务是万万不能的,否则效率的差别是数量级的。
基于与 Java 多线程编程进行的比较,主要着力于两个问题:1)创建并执行新的线程,2)线程池中执行任务创建并执行新的线程
默认的,代码是在主线程中执行,主线程名称为MainThread。如果要创建一个子线程并执行需要用到模块threading。下面的是基本的代码 Read More
Python 在语法上除了冒号与强制缩进外其实也没有太多令人眼前一亮的东西,倒是它的装饰器(Decorator) 值得玩味。初读 《THE Quick Python Book》一书,关于 Decorator(装饰器) 这一节匆匆而过,只是觉得它像 Java 注解一样的东西,没太细究。后来慢慢看到还是不少地方在用装饰器,如 Python 的属性
@property,@name_attr.setter, 还有 Flask 中用于定义路由的@app.route('/')等。因此还是有必要花些功夫去更深入的了解 Python 的装饰器,从目前对装饰器的理解,它兼具 Java 的注解与代理的功能,而且比 Java 中自定义注解的处理与动态代理的实现要简单的多,甚至不需要特别牵涉到到面向方面的编程这么一个专门的概念。Python 的装饰器并非指的设计模式中的装饰器模式,Python 的装饰器主要还是关于代理,或叫方法拦截,切面的。
装饰器简单说来就是一个高阶函数,即一个函数作为另一个函数的参数,比如说函数 A 作为函数 B 的参数,然后函数 B 的实现有能力决定实际调用 A 的前后作点手脚,甚至压根不调用 A。由此,装饰器完全可以实现面向方面的 @Before, @After, @Around, @AfterReturning, @AfterThrowing 所有语义。
Python 中的函数像 JavaScript 的一样是头等对象(first-class objects),所以函数本身可以作为参数任意传递,一个函数也可以返回另一个函数。Python 的函数中还允许用相同的
def func():...语法定义内部函数。 Read More
前两篇分别学习了 Python 如何进行依赖的管理,以及结合虚拟环境来使用pip进行依赖管理。而有人觉得把virtualenv与pip分开来操作太麻烦了,而且requirements.txt描述依赖的方式十分笨拙,所以在前两者之上创建了pipenv, 也谈不上重新发明了轮子吧。3. Pipenv: 新一代依赖管理与虚拟环境
倘若不是经由virtualenv,venv而来到pipenv,没有对比也就无法体会到pipenv的妙处的。pipenv在总结了virtualenv/venv的缺点之后由 Kenneth Reitz 于 2017 年 1 月发布的新型 Python 依赖管理器。- 它不再需要单独用
virtualenv和pip,只要一条命令pipenv完成所有的事 - 不用手动管理
requirements.txt文件,而是由pipenv自动维护Pipfile和Pipfile.lock文件 - 自动创建虚拟环境,并且虚拟环境与项目文件分离
- 更详尽的依赖图(例如
pipenv graph),像mvn dependency:tree那样显示依赖树 - 控制台下输出颜色更丰富
- 它不再需要单独用
原本想在一篇之内覆盖到 Python 的包管理以及各类虚拟环境的应用,没想根本就是一发不可收拾,恐怕两篇都完不了,所以也要进行重构。这里只涉及到 Python 的虚拟环境venv和virtualenv,至于标题的话,也不想再改了,只作一,二,三编号,必要时仍能连缀成长篇。最后一篇将单独学习pipenv的应用。
以下序号也是承接上一篇 Python 包管理及虚拟环境的应用(一)。2. Python 虚拟环境
关于创建 Python 项目的虚拟环境,有三个工具可用,venv,virtualenv, 以及后面单独要学到的pipenvvenv, 即python3 -m venv命令,Python 3.3 及新版本自带了,为 Python 3.4 及以后的版本创建的虚拟环境会有pip和setuptools命令virtualenv需要单独安装,但是它支持 Python 2.7 和 Python 3.3+, 创建的虚拟环境中带有pip,setuptools和wheel命令- 另外,
pyvenv脚本也可用来创建 Python 虚拟环境,不过它自 Python 3.6 不推荐使用,建议用python3 -m venv命令
Read More
话说 Python 的哲学之一就是: 用一种方法,最好是只有一种方法来做一件事。可以用python -m this或在 python 交互界面下import this看到The Zen of Python有一句:There should be one-- and preferably only one --obvious way to do it.
然而 Python 在关于包管理(依赖管理)一事上却让人面临了众多的选择。
即使是 Java 日趋发展庞大的今天,包管理工具也没有如今的 Python 复杂,Java 的包管理工具经历了手工下载 jar 包,Maven, Ant+Ivy, Gradle, sbt, 但主流的也就 Maven 和 Gradle, 并且它们兼具项目构建的功能。
这里有一个 Python 包管理工具变迁的视频: Kenneth Reitz - Pipenv: The Future of Python Dependency Management - PyCon 2018。再更早的 Python 依赖管理的方式不说,视频中提到了 Read More
Web 编程中由于需要用 Form 或 URL 来传递参数,所以必然会有 urlencode 和 urldecode 的操作,Python Web 也不例外。Python 对 URL 的编解码操作提供了
urllib模块,下面例子中所使用的 Python 版本是 3.6.7,不同的 Python 版本可能略有差异。简面言之本文就是关于以下六个函数的使用,更多关于
urllib的用法请自行进一步研究。from urllib.parse import urlencode, parse_ql, quote, quote_plus, unquote, unquote_plus
为什么两个 urlencode 和 urldecode 操作会涉及到六个函数的应用呢,分别来讲述
1. urlencode
Python 的
urllib直接提供了urlencode函数,它的操作数是一个字典 Read More