朗志工作室(Langzhi Studio)

江浙沪美国一带找工作中,欢迎联系
方向:爬虫、搜索 技术:c/c++,python

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
  9491 Posts :: 2 Stories :: 571 Comments :: 7 Trackbacks

公告

2013年5月15日 #

基于epoll实现的一个简单的web服务器 http://my.oschina.net/rentiansheng/blog/115302
posted @ 2013-05-15 23:21 lexus 阅读(36) 评论(0) 编辑

当单例(Singleton)爱上多线程——重复初始化问题 http://my.oschina.net/noahxiao/blog/126357
posted @ 2013-05-15 23:19 lexus 阅读(37) 评论(0) 编辑

avhttp终于支持了gzip/chunked http://my.oschina.net/jackwgm/blog/128313
posted @ 2013-05-15 23:18 lexus 阅读(35) 评论(0) 编辑

avhttp简介 http://my.oschina.net/jackwgm/blog/130164
posted @ 2013-05-15 23:17 lexus 阅读(33) 评论(0) 编辑

开源免费的C/C++网络库(c/c++ sockets library) http://my.oschina.net/u/136923/blog/130225
posted @ 2013-05-15 23:16 lexus 阅读(35) 评论(0) 编辑

Mitmproxy 0.9 发布,支持 SSL 的 HTTP 代理 http://www.oschina.net/news/40514/mitmproxy-0-9
posted @ 2013-05-15 23:07 lexus 阅读(30) 评论(0) 编辑

2013年5月10日 #

python urlencode 编码 [Python俱乐部]

python urlencode 编码

urlencode 调用方法

urlencode的参数必须是Dictionary

d= {'par1':'a','par2':'b',}
print urllib.urlencode(m)
#par2=b&par1=a

urlencode 编码

函数urlencode不会改变传入参数的原始编码,也就是说需要在调用之前将post或get参数的编码调整好。Python编码转换可以参考 http://www.pythonclub.org/python-basic/codec

问题:现在模拟请求Google和baidu,由于baidu使用的是gb2312编码,google使用的是utf8编码,两个站点提交到URL中的中文参数的urlencode值是不一样,下面以”帝国”为例:

python文件的

# coding: UTF-8

执行urllib.urlencode(“帝国”)得到的结果是:%E5%B8%9D%E5%9B%BD, 此结果说明默认使用 urlencode得到的结果是utf8编码的“帝国”。

现在想得到gb2312编码的“帝国”怎么办呢?

st = u'帝国'
st = st.encode('gb2312')
m = {'par':st,}
s = urllib.urlencode(m)
print s
#结果为par=%B5%DB%B9%FA

django中urlencode类似,方法如下:

from django.utils.http import urlquote
a = urlquote('帝国')
print a 

得到汉字的GBK编码

其实可以用urllib的quote函数对URL中的中文进行转换,将中文转换成GBK的编码,得到的编码是符合URI标准的URL。

>>> import urllib
>>> a = "帝国"
>>> a
'\xb5\xdb\xb9\xfa'
>>> urllib.quote(a)
'%B5%DB%B9%FA'
>>>
posted @ 2013-05-10 10:31 lexus 阅读(59) 评论(0) 编辑

2013年5月9日 #

维多利亚旅行者 V6004 时尚休闲商务双肩包 黑色[价格 行情 报价] - 易迅网

维多利亚旅行者 V6004 时尚休闲商务双肩包 黑色
posted @ 2013-05-09 22:40 lexus 阅读(20) 评论(0) 编辑

2013年5月6日 #

题目36 - ACM在线评测系统

最长公共子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
输入
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入
2
asdf
adfsd
123abc
abc123abc
样例输出
3
6
来源
经典
上传者
hzyqazasdf
posted @ 2013-05-06 14:58 lexus 阅读(36) 评论(0) 编辑

最长公共子序列和最长公共连续子序列 - andrew的日志 - 网易博客

最长公共子序列和最长公共连续子序列   

2012-08-26 16:02:16|  分类: 算法学习 |  标签:  |字号 订阅

