Fork me on GitHub
python核心 - 装饰器

python核心 - 装饰器

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

python核心 - 生成器

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核心 - 迭代器

python核心 - 迭代器

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

python核心 - 模块和包

python核心 - 模块和包

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

python核心 - 打包与发布

python核心 - 打包与发布

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

python核心 - 字符串编码

python核心 - 字符串编码

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

python核心 - 函数式编程

python核心 - 函数式编程

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

利用httpd对Tomcat进行负载均衡

利用httpd对Tomcat进行负载均衡

操作系统:CentOS 6.5_x86_64 前提:提前准备好编译环境,防火墙和selinux都关闭 主机IP:两台机器,192.168.203.103、192.168.203.104 安装软件:jdk-8u51-linux-x64, apache-tomcat-8.0.24, tomcat-connectors-1.2.41, httpd-2.2.15, httpd-devel-2.2.15 一、两台机器都安装JAVA8sudo rpm -qa | grep jdk ...

centos6.x安装python2.7

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...

归并排序中对小数组采用插入排序

归并排序中对小数组采用插入排序

纯归并排序的复杂度为O(nlgn),而纯插入排序的时间复杂度为O(n^2)。数据量很大的时候采用归并排序。 但是在n较小的时候插入排序可能运行的会更快点。因此在归并排序中当子问题变得足够小时, 采用插入排序来使得递归的叶子变粗可以加快排序速度。那么这个足够小到底怎么去衡量呢? 请看下面: 这么几个我不证明了,比较简单: 插入排序最坏情况下可以在O(nk)时间内排序每个长度为k的n/k个子列表 在最坏情况下可在O(nlg(n/k))的时间内合并这些子表 修订后的算法的最...