极简 Django 项目工程

和一些后端的开发工程师交流的时,经常会听到这样的声音「你们用 Django 啊?太重了吧,用 Flask 就好」。今天无意中看到一篇将 Django 视作「微框架」的文章,发布的日期是 2011 年,虽然针对的是旧版本 Django,但是这么些 Django 本身的框架结构几乎没什么变化,除了当前的版本里会强制要求配置settings.ROOT_URLCONF 与文章中的说法不一致外,这篇文章的思路在今天依然是适用的。

# web.py
from django.conf import settings
from django.conf.urls import url
from django.http import HttpResponse


# basic view function
def index_view(request):
    response = HttpResponse('Hello, Django!')
    return response

# url routers
urlpatterns = [
        url(r'^$', index_view, name='index_view'),
        ]

# basic configurations
if not settings.configured:
    settings_kwargs = {
            'DEBUG': True,
            'ROOT_URLCONF': urlpatterns,
            }
    settings.configure(**settings_kwargs)

if __name__ == '__main__':
    from django.core.management import execute_from_command_line
    execute_from_command_line()

# 在 shell 中执行以下命令
python web.py runserver
Advertisements
发表在 Python | 标签为 | 留下评论

恢复牌序

给定一堆牌,如 ABCDEF,将第一张放到桌上,第二张放到牌堆最后,反复操作后,得到桌上的牌序为 ACEBFD,求恢复原来的牌序。

目前没想到别的解法,逆向操作:

lista = ['A', 'B', 'C', 'D', 'E', 'F']
stack = []

while lista:
    stack.append(lista.pop(0))
    if lista:
        lista.append(lista.pop(0))
print stack

while stack:
    if lista:
        lista.insert(0, lista.pop(-1))
    lista.insert(0, stack.pop(-1))

print lista
发表在 Python | 标签为 | 留下评论

已知前序和中序遍历结果,输出后序遍历

思路如下:

  • 前序遍历的第一个元素是根元素;
  • 中序遍历根元素左边为左子树的中序遍历,右边为右子树的中序遍历;
    • 将前序遍历中所有左子树元素找出,得到左子树的前序遍历;
    • 将前序遍历中所有右子树元素找出,得到右子树的前序遍历;

在代码实现上,这里只要求输出,未要求内存中构建完整树结构

pre_list = [4, 9, 6, 3, 1, 2, 7, 8]
mid_list = [6, 9, 3, 1, 4, 8, 7, 2]

def post(pre, mid):
    if not pre:
        return
    index = mid.index(pre[0])
    post(pre[1:index + 1], mid[:index])
    post(pre[index + 1:], mid[index + 1:])
    print pre[0],

post(pre_list, mid_list)
发表在 未分类 | 标签为 | 留下评论

判断两棵二叉树是否同构

先给最常规意义上的解法,按照二叉树同构的严格定义:

  • 遍历所有的节点,如果值相同,且左子树同构,且右子树同构,这两棵树同构;
def is_same(node1, node2):
    return all([
        node1.value == node2.value,
        is_same(node1.left, node2.left),
        is_same(node1.right, node2.right),
        ])

再给另外一个方案:

def is_same(tree1, tree2):
    return tree_hash(tree1) == tree_hash(tree2)

这个方案中的如果计算树的散列值是个不大不小的问题,最简单的是将树表示为一个字串。例如:node(1, (node2(1, None, None), node3(3, None, node4(3, None, None))),再对这个字串取哈希值。

发表在 未分类 | 标签为 | 留下评论

查找两个单向链表的交点

这道题目常规的解决思路是这样的:

  • 计算两个链表 lista1lista2 的长度分别为 len1len2;
  • 比较 len1len2 的大小,先跳过较长的那个链表 |len1 - len2| 个元素(实际就是对齐尾部);
  • 逐个对比 lista1lista2 中的元素,直到找到重合的元素;

当然这是能解决问题的,而且也不复杂。如果这道题用 python 的话,其实可以发挥一下 python 类动态添加属性的特性,优化查找过程。

警告 使用该方法之前自行明确题目考察的目标,不要冒犯考官。

警告 使用该方法之前自行明确题目考察的目标,不要冒犯考官。

警告 使用该方法之前自行明确题目考察的目标,不要冒犯考官。

  • 先遍历一遍其中一个链表,为每一个元素添加一个属性 mark;
  • 遍历另一个链表,如果发现某个元素带有属性 mark,这个元素便是交点;
def func(node1, node2):
    while(node1.next):
       node.mark = True
       node1 = node1.next
    while(node2.next):
       if hasattr(node2, 'mark'):
           return node2
       else:
           node2 = node2.next
    retrun hasattr(node2, 'mark')
发表在 Python | 标签为 | 留下评论

Hello, Mweb

测试使用 Mweb 发布博客。

我一直苦恼如何便捷地更新博客,好在无论是 LiveSpace,还是Wordpress,都支持通过邮件的方式来发布日志。在 2G 网络时代,这真是帮了我大忙,虽然现在网络条件好了很多,我还是更喜欢这种所谓不被打扰的撰写模式。

这种方式方便是方便,但是有个小烦恼:无法预期文本的格式。以至于我的很多日志都只能是纯文本,如果带上点代码,往往就只能先写好,然后有空的时候再跑到后台去调校。

现在好了,有了 Mweb 这种支持发布到博客的 markdown 编辑器,真的帮了我很大的忙。

发表在 未分类 | 留下评论

快速排序

from unittest import (
        main,
        TestCase,
        )
from random import Random


def quick(lst):
    if len(lst) <= 1:
        return lst
    key = lst[0]
    left = [i for i in lst if i < key]
    right = [i for i in lst[1:] if i >= key]
    return quick(left) + [key] + quick(right)



class QuickTestCase(TestCase):
    def setUp(self):
        self.data = list(
                Random().sample(range(10000), 100)
                for i in range(100)
                )

    def testQuick(self):
        for _data in self.data:
            print _data
            self.assertEqual(
                    quick(_data),
                    sorted(_data),
                    )


if __name__ == '__main__':
    main()
发表在 Python | 留下评论