1. 最长公共子序列(不必连续)
定义f(m, n)为Xm和Yn之间最长的子序列的长度
于是有f(m, 0) = f(0, m) = 0
如果xm != yn, 则f(m, n) = max{ f(m-1, n), f(m, n-1) }
如果xm = yn,则f(m, n) = f(m-1, n-1) + 1
问题归结于求f(m, n)。依照公式用Bottom-up DP可解。

2. 最长连续子字符串(必须是连续的)
定义f(m, n)为Xm和Yn之间最长的子字符串的长度并且该子字符串结束于Xm & Yn。因为要求是连续的,所以定义f的时候多了一个要求字符串结束于Xm & Yn
于是有f(m, 0) = f(0, m) = 0
如果xm != yn, 则f(m, n) = 0
如果xm = yn, 则f(m, n) = f(m-1, n-1) + 1
因为最长字符串不一定结束于Xm / Yn末尾,所以这里必须求得所有可能的f(p, q) | 0 < p < m, 0 < q < n, 最大的f(p, q)就是解。依照公式用Bottom-up DP可解。

posted @ 2013-05-06 10:58 lexus 阅读(24) 评论(0) 编辑

Codeblocks调试STL——gdb with python support - Wanglikai91 - 博客园

Codeblocks调试STL——gdb with python support

一、Codeblocks调试STL的问题:

不管你是Windows还是Linux的C/C++程序员,C::B都是一个非常不错的集成开发环境,如果你经常使用STL,你会发现C::B对STL的调试支持很差,其实这并不是Codeblocks的问题,而是GDB本身对STL的支持太差。我们可以看到下图情况:

beforechange

 

但是对于一些复杂程序我们有时不得不使用调试观察程序运行情况,然而而STL又是我们编写C++程序一个不可缺少的工具,那我们该如何是好呢?有一个很笨的,但是万能的调试方法,就是输出调试,如果熟练这种调试方法会让我们非常迅速找到BUG,但是对于学习他人程序,以及大多数程序员来说但不调试还是有必要的,所以这里介绍一下怎么用python脚本来支持GDB,从而达到完美支持调试STL的目的。

二、如何在Codeblocks下使用:

1、我们可以在http://qp-gcc.googlecode.com/files/gdb-7.2.7z(MinGW GDB build with python support, also include wx and stl pretty printer 2010-09-05更新),这个打包文件已经包含了所有需要用到的python的文件,所以你不需要再下载python运行环境。也可以在http://code.google.com/p/qp-gcc/downloads/list下载最新的GDB以及wx and stl pretty printer。

2、将下载的文件解压并复制到“X:Program Files\CodeBlocks\MinGW\bin\”中。

3、让C::B启动调试时加载python脚本。如果你用的也是10.05版本的C::B,那么我们可以进入Debugger Setting如下:

debugger setting

 

我们在Debugger intialization commands文本框中填入如下格式的命令:

source $(TARGET_COMPILER_DIR)bin\stl.gdb
source $(TARGET_COMPILER_DIR)bin\wx.gdb

如果我们把C::B安装在Windows的D:\Program Files\目录下,我们可以这样写命令:

source D:\Program Files\CodeBlocks\MinGW\bin\stl.gdb
source D:\Program Files\CodeBlocks\MinGW\bin\wx.gdb

通过更改后我们再调试会看到下图的效果:

afterchange

4、好好享受C::B一爽到底的STL调试吧!

四、参考:

同时,你如果想了解的更多,可以参考如下内容:

  1. About python gdb scirpt support
  2. http://code.google.com/p/qp-gcc/
posted @ 2013-05-06 08:46 lexus 阅读(21) 评论(0) 编辑

STLSupport - GDB Wiki

gd## page was renamed from STL Support  

 

STL Support Tools

