设计模式 #2:观察者模式

Posted on 2016-7-12 in Code • Tagged with code, pythonLeave a comment

概括

观察者模式 = 发布者(publisher) + 观察者(observer / subscriber)

模式定义

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

例子:气象监测应用

建立下一代 Internet 气象观察站。该气象站必须建立在 WeatheData 对象上,由 WeatherData 对象负责追踪目前的天气状况(温度、湿度、气压)。 对问题进行分析,发现我们要做的是: 建立一个应用,有三种布告板,分别显示目前的状况、气象统计及简单的预报。 当 WeatherObject 对象获得最新的测量数据时,三种布告板必须实时更新。 * 系统必须可扩展,让其他开发人员可以建立定制的布告板。

解决方案1

subject.py

class Subject(object):
    '''Subject interface class'''
    def register_observer ...
Continue reading

设计模式 #1: 策略模式

Posted on 2016-7-6 in Code • Tagged with code, pythonLeave a comment

这是我有关图书 Head First 设计模式 的笔记,因为我刚开始学 Java,很多特性还不熟,所以这里选择用 Python 来实现。

定义

策略模式(strategy pattern)定义了算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

起始例子

class Duck(object):
    def quack(self):
        print "quack"
    def swim(self):
        print "swim"
    def display(self):
        raise NotImplementedError("abstract display")


class MallardDuck(Duck):
    def display(self):
        print "green"


class RedheadDuck ...
Continue reading

Python 内置函数之 filter

Posted on 2016-5-5 in Code • Tagged with pythonLeave a comment

介绍

filter 过滤列表中的元素,并且返回一个由所有符合要求的元素构成的列表。符合要求的定义为,针对该元素,函数的返回值为 True。

用法

filter(function, iterable),等同于 [item for item in iterable if function(item)]

例子

比如说,之前在 CheckIO 上有一道测试题,需要验证一个密码的可靠性,要求就是密码长度至少为10位,并且同时包含大写字母,小写字母以及数字。

我的解题思路是使用正则来检查字符串:

import re

def checkio(data):

    #replace this for solution
    is_secure = False
    if len(data) >= 10:
        if re.search('[a-z ...
Continue reading

Python 内置函数之 map

Posted on 2016-5-3 in Code • Tagged with pythonLeave a comment

map 是 Python 中的一个内置函数,它会将一个函数映射到一个可迭代对象的所有元素上。

用法:
map(function_to_apply, list_of_inputs)

举个例子,我们有一个包含一组整数的列表,需要计算并返回一个包含每个数字平方的新列表:

items = [1, 2, 3, 4, 5]
squared = []
for item in items:
squared.append(item ** 2)

map 就会有更 pythonic 的解决方式:

items = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, items)

多将 map 与匿名函数 lambda 配合使用 ...

Continue reading

一个简单的 Web 服务器

Posted on 2016-3-8 in Code • Tagged with python, 500LLeave a comment

本文是 500 Lines or Less 一书的早期章节,该书是 Architecture of Open Source Applications 系列的第四本。阅读时碰到的任何问题,你都可以来我们的 GitHub tracker 报告。想获取新章节的发布信息,或者有关最终出版图书的计划,请关注 AOSA 博客 或者 Twitter

介绍

在过去的二十年间,Web 已经改变了人类社会的方方面面,但它的核心却几乎没有变动。大多数系统依旧遵循 Tim Berners-Lee 在25年前制定的规则。特别是,大多数 web 服务器仍以过去同样的方式来处理同一类信息。

本章将探索它们是如何运作的。同时,我们将学习开发人员如何开发出不需要为了增加新功能而改写的软件系统。

背景

几乎每个在 web 上运行的程序都会使用名为网际协议 (Internet Protocal) 的通信标准。网际协议是 ...

Continue reading

Virtualenvwrapper 简单介绍

Posted on 2016-2-22 in Code • Tagged with pythonLeave a comment

virtualenvwrapper 包装了一系列的命令,使得使用虚拟环境(virtual environment)变得更加容易。并且它会将所有的虚拟环境都放在一个目录以便于管理。

安装:

$ pip install virtualenvwrapper

.bashrc加入以下两行:

export WORKON_HOME=$HOME/PyEnvs
source /usr/local/bin/virtualenvwrapper.sh

重新加载Shell启动文件(source ~/.bashrc)

基本用法:

  1. 创建一个虚拟环境:
    $ mkvirtualenv venv
    这将在 ~/PyEnvs 目录下创建一个 venv 文件夹。

  2. 进入虚拟环境工作:
    $ workon venv
    workon 可以停止当前工作的虚拟环境,所以你能很快的在环境之间切换。

  3. 停用虚拟环境:
    $ deactivate

  4. 删除:
    $ rmvirtualenv venv

Continue reading

理解dict.copy() - shadow 还是 deep?

Posted on 2015-3-11 in Code • Tagged with pythonLeave a comment

最近在重新设计一段代码的时候,发现有一行使用dict.copy()的方式复制一个字典,第一反应是会和list一样,对新dict的任何操作都会影响原有的dict,结果实验了一下并不是这样。

>>> a = {'a':111, 'b':222}
>>> b = a.copy()
>>> b['c'] = 333
>>> del b['a']
>>> print a
>>> {'a': 111, 'b': 222}
>>> print b
>>> {'c': 333, 'b': 222}

这让我很困惑,为什么浅复制(shadow copy)的情况和list不一样。。。

StackOverflow上找到了一个回答,解答了我的疑惑,大致描述一下:

对于浅复制,意味着字典的内容不是对值的拷贝,而是创建了新的引用:

>>> a = {1: [1,2 ...
Continue reading