Fork me on GitHub

python

一分钟了解Python3.8新特性

今天Python3.8版本刚刚发布,添加了很多新功能。这里介绍几个我觉得最酷的特性,感受一下小Python的美。 更全面的特性请直接去官网看:https://docs.python.org/3.8/whatsnew/3.8.html 赋值表达式新增一个新的赋值语法:=,它将赋给左边变量并将赋值语句转换成一个表达式。该特性编号为 PEP 572就是赋值表达式,也叫“海象运算符”。 可以看到这个操作符看上去像一只横躺着的海象。 比如下面这个例子中,使用赋值表达式可以防止你调...

每天5分钟玩转Python(19) - 安装虚拟环境

如果正常使用pip安装会将软件包安装到python系统包目录下面,也就是site-packages目录。 通常我们需要对环境进行隔离以防止别的包影响到。这时候需要安装虚拟环境virtualenv了。 安装virtualenvvirtualenv可用于创建独立的 Python 环境,它会创建一个包含项目所必须要的执行文件。 sudo pip install -U virtualenv 创建虚拟环境如下命令表示在当前目录下创建一个名叫 myenv 的目录(虚拟环境), 该...

每天5分钟玩转Python(18) - 包管理工具pip

安装完python后就已经安装了所有的内置模块,如果只是需要内置模块之间导入即可, 而当我们需要第三方模块的时候就需要自己去安装了。python里面最常用的是使用pip在线安装第三方模块。 其实,pip就是Python标准库中的一个包,这个包比较特殊,用它可以来管理Python标准库中其他的包。 pip支持从PyPI(https://pypi.org/)、版本控制以及直接从分发文件进行安装。 pip是一个命令行程序。安装pip后,会向系统添加一个pip命令,该命令可以从...

每天5分钟玩转Python(17) - 模块和包

模块和包都是用来组织代码用的,在python中一个模块就是一个.py文件, 而一个包就是一个包含了__init__.py的文件夹。 使用模块最大的好处就是提高代码可维护性,我们在编写代码的时候通常会引用内置模块或第三方模块。 引入包是为了解决命名冲突问题,你可以把包当成是命名空间, 比如你写的abc.py模块和其他人写的abc.py模块只要在不同的包中就不会冲突。 只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。 比如我现在有这样一个目录结构: winhong/...

每天5分钟玩转Python(16) - 装饰器

Python有着强大的表达式语法和函数特性,其中一个我的最爱便是装饰器。 在设计模式中,装饰器能够在不使用子类的情况下动态的修改函数、方法或类的功能。 当你需要扩展某个函数的功能却不想直接修改这个函数的时候,装饰器就可以派上用场了。 实现装饰器模式有很多种方法,但是Python通过强大的语法支持来让这个变得相当容易。 本质上来讲,装饰器是以包装器形式工作的,其实就是在执行目标函数之前或之后加入自己的逻辑, 而不需要改变目标函数本身就可以增强它的功能,也就是说装饰了它。 ...

每天5分钟玩转Python(15) - 闭包

闭包跟函数式紧密联系在一起的,介绍闭包之前先了解一下python中函数的高阶用法。比如嵌套函数、变量作用域等等。 变量作用域变量作用域是程序运行时变量可被访问的范围,定义在函数内的变量是局部变量, 局部变量的作用范围只能是函数内部范围内,它不能在函数外引用。 def test(): num = 10 # 局部变量 print(num) # NameError: name 'num' is not defined 定义在模块最外层的变量是全局变...

每天5分钟玩转Python(14) - 函数式编程之filter/sorted

这一篇再讲两个高阶函数,一个是过滤器函数,一个是排序函数。这些都是使用最频繁的函数,也很具有代表性。 filter()函数filter()函数用于过滤序列,跟map()一样,也是接受一个函数,一个Iterable。 它将传入的函数依次作用于序列每个元素如果函数返回值为True则保留元素,否则丢弃元素。 最终的返回值仍然是一个Iterable。 比如在一个从0到10的列表中,只保留偶数。则正是过滤器函数用武之地: print(list(filter(lambda x: x...

每天5分钟玩转Python(13) - 函数式编程之map/reduce

函数式(Functional Programming)编程是一种抽象程度非常高的编程范式,纯粹的函数式编程中没有变量。 对于任意一个函数,输入确定则输出也确定,这种纯函数没有任何副作用,非常适合高并发场景。 比如Lisp语言就是一个纯粹的函数式编程语言。 另外函数式编程中,函数可作为参数传入另外一个函数,也可作为返回值,跟变量一样。 由于Python中存在变量,因此并不是纯函数式编程语言。 map/reduce这个东西最初出自于Google的论文《MapReduce: ...

每天5分钟玩转Python(12) - 生成器(下)

这一章开始介绍生成器函数和yield关键字,以及Python中的协程的概念。 yield关键字当我们调用一个普通的函数时,执行过程从第一条语句开始,直到碰到一个return语句或者遇到一个异常抛出, 再或者到了函数最后一条语句(实际上相对于一个隐式的return None)的时候结束。 一旦这个函数返回后将控制权交还给它的调用者,它里面所有的局部变量值都消失了,当你重新调用它的时候,一切又将重新开始。 这就是我们通常意义上面所认识的函数(或者说是子程序),但有时候我们需...

每天5分钟玩转Python(11) - 生成器(上)

这篇开始要展示python这门语言真正的魅力所在了。python有一些高级功能, 让我们的代码写起来超级爽,所以才会有这么多人喜欢它。 这篇先介绍生成器这个东东,学会你就知道它有多强大了,不过对于生成器的讲解稍微有点长, 可能看完不止5分钟,所以我分了上下两篇。建议读者耐心看完,这是进阶的必经之路。 列表推导在讲生成器之前,先讲讲python里面常用的几个常见的推导式: 列表推导式(list comprehension) my_list = [f(x) for x in...

每天5分钟玩转Python(10) - 迭代器

迭代(iteration)指的是去获取元素的一种方式,一个接一个。当你显式或隐式的使用循环来遍历某个元素集的时候,那就是迭代。 之前我们学习for循环迭代的时候知道,操作对象可以是list、tuple、dict、set、str类型。 实际上除了这几类内置类型外,for循环还能操作generator类型,也就是迭代器类型。 generator类型包括生成器和带yield的生成器函数。 在Python里面,可迭代对象(iterable)和迭代器(iterator)有着特殊的...

每天5分钟玩转Python(09) - 切片

我们经常会遇见只取列表、元组或者字符串中一部分的场景。比如一个列表如下: _list = ['a', 'b', 'c', 'd', 'e'] 如果只想取前面3个元素咋整。最笨的方法就是创建一个新的列表,通过下标引用来填充这个列表: sub_list = [_list[0], _list[1], _list[2]] 这样几个元素还好,如果几百个元素你还不得累死。 有人说我可以用循环啊,就像...

每天5分钟玩转Python(08) - 函数

函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数, 比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 定义函数在python中定义函数使用def开头,紧接着就是函数名称和圆括号(),在括号可以增加参数。 函数第一行语句可使用三引号格式的文档字符串来定义函数的说明。使用return语句定义函数返回值。 def hello(name): &quo...

每天5分钟玩转Python(07) - 基本数据类型(下)

继续上一篇的数据结构讲解,这篇讲解Set(集合)和Dictionary(字典)的使用方法。 Set(集合)大家都知道数学中集合的定义为:将数个对象归类而分成为一个或数个形态各异的大小整体。 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。 Python中通过内置函数set()可获取到集合这种数据类型。参数可以是一个list s = set([1, 2, 3]) 通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果: s.add(...

每天5分钟玩转Python(06) - 基本数据类型(中)

继续上一篇的数据结构讲解,这篇讲解列表List(列表)和Tuple(元组)的使用方法。 List(列表)列表应该是Python中使用最频繁的数据类型了。列表可以完成大多数集合类的数据结构实现。 列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。 list1 = ['abcd', 123 , 3.14, 'test', True, 70.2 + 3.2j] l...

每天5分钟玩转Python(05) - 基本数据类型(上)

在介绍数据类型之前,有必要先讲一下变量赋值语法。 变量赋值Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 变量并没有类型,我们所说的”类型”是变量所指的内存中对象的类型。你可以认为变量就是指向内存中对象的一个指针。 使用等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。 counter = 100 # 整型变量 miles = 1000.0 ...

每天5分钟玩转Python(04) - 基本语法

学一门语言最开始还是得先了解一下这门语言的基本语法,Python跟C语言语法有很大差别。 并且由于是一门脚本语言,语法比较的简单。这篇系列讲的都是Python3,所以语法也最新的3.x的语法。 源文件Python的源文件一般以.py结尾,同时默认是以UTF-8编码。对于每个python源文件,在最开始声明如下两行是一个很好地习惯 #!/usr/bin/env python # -*- encoding: utf-8 -*- 标识符标识符由字母、数字和下划线组成,但是第...

每天5分钟玩转Python(03) - 安装Pycharm

安装完Python之后还需要安装集成开发环境,也就是通常所说的IDE。虽然你可以用python自带的IDLE, 或者直接使用notepad++这类本文编辑器,但是我的建议是想敲代码快一点还是用IDE吧,这里我首推Pycharm。 事实上我对Jetbrains出的编程工具系列相当偏爱,因为对比使用过后你会发现它们实在是用的太爽了。 本篇介绍如何在Windows上面安装Pycharm,以及它的一些基本使用方法。 下载和安装下载地址:https://www.jetbrains...

每天5分钟玩转Python(02) - 安装Python

要学习和运行Python得先安装才行,安装后会得到Python解释器、命令行交互环境和一个简单的集成开发环境。 由于历史原因,目前Python有两个版本:一个是2.x版,一个是3.x版。2.x版本很快就不会被支持了, 现在所有python编写的软件都会升级到3.x,所以这个教程就直接以最新的3.8版本为基础来讲解。 同时建议所有初学者直接学习python 3.x版本。 下载和安装Python是跨平台的,所以不管是windows、linux和mac都能安装。 在Mac上安...

每天5分钟玩转Python(01) - 入门简介

人生苦短,我用Python! 终于要写这个系列教程了,虽然我知道会很辛苦,也很难写的比较完美。总是有其他的事情干扰, 不过我有个特点就是一旦开始就停不下来,我相信自己会坚持写完这个入门教程的。 市面上有好多Python入门书籍,还有各种培训课程上面的教程,可能有人问我为啥还要写这个玩意。 我的解释是,总会有那么一小部分人看得懂我在写啥,喜欢这种风格,就足够了。 之前看过《每天5分钟玩转docker容器》和《每天5分钟玩转kubernetes》两个系列,我比较喜欢他这种风...

Python命名规约

应该避免的名称 单字符名称, 除了计数器和迭代器. 包/模块名中的连字符(-) 双下划线开头并结尾的名称(Python保留, 例如init) 命名约定 所谓”内部(Internal)”表示仅模块内可用, 或者, 在类内是保护或私有的. 用单下划线(_)开头表示模块变量或函数是protected的(使用from module import *时不会包含). 用双下划线(__)开头的实例变量或方法表示类内私有. 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必...

Nginx+uWSGI部署Python Web应用

web开发的过程中一定会遇到 cgi、wsgi 之类的名词,然后看着他们十分相似的解释估计还没开始写代码就晕了,这都什么鬼? 今天我就聊聊这些容易搞混的名称。 CGI(Common Gateway Inteface) 字面意思就是通用网关接口,它是外部应用程序与Web服务器之间的接口标准,规定一个程序该如何与web服务器程序之间通信。 当然,CGI 只是一个很基本的协议,在现代常见的服务器结构中基本已经没有了它的身影,更多的则是它的扩展和更新。…

Werkzeug简易教程

Werkzeug是一个专门用来处理HTTP和WSGI的工具库,可以方便的在Python程序中处理HTTP协议相关内容。 这里稍微说一下,werkzeug不是一个web服务器,也不是一个web框架,而是一个工具包, 官方的介绍说是一个WSGI工具包,它可以作为一个Web框架的底层库, 因为它封装好了很多Web框架的东西,例如 Request,Response 等等。 例如我最常用的Flask框架就是以Werkzeug为基础开发的,这也是我要专门探究Werkzeug底层的原...

jinja2模板

jinja2是python中的一个优秀的模板语言,类似于django的模板。它的速度快,安全,目前被各种框架被广泛使用。 官网地址:http://jinja.pocoo.org/ 它的一些特性: 沙箱执行机制很安全 通过对HTML进行自动转义防止XSS攻击 模板继承 实时编译为最优化的python代码,使得它运行速度非常快 可选的模板预编译 容易调试,错误行数直接指向模板中的行 配置文件语法也是模板 安装非常简单,一条命令搞定: pip install jinja2...

Vagrant创建虚拟化开发环境

作为一名开发者,是否经常抱怨环境问题,某个bug只出现在你的环境下面,找了很久才找到原来是一个很小的环境差异导致。 Vagrant可以非常容易的配置一个统一的可复制、可移植的分布式开发环境, 在VirtualBox、VMware、AWS或其他provider平台上, 借助provisioning工具, 比如shell脚本、Ansible、Chef等自动在各个机器上面安装和配置好软件。 只需要一个Vagrantfile,别人就能基于它创建统一的环境,不管你的工作机器是Li...

使用PyCharm进行远程开发和调试

你是否经常要在Windows 7或MAC OS X上面开发Python或Web应用程序,但是它们最后需要在linux上面来运行呢? 我们经常会碰到开发时没有问题但是到了正式的Linux环境下面却出现问题。那么怎样保证开发环境跟运行环境的一致呢? 通常有两种方法解决。一种是使用PyCharm内置支持的Vagrant,这个教程可以参考Vagrant开发环境配置。 不过很遗憾的是我自己在试验过程中启动VirtualBox虚拟机时候老是报错,暂时还没解决,读者可以自己试着测试看...

一些有趣的python技巧

python有时候简单起来连我自己都怕,有时候其他语言需要几十写出来的python几行搞定。 这里经常收集一些有趣的东西还是很好玩的。 简单的HTTP服务器你想快速简单的分享目录下的文件吗?可以这样做: cd $HOME/work/ # Python2 python -m SimpleHTTPServer # Python 3 python3 -m http.server 8000 然后别人就可以打开http://ip:8000/来访问这个简单的Web服务器了, 如...

使用pyenv创建多版本python环境

以前一直使用virtualenv来管理python的包环境,但是有时候我需要多个python版本环境时候就不能愉快的玩耍了。 而pyenv可以帮到我。 pyenv是针对python版本的管理,通过修改环境变量的方式实现,在其官网说明上很清楚, 通过在PATH最前面插入shims来决定应用使用的python版本,从而将你的命令传递给正确的python程序。 我的系统环境是CentOS7.2 理解Shimspyenv会在你的PATH最前面插入一个shims目录: $(pye...

CentOS7上使用mod_wsgi部署Django

Django是一个非常强大的web框架,能让你快速的构建应用,它本身包含了一个简单的服务器程序,让你在开发环境里调试用。 但是在生产环境中就需要将其部署到更专业的web服务器里去了,比如Apache、Nginx等。 对于Django这个框架的教程我之前的博客已经有一个系列了,这里就不多说,我假设你已经创建好了一个Django工程,这里我已自己的zspace工程来说明。 安装必要的软件Apache应该默认会安装,如果没有就请安装 # 开启EPEL sudo yum ins...

WGSI简易教程

WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。具体的来说,WSGI是一个规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。最新版本在PEP-3333中定义。 对于初学者来说,上面那段就是废话,说了跟没说一样。接下来详细说明下这个东东到底是如何工作的。 为什么需要WSGI这个规范在Web部署的方案上,有一个方案是目前应用最广泛的: 首...

Scrapy笔记12- 抓取动态网站

前面我们介绍的都是去抓取静态的网站页面,也就是说我们打开某个链接,它的内容全部呈现出来。 但是如今的互联网大部分的web页面都是动态的,经常逛的网站例如京东、淘宝等,商品列表都是js,并有Ajax渲染, 下载某个链接得到的页面里面含有异步加载的内容,这样再使用之前的方式我们根本获取不到异步加载的这些网页内容。 使用Javascript渲染和处理网页是种非常常见的做法,如何处理一个大量使用Javascript的页面是Scrapy爬虫开发中一个常见的问题, 这篇文章将说明如...

Scrapy笔记11- 模拟登录

有时候爬取网站的时候需要登录,在Scrapy中可以通过模拟登录保存cookie后再去爬取相应的页面。这里我通过登录github然后爬取自己的issue列表来演示下整个原理。 要想实现登录就需要表单提交,先通过浏览器访问github的登录页面https://github.com/login,然后使用浏览器调试工具来得到登录时需要提交什么东西。 我这里使用chrome浏览器的调试工具,F12打开后选择Network,并将Preserve log勾上。我故意输入错误的用户名...

Scrapy笔记10- 动态配置爬虫

有很多时候我们需要从多个网站爬取所需要的数据,比如我们想爬取多个网站的新闻,将其存储到数据库同一个表中。我们是不是要对每个网站都得去定义一个Spider类呢? 其实不需要,我们可以通过维护一个规则配置表或者一个规则配置文件来动态增加或修改爬取规则,然后程序代码不需要更改就能实现多个网站爬取。 要这样做,我们就不能再使用前面的scrapy crawl test这种命令了,我们需要使用编程的方式运行Scrapy spider,参考官方文档 脚本运行Scrapy可以利用scr...

Scrapy笔记09- 部署

本篇主要介绍两种部署爬虫的方案。如果仅仅在开发调试的时候在本地部署跑起来是很容易的,不过要是生产环境,爬虫任务量大,并且持续时间长,那么还是建议使用专业的部署方法。主要是两种方案: Scrapyd 开源方案 Scrapy Cloud 云方案 部署到ScrapydScrapyd是一个开源软件,用来运行蜘蛛爬虫。它提供了HTTP API的服务器,还能运行和监控Scrapy的蜘蛛 要部署爬虫到Scrapyd,需要使用到scrapyd-client部署工具集,下面我演示下部...

Scrapy笔记08- 文件与图片

Scrapy为我们提供了可重用的item pipelines为某个特定的Item去下载文件。 通常来说你会选择使用Files Pipeline或Images Pipeline。 这两个管道都实现了: 避免重复下载 可以指定下载后保存的地方(文件系统目录中,Amazon S3中) Images Pipeline为处理图片提供了额外的功能: 将所有下载的图片格式转换成普通的JPG并使用RGB颜色模式 生成缩略图 检查图片的宽度和高度确保它们满足最小的尺寸限制 管道同...

Scrapy笔记07- 内置服务

Scrapy使用Python内置的的日志系统来记录事件日志。 日志配置 LOG_ENABLED = true LOG_ENCODING = "utf-8" LOG_LEVEL = logging.INFO LOG_FILE = "log/spider.log" LOG_STDOUT = True LOG_FORMAT = "%(asctime)s [%(name)s] %(levelname)s: %(message)s...

Scrapy笔记06- Item Pipeline

当一个item被蜘蛛爬取到之后会被发送给Item Pipeline,然后多个组件按照顺序处理这个item。 每个Item Pipeline组件其实就是一个实现了一个简单方法的Python类。他们接受一个item并在上面执行逻辑, 还能决定这个item到底是否还要继续往下传输,如果不要了就直接丢弃。 使用Item Pipeline的常用场景: 清理HTML数据 验证被抓取的数据(检查item是否包含某些字段) 重复性检查(然后丢弃) 将抓取的数据存储到数据库中 编写自...

Scrapy笔记05- Item详解

Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便。 Item提供了类字典的API,并且可以很方便的声明字段,很多Scrapy组件可以利用Item的其他信息。 定义Item定义Item非常简单,只需要继承scrapy.Item类,并将所有字段都定义为scrapy.Field类型即可 import scrapy class Product(scrapy.Item): name = sc...

Scrapy笔记04- Selector详解

在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行的抓取库, 它还能合理的处理错误格式的标签,但是有一个唯一缺点就是:它运行很慢。 lxml是一个基于ElementTree的XML解析库(同时还能解析HTML), 不过lxml并不是Python标准库 而Scrapy实现了自己的数据提取机制,它们被称为选择器,通过XPath或CSS表达式在HTML文档中来选择特定的...

Scrapy笔记03- Spider详解

Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数。初次请求URL通过start_urls指定,调用start_requests()产生Request对象,然后注册parse方法作为回调 在parse回调中解析response并返回字典,Item对象,Request对象或它们的迭代对象。Request对象还会包含回调函数,之后Scrapy下载完后会被这里注册的回调函数处理。 在回调函数里面,你通过使用选择器...

Scrapy笔记02- 完整示例

这篇文章我们通过一个比较完整的例子来教你使用Scrapy,我选择爬取虎嗅网首页的新闻列表。 这里我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pipline来存储提取出来的Item对象 Scrapy使用Python语言编写,如果你对这门语言还不熟,请先去学习下基本知识。 创建Scrapy工程在任何你喜欢的目录执行如下命令 scrapy star...

Scrapy笔记01- 入门篇

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的, 也可以应用在获取API所返回的数据(比如Web Services)或者通用的网络爬虫。 Scrapy也能帮你实现高阶的爬虫框架,比如爬取时的网站认证、内容的分析处理、重复抓取、分布式爬取等等很复杂的事。 安装scrapy我的测试环境是centos6.5 升级python到最新版的2....

SQLAlchemy进阶

前面一篇介绍了SQLAlchemy的入门,这里我讲讲它的进阶用法,其实主要是通过它来轻松实现一些复杂查询。 SQLAlchemy中的映射关系有四种,分别是一对多、多对一、一对一、多对多。接下来我将详细说明怎样去定义这四种关系, 然后再演示怎样通过这四种关系完成复杂的查询和更新。 一对多表示一对多的关系时,在子表类中通过 foreign key (外键)引用父表类。 然后,在父表类中通过 relationship() 方法来引用子表的类: class Parent(Bas...

SQLAlchemy入门

SQLAlchemy是Python世界中最广泛使用的ORM工具之一,它采用了类似于Java里Hibernate的数据映射模型, 而不是其他ORM框架采用的Active Record模型。 SQLAlchemy分为两个部分,一个是最常用的ORM对象映射,另一个是核心的SQL expression。 第一个很好理解,纯粹的ORM,后面这个不是ORM,而是DBAPI的封装,通过一些sql表达式来避免了直接写sql。 使用SQLAlchemy则可以分为三种方式。 使用ORM避...

浅谈coroutine和gevent

一般将coroutine称之为协程(或微线程,也有称纤程的)。 我在python并发编程那篇文章已经详细讲解了进程Process和线程Thread的用法, 很早就想再写一篇专门讲解coroutine以及相关的优秀库gevent。 目前常见的coroutine应用都是网络程序中,所以我们先来看看各种不同的网络框架模型, 然后再介绍coroutine就会比较理解了。…

python核心 - web开发

Web应用开发可以说是目前软件开发中最重要的部分。Web开发也经历了好几个阶段:静态Web页面、CGI、ASP/JSP/PHP、MVC。 目前,Web开发技术仍在快速发展中,异步开发、新的MVVM前端技术层出不穷。 Python的诞生历史比Web还要早,由于Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web开发。 Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。 WSGI接口...

python核心 - 网络编程

自从互联网诞生以来,现在基本上所有的程序都是网络程序。 网络编程对所有开发语言都是一样的,Python也不例外。 用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信。 本章我们将详细介绍Python网络编程的概念和最主要的两种网络类型的编程。 TCP/IP简介虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多。 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个...

python核心 - 访问数据库

操作数据库是最常见的任务,这里用MySQL来做演示,也是我们用的最多的一个开源数据库,其他都类似的。 对于安装MySQL就不做介绍了,安装完后,还需要安装去驱动。因为需要支持Python的MySQL驱动来连接到MySQL服务器。 MySQL的驱动有多种实现,比如纯python实现的pymysql和mysql-connector,或者mysql-python也就是MySQLdb。 这里我通过mysql-connector来介绍使用方法: pip install mysql...

python核心 - 单元测试

单元测试在所有编程语言中都不陌生,对于一个健壮的软件来讲单元测试是很有必要的, 并且“测试驱动开发”(TDD:Test-Driven Development)越来越受欢迎也说明了它的重要性。 单元测试一个最大的好处,就是确保一个程序模块的行为符合我们设计的测试用例。 在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。 基本用法我们通过一个例子来说明怎样写单元测试,先编写一个Dict类,它的行为和dic一致,但是可以通过属性来访问。 class Dict(dic...

python核心 - 异步IO

由于CPU的速度远远快于磁盘、网络等IO,我们可选择使用多进程或多线程来并发执行代码。 然而系统不能无限制增加线程,而且切换线程开销也大,一旦线程数量过多,CPU花的时间主要在切换线程上,导致性能下降。 另外一种解决方案是异步IO,当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。 一段时间后,当IO返回结果时,再通知CPU进行处理。 异步IO模型需要一个消息循环,在消息循环中,主线程不断地重复“读取消息-处理消息”这一过程...

python核心 - IO编程

IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留, 由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。 通常,程序完成IO操作会有Input和Output两个数据流。当然也有只用一个的情况, 比如,从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作。 Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但...

python核心 - 并发编程

现在是多核和并发时代,所以不管什么语言都要支持这个特性。并发是看上去同时执行,并行是在多核上同时执行。 我们先解释下线程和进程。简单来说,一个任务就是一个进程(Process)。 在一个进程内部,要同时干多件事,就需要同时运行多个进程内的“子任务”,这些子任务就叫线程(Thread) 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程, 完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写...

python核心 - 日期和时间

日期和时间是我们编程经常需要处理的事情,相比较其他语言,python中的日期和时间处理非常简洁。 datetime是python处理日期和时间的标准库。 python中有一个datetime模块,里面有个datetime类,这里大家先要弄清楚,很容易搞混。 所以我们获取当前日期和时间的代码如下: from datetime import datetime now = datetime.now() # 获取当前datetime print(now) print(type(...

python核心 - 正则表达式

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。 正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则, 凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。 我们判断一个字符串是否是一个合法的电话号码分两步,首先创建一个符合电话号码规则的正则表达式, 然后用这个正则表达式来匹配这个字符串是否合法。 基础因为正则表达式也是用字符串表示,我们就要先学习如何用字符来描述字符。...

python核心 - 元类

动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。我们在hello.py模块里定义一个Hello的 当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象。 我们说class的定义是运行时动态创建的,而创建class的方法就是使用type()函数。 type()函数既可以返回一个对象的类型,又可以创建出新的类型。 type函数比如,我们可以通过type()函数创...

python核心 - 面向对象编程

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。 OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。 为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息, 并处理这些消息,计算机程...

python核心 - 装饰器

python有着强大的表达式语法和函数特性,其中一个我的最爱便是装饰器。 在设计模式中,装饰器能够在不使用子类的情况下动态的修改函数、方法或类的功能。 当你需要扩展某个函数的功能却不想直接修改这个函数的时候,装饰器就可以派上用场了。 实现装饰器模式有很多种方法,但是python通过强大的语法支持来让这个变得相当容易。 在这篇文章中我将深入讲解Python的函数装饰器,并通过一系列的源码示例来彻底讲清楚这个东西。 所有例子都在Python2.7下运行通过,不过只需要稍作改...

python核心 - 生成器

在讲生成器之前,先讲讲python里面常用的几个常见的推导式: 列表推导式(list comprehension) my_list = [f(x) for x in sequence if cond(x)] 字典推导式(dictionary comprehension) my_dict = {k(x): v(x) for x in sequence if cond(x)} 集合推导式(set comprehension) my_set = {f(x) for x i...

python核心 - 迭代器

迭代(iteration)指的是去获取元素的一种方式,一个接一个。当你显式或隐式的使用循环来遍历某个元素集的时候,那就是迭代。 在Python里面,可迭代对象(iterable)和迭代器(iterator)有着特殊的含义。 iterable是实现了__iter__()方法的对象,该方法会返回一个iterator对象 iterator是实现了__iter__()和__next__()方法的对象,__iter__()方法返回的是iterator对象本身 由此可见,ite...

python核心 - 模块和包

模块和包都是用来组织代码用的,在python中一个模块就是一个.py文件,而一个包就是一个包含了__init__.py的文件夹。 使用模块最大的好处就是提高代码可维护性,我们在编写代码的时候通常会引用内置模块或第三方模块。 引入包是为了解决命名冲突问题,你可以把包当成是命名空间,比如你写的abc.py模块和其他人写的abc.py模块只要在不同的包中就不会冲突。 只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。 比如我现在有这样一个目录结构: winhong/ ...

python核心 - 打包与发布

当需要将写的程序打包分发出去的时候,就要使用到setuptools工具了,这里我通过一个实际例子来介绍它的使用方法。 之前写过一个rpc模块叫xnrpc: github项目地址:https://github.com/yidao620c/xnrpc pipi模块地址:https://pypi.python.org/pypi/xnrpc 软件包归档格式Python的软件包一开始是没有官方的标准分发格式的。比如Java有jar包或者war包作为分发格式,Python则什么...

python核心 - 字符串编码

字符编码字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展, 但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。 现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。 但是,如果你写的文本基本上全部是英文的话...

python核心 - 函数式编程

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量(或者说不能给变量重新赋值),因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 函数式编程(请注意多了一个“式”字)——Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。它的一个特...

centos6.x安装python2.7

更新系统和开发工具集,下面所有的指令都在root用户下完成 yum -y update yum groupinstall -y 'development tools' 另外还需要安装 python 工具需要的额外软件包 SSL, bz2, zlib yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget 源码安装Python 2.7.xwget http://www.pytho...

使用PyInstaller打包Python程序

PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX。并且很多包都支持开箱即用,不依赖环境。 环境为windows7操作系统,python2.7.8 virtual environment 官网:https://github.com/pyinstaller/pyinstaller 详细步骤:1. win7下面先安装这个依赖:pywin32,下载下来后切换到ve...

Django1.9开发博客14- 集成Xadmin

xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 Bootstrap 作为 UI 框架 编辑页面灵活布局 主页面仪表盘及小部件 过滤器强化 数据导出 强大的插件机制 项目主页:http://sshwsfc.github.io/django-xadmin/ 在线demo: http://demo.xadmin.io/ 与d...

Django1.9开发博客13- redis缓存

Redis 是一个高性能的key-value数据库。redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。 目前Redis已经发布了3.0版本,正式支持分布式,这个特性太强大,以至于你再不用就对不住自己了。 性能测试服务器配置:Linux 2.6, Xeon X3320 2.5Ghz SET操作每秒钟110000次,GET...

Django1.9开发博客12- i18n国际化

国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页。 Django能完美支持文本翻译、日期时间和数字的格式化、时区。 另外,Django还有两点优势: 允许开发者和模板作者指定他们哪些app应该被翻译或被格式化为本地形式。 允许用户根据自己的偏好来实现本地化显示。翻译依据语言,格式化依据国家, 这些信息由浏览器中的Accept-Language头来决定。不过目前为止时区还未能实现。 参考官方文档:https://docs.djangopro...

Django1.9开发博客11- 富文本与代码高亮

TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成。 功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX。另一特点是加载速度非常快。 django里引用TinyMCE富文本编辑器,其实很简单,前提是你知道django的静态文件配置。 其实这个我已经在前面文章提到过,可以回去再看看。 TinyMCE的官方网站是:http://www.tinymce.com/ 下载地址:http://downloa...

Django1.9开发博客10- 全文搜索

Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架。 django-haystack能为Django提供whoosh,solr,Xapian和Elasticsearc四种全文检索引擎作为后端。 其中whoosh为纯python的实现,不是非常大型的应用,是没有问题的。 本文将介绍Django1.9中通过django-haystack与whoosh集成以及whoosh的中文支持。 安装依赖:pip install django-...

Django1.9开发博客09- 用户认证

你应该注意到了一点,当你去新建、修改和删除文章的时候并不需要登录, 这样的话任何浏览网站的用户都能随时修改和删除我的文章。这个可不是我想要的! 编辑和删除的认证我们需要保护post_new, post_edit和post_publish这三个视图,只有登录用户才有权去执行。 django为我们提供了很好的帮助类,其实就是利用了python中的decorators技术。 django中认证的装饰器位于模块django.contrib.auth.decorators中,名称...

Django1.9开发博客08- 继续完善

到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了。 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现。 草稿箱之前我们新建文章的时候只是是保存到数据库,也就是仅仅保存了草稿,还没有对外发布, 在博客首页上面是看不到的,因为published_date字段为空。这里我们需要添加一个草稿箱的链接。还是四部曲。 第一步,添加一个链接: 打开mysite/templates/mysite/base.html文...

Django1.9开发博客07- 实现功能

到目前为止我们已经完成了一个django应用的所有基础部分。 包括url配置、视图、模型和模板。接下来开始继续完善我们的博客系统了。 首先我们需要一个显示每篇文章的详细页面,对不? 文章详情对于首页每一篇文章,我们希望点击标题后可以进入该文章的阅读页面。修改post_list.html中的标题href如下: <h1><a href="@% url 'blog.views.post_detail' pk=post.pk %@&q...

Django1.9开发博客06- 模板继承

模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容。通过这种方式你就需要在每个页面复制粘贴同样的代码了。 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一个模板就行了, 这样最大化复用,减少了冗余,也减少了出错的几率,而且你敲的代码也少了。 创建一个base模板一个base模板就是你全站所有页面都会继承的最基本的网站框架模板。我们在blog/templates/blog/中创建一个base.html模板: blog └───...

Django1.9开发博客05- 页面美化

css是一种用来描述某种标记语言写的web站点的样式语言。这里我们并不想展开讨论, 关于CSS我在这里推荐一个很不错的资源: Codeacademy HTML & CSS course 不想从头开始写,因为我们有现成的css框架,没必要重复造轮子。 使用Bootstrap目前最流行的css框架非bootstrap莫属了,官网地址:http://getbootstrap.com/ 只需要在你的html模板页面的开始部分添加下面几句就行了 <link rel=...

Django1.9开发博客04- 三部曲

其实在django中实现一个功能只需要三个步骤即可,这里我姑且叫它三部曲。 这三部曲就是: 定义urls映射 定义views 定义templates 什么是URL?URL就算一个WEB地址,你在浏览器输入这个地址,然后浏览器返回相应的网页给你。 比如http://djangogirls.com是一个URL,而127.0.0.1:8000同样也是个URL,默认就是http协议的。 Django中的URL工作原理我们打开mysite/urls.py文件,会发现类似下面这...

Django1.9开发博客03- 部署

到目前为止,你的网站只能在你自己的电脑上访问到。你需要将它发布到公网上去让地球上的人都能看到,那么要怎么做呢? 在互联网上你可以找到很多的服务器供应商。我们将使用一个相对简单的托管平台PythonAnywhere。 PythonAnywhere对于一些没有太多访问者的小应用是免费的,所以它对你来说绝对是足够使用的。 其它我们将使用到的外部服务是GitHub,它是一个代码托管服务。还有其它的一些服务,但当今几乎所有的程序员都有 GitHub 帐户,相信你肯定有一个! 安装...

Django1.9开发博客02- 模型

django的模型就是用于在数据库中存储的某种类型的对象。在我们的博客系统中, 发表的文章就是一个模型,需要存储在数据库中。 这里我们使用django默认的sqlite3库,对于我们的这个小系统而言已经足够了。 创建一个应用在django中有两个概念需要弄清楚。一个是工程(project)的概念,一个是应用(application)的概念。 它们的关系是:一个工程中包含多个应用。每个应用都是独立的,应用通过setting.py注册到工程中来就可以使用了。 这样可以解耦合...

Django1.9开发博客01- 入门篇

笔者用过django一段时间了,是时候做点笔记了。不过官网文档稍微有点复杂,对新手而言很困难, 而网上的一些教程很多都过时了。最近看到一个外文的教程非常不错,网址是:http://tutorial.simpleblog.org/, 这个是基于django1.9和python3.4,通俗易懂,非常适合新手入门。 那么我自己参考这个整理了一下这个教程,同时还将源码上传到GitHub上去了。希望对于大家有帮助。教程中如果有不足之处希望大家不吝赐教 ^_^ 参考教程:http:...