When you try to use GDB's "print" command to display the contents of a vector, a stack, or any other GDB abstract data structure, you will get useless results. Instead, download and install one of following tools to properly view the contents of STL containers from within GDB.

  • GDB 7.0 will include support for writing pretty-printers in Python. This feature, combined with the pretty-printers in the libstdc++ svn repository, yields the best way to visualize C++ containers. Some distros (Fedora 11+) ship all this code in a way that requires no configuration; in other cases, this email message explains how to set everything up. The main points have been redacted here:

    1. Check-out the latest Python libstdc++ printers to a place on your machine. In a local directory, do:
      • svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

    2. Add the following to your ~/.gdbinit. The path needs to match where the python module above was checked-out. So if checked out to: /home/maude/gdb_printers/, the path would be as written in the example:
      • python
        import sys
        sys.path.insert(0, '/home/maude/gdb_printers/python')
        from libstdcxx.v6.printers import register_libstdcxx_printers
        register_libstdcxx_printers (None)
        end

    The path should be the only element that needs to be adjusted in the example above. Once loaded, STL classes that the printers support should printed in a more human-readable format. To print the classes in the old style, use the /r (raw) switch in the print command (i.e., print /r foo). This will print the classes as if the Python pretty-printers were not loaded.

  • gdb-stl-views is a set of GDB macros that can display the contents of many STL containers: list, vector, map, multimap, set, multiset, dequeue, stack, queue, priority_queue, bitset, string, and widestring. Writen and currently maintained by Dan Marinescu - PhD. The author formally disclaims copyright to this source code. In place of a legal notice, here is a blessing: May you do good and not evil. May you find forgiveness for yourself and forgive others. May you share freely, never taking more than you give!

  • gdb++ is a Perl script which extends gdb. It comes bundled as part of the Devel::GDB::Reflect Perl module. First use CPAN to install the module, then follow the gdb++ usage instructions. Developed by Stanford PhD student Antal Novak.

  • There are other options. Tom Malnar wrote a set of GDB macros similar to Dan's ( http://thread.gmane.org/gmane.comp.gcc.g++.general/4060/focus=4167 ) but it doesn't cover as wide a variety of containers. Gilad Mishne wrote a different set of macros ( http://www.stanford.edu/~afn/gdb_stl_utils/ ) but it is long unmaintained and it works only with SGI's STL implementation, which very few GCC users use.

  • Iterators: how to display the item the iterator points at (tested on gdb 6 with a list): print *(iter._M_current)

posted @ 2013-05-06 08:44 lexus 阅读(26) 评论(0) 编辑

yaocoder/utils · GitHub

utils C/C++的常用工具类

Common Utilities class and function (C/C++)


src

  • --algorithm
    • md5实现;
  • --common
    • 读取、设置配置文件的一个通用实现;
    • 线程安全的容器;
  • --sql
    • mysql数据库连接池的实现;
  • --string
    • --windows
      • windows平台下的编码类型转换;
    • 标准string的通用方法;
  • --system
    • --window
      • 程序崩溃时生成dump文件以供windbg作分析;
      • 路径工具类;
      • windows下一个定时器工具类
    • 互斥量封装;
    • 时间操作工具类;
posted @ 2013-05-06 08:40 lexus 阅读(36) 评论(0) 编辑

2013年5月5日 #

正月里--渭南春来早_百度搜索

2012-02-11凤凰大放送 正月里渭南春来早-20120211大放送-凤凰...

 

时长: 72分钟 - 高清 - 国语

 

 

正月闹新春,龙年走关中,黄河在这一带冲积出八百里肥沃的土地,早就听说这里的人们吃得好,能够把面做成花,这里的人们唱得好...

v.ifeng.com/documentary/bvideo/20120... 2013-4-20 - 百度快照

posted @ 2013-05-05 22:13 lexus 阅读(16) 评论(0) 编辑

gcc交叉编译错误:multiple definition of_时间流_百度空间

gcc交叉编译错误:multiple definition of

gcc交叉编译错误: multiple definition of条件:1、nasemail.h中放着“全局变量”:包括函数和变量;
            2、在其他*.c文件中包含#include"nasemail.h",交叉编译时,出现这个问题;
         

原因:
由于工程中的每个文件都是独立的解释的,
(即使头文件有
#ifndef _x_h
....
#enfif   )

在其他文件中只要包含了nasemail.h 就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

解决方案:
在naemail.c(或.cpp) 中声明变量,然后建一个头文件nasemail.h 在所有的变量声明前加上extern ...
如 extern int notificationEmail(int eventNumber);
注意这儿不要有变量的初始化语句。

然后在其他需要使用全局变量的 c文件中包含nasemail.h 文件而不要包含 nasemail.c 文件。编译器会为nasemail.c生成目标文件,然后连接时,在使用全局变量的文件中就会连接到此文件 。
posted @ 2013-05-05 22:05 lexus 阅读(25) 评论(0) 编辑

冒泡排序 oj - Google 搜索

UVA OJ 11495 Bubbles and Buckets (冒泡排序,逆序对) | cainiaozr

cainiaozr.wordpress.com/.../uva-oj-11495-bubbles-and-buckets-冒泡排...
2012年11月3日 – The Problem. Andrea, Carlos and Marcelo are close friends and spend their weekends by the swimming pool. While Andrea gets a suntan, ...
posted @ 2013-05-05 09:52 lexus 阅读(46) 评论(0) 编辑

浅谈基础算法之堆栈(五) - 川山甲 - 博客园

目录
 
 
 
我一直在想一个问题,我怎么能把一件事情说的明白呢?尤其是程序方面的知识点。思路清楚是非常重要的(只有思路清楚,表达清楚了,才能一目了然),这个清楚的思路怎么表现出来?我努力去做这件事情。这篇主要围绕堆栈来展开话题。
 
 
 
堆栈是什么?
 
 
 
 
实现方式
 
 
 
静态数组堆栈
 
 
1、先把你要做的事情准备好。
复制代码
/* ===========数据 */
#define STACK_INIT_MAXSIZE 100
char stack[STACK_INIT_MAXSIZE];
int top = -1;


/* ===========操作  */
void push(){
}

void pop(){
}

char get_top(){
}

int is_empty(){
}

int is_full(){
}
复制代码

这么一罗列,一下就明朗了!

2、开始逐步实现每一个函数。

 
复制代码
/* 
 * 用一个静态数组实现堆栈
 *
 * (C) Copyright 2013 Chuan Shanjia
 */
#include <stdio.h>
#include <assert.h>


#define STACK_INIT_MAXSIZE 100
char stack[STACK_INIT_MAXSIZE];
int top = -1;


/* ===========基本操作  */
void push(char *value) {
    assert(!is_full());
    stack[++top] = *value;
}

void pop() {
    assert(!is_empty());
    top--;
}
char get_top() {
    assert(!is_empty());
    return stack[top];
}

/* ===========额外操作 */
int is_empty(){
    return top == -1;
}
int is_full(){
    return top == STACK_INIT_MAXSIZE - 1;
}
复制代码
 

top存储堆栈顶部元素的下标值。开始由于没有顶部元素,所以初始值为-1,提示堆栈为空。

pop函数不需要从数组中删除元素,只减少顶部元素的下标值就足矣。

 

3、现在测试一下上面的堆栈的正确性(在上面的代码文件中,添加如下代码)。

复制代码
void print_stack(){
    int i = top;
    for(; i >= 0; i--){
        printf("%c ", stack[i]);
    }

    printf("\t");
    printf("栈顶元素:%c", get_top());
}

int main() {
    char c;
    scanf("%c", &c);
    while(c != '#'){
        if(c != '\n')
            push(&c);
        scanf("%c", &c);
    }

    printf("========打印堆栈\n");
    print_stack();
    printf("\n");

    printf("========出栈一次,打印堆栈\n");
    pop();
    print_stack();
    printf("\n");
    return 0;
}
复制代码

打印结果如下:

 

 
动态数组堆栈
 
动态数组的特点:运行时才决定数组大小。——故需在原有的操作上,添加几个操作。
 
1、先把你要做的事情准备好。
复制代码
/* ===========数据 */
char *stack;
int stack_size;
int top = -1;


/* ===========操作  */
void create_stack(){
}   

void destroy_stack(){
}   

void push(){
}

void pop(){
}

char get_top(){
}

int is_empty(){
}

int is_full(){
}
复制代码

2、开始逐步实现每一个函数。

复制代码
#include <stdio.h>
#include <assert.h>
#include <malloc.h>

/* ===========数据 */
char *stack;
int stack_size;
int top = -1;


/* ===========操作  */
void create_stack(int size){
    assert(size > 0); 
    stack_size = size;
    stack = (char *)malloc(stack_size * sizeof(char));
    assert(stack != NULL);
}

void destroy_stack(){
    assert(stack_size > 0); 
    free(stack);
    stack_size = 0;
    stack = NULL;
}

void push(char *value){
    assert(!is_full());
    stack[++top] = *value;
}

void pop(){
    assert(!is_empty());
    --top;
}

char get_top(){
    assert(!is_empty());
    return stack[top];
}

int is_empty(){
    assert(stack_size > 0);
    return top == -1;
}

int is_full(){
    assert(stack_size > 0);
    return top == stack_size - 1;
}
复制代码

 

3、现在测试一下上面的堆栈的正确性(在上面的代码文件中,添加如下代码)。

复制代码
void print_stack(){
    int i = top;
    for(; i >= 0; i--){
        printf("%c ", stack[i]);
    }

    printf("\t");
    printf("栈顶元素:%c", get_top());
}

int main() {
    char c;
    create_stack(100);

    scanf("%c", &c);
    while(c != '#'){
        if(c != '\n')
            push(&c);
        scanf("%c", &c);
    }

    printf("========打印堆栈\n");
    print_stack();
    printf("\n");

    printf("========出栈一次,打印堆栈\n");
    pop();
    print_stack();
    printf("\n");

    destroy_stack();
    return 0;

}
复制代码
 
打印结果如下:
 
 
动态分配的链式结构堆栈(又名链式堆栈)
 
 
 
push和pop我们可以这样考虑,就是移动最后一个节点上的指针。push就把最后一个节点指针向后移动一位,pop就把指针向前移动一位。
 
1、先把你要做的事情准备好。
 
复制代码
struct stack_node{
    char data;
    struct stack_node *prev;
};

struct stack_node *current;

/* ===========基本操作  */
void push(){
}

void pop(){
}

char get_top(){
}

/* ===========额外操作 */
int is_empty(){
}
void destroy(){
}
复制代码

 2、开始逐步实现每一个函数。

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

struct stack_node{
    char data;
    struct stack_node *prev;
};

struct stack_node *current;

/* ===========基本操作  */
void push(char *value){
    struct stack_node *new = (struct stack_node *)malloc(sizeof(struct stack_node));
    assert(new != NULL);
    new->data = *value;
    new->prev = current;
    current = new;
}

void pop(){
    assert(!is_empty());
    struct stack_node *last_node = current;
    current = current->prev;
    free(last_node);
}   

char get_top(){
    assert(!is_empty());
    return current->data;
}

/* ===========额外操作 */
int is_empty(){
    return current == NULL;
}   

void destroy(){
    while(!is_empty()){
        pop();
    }
}
复制代码

 

3、现在测试一下上面的堆栈的正确性(在上面的代码文件中,添加如下代码)。

复制代码
void print_stack(){
    struct stack_node *print_node = current;
    while(print_node != NULL){
        printf("%c ", print_node->data);
        print_node = print_node->prev;
    }

    printf("\t");
    printf("栈顶元素:%c", get_top());
}
    
int main() {
    char c;
    
    scanf("%c", &c);
    while(c != '#'){
        if(c != '\n')
            push(&c);
        scanf("%c", &c);
    }
    
    printf("========打印堆栈\n");
    print_stack();
    printf("\n");

    printf("========出栈一次,打印堆栈\n");
    pop(); 
    print_stack();
    printf("\n");

    destroy_stack();
    return 0;

}
复制代码

打印结果如下:

 

 
 
总结
 
以上三种方案我们要找到它们的特点:
静态数组堆栈要求结构的长度固定。而且这个要在编译时确定(我们用define定义)。——此方案最简单、最不容易出错。
 
动态数组堆栈我们可以在运行时才决定数组的长度。——在复杂性和平衡性之间做权衡。
 
 
链式结构堆栈每个元素在需要时才单独进行分配,这种方式对元素的数量几乎没有限制(排除考虑内存大小)。——最大程度的灵活性,需要消耗一定的内存,访问特定元素的效率不如数组。
 
最后,希望我的这篇博文对你有所帮助。
 
推荐
 
 
 
喜欢编程
posted @ 2013-05-05 09:30 lexus 阅读(18) 评论(0) 编辑

分别用数组和链表实现堆栈(C语言版) - ahljjun的专栏 - 博客频道 - CSDN.NET

分别用数组和链表实现堆栈(C语言版)

posted @ 2013-05-05 09:26 lexus 阅读(42) 评论(0) 编辑

基于数组的队列实现(C语言) - ahljjun的专栏 - 博客频道 - CSDN.NET

基于数组的队列实现(C语言)

分类: 算法与数据结构 371人阅读 评论(0) 收藏 举报

 

 

/*****************************************

                  接口文件QUEUE.h

****************************************/

 

#ifndef _QUEUE_H
#define _QUEUE_H

#ifndef BOOL
#define BOOL int
#endif

typedef int Item;
struct _Queue;
typedef struct _Queue  Queue;

typedef Queue* hQueue;//handle to Queue

hQueue Queue_Init(int nMax);

void Queue_Destroy(hQueue q);

void Queue_Put(hQueue q, Item elem);

Item Queue_Get(hQueue q);

int Queue_Size(hQueue q);

BOOL Queue_IsEmpty(hQueue q);
BOOL Queue_IsFull(hQueue q);

 


#endif

 

/*******************************

         实现文件QUEUE.c

*******************************/

 

#include<stdio.h>
#include<stdlib.h>
#include"QUEUE.h"

void Error(char* msg)
{
 printf("Error:%s",msg);
}


//机遇数组的队列实现
struct _Queue
{
 Item* elem;
 int head,tail;
 int N;
};

hQueue Queue_Init(int nMax)
{
 hQueue que=malloc(sizeof(*que));
 que->elem=malloc((nMax+1)*sizeof(*que->elem));
 que->head=que->tail=0;
 que->N=nMax+1;
 return que;
}


void Queue_Destroy(hQueue que)
{
 if(que->elem)
  free(que->elem);
 que->elem=NULL;
 free(que);
 que=NULL;

}

void Queue_Put(hQueue que, Item elem)
{
 if(Queue_IsFull(que))
 {
  Error("The Queue Is Full!/n");
  exit(-1);
 }
 que->elem[que->tail]=elem;
 que->tail=(que->tail+1)%(que->N);
}

Item Queue_Get(hQueue que)
{
 Item elem;
 if(Queue_IsEmpty(que))
 {
  Error("The Queue Is Empty!/n");
  exit(-1);
 }
 elem=que->elem[que->head];
 que->head=(que->head+1)%(que->N);
 return elem;
}

int Queue_Size(hQueue que)
{
 return (que->tail-que->head+que->N)%(que->N);
}

 

BOOL Queue_IsEmpty(hQueue que)
{
 return (que->head==que->tail);
}


BOOL Queue_IsFull(hQueue que)
{
 return (que->head==(que->tail+1)%(que->N));
}

 

 

/******************************

                   测试文件main.c

********************************/

 

#include<stdio.h>
#include<stdlib.h>
#include"QUEUE.h"


int main()
{
 hQueue  q=Queue_Init(7);
 int t=7;
 while(t)
 Queue_Put(q,t--);

 printf("Queue:%d/n",Queue_Get(q));
 printf("Queue:%d/n",Queue_Get(q));
 printf("Queue:%d/n",Queue_Get(q));

 printf("Queu Size= %d/n",Queue_Size(q));
 
printf("******************************************/n");
 t=30;
 Queue_Put(q,t--);
 Queue_Put(q,t--);

 printf("Queu Size= %d/n",Queue_Size(q));

 

 while(!Queue_IsEmpty(q))
 printf("Queue:%d/n",Queue_Get(q));
 Queue_Destroy(q);


 return 0;
}

 

 

 

 

posted @ 2013-05-05 09:25 lexus 阅读(44) 评论(0) 编辑

2013年5月4日 #

摘要: python __call__ (可调用对象) http://my.oschina.net/zoey1990/blog/126969阅读全文
posted @ 2013-05-04 08:04 lexus 阅读(41) 评论(0) 编辑