2006年06月25日

2006年05月17日

        在加紧写自己的小东西,所以blog更新越来越慢了。主要也是因为有些知识点自己粗略知晓以后就没有再深入,也就无甚可累积。

        关于python中的lambda,其实在给初学者的《简明教程》中就有详细记述:

# Filename: lambda.py

def make_repeater(n):
    return lambda s: s*n

twice = make_repeater(
2)

print twice('word')
print twice(5)

执行结果如下:

>>wordword
>>10

      至于另一个困扰我很久的yield,今天终于在群中有了讨论。为了偷懒,我直接复制内容加上简单注释吧:

邪恶AlbertLee 15:18:15
yield ,可以让你的函数中断, 当再次回来这个函数时从这个中断处继续执行

?老骨头 15:19:59
>>> def ff():
…    print ‘a1′
…    yield 1
…    print ‘a2′
…    yield 2

>>> for i in ff():  #可以理解为从函数ff()中取值赋予i.
…    print i          #打印出i的值.

a1
1
a2
2

邪恶AlbertLee   15:21:07
比如说,我们要做一个注册用户的流程,分为如下几步:
InputBasicInfo
InputMoreInfo
Register
Done
如果使用常规的方法, 就是把这几个分别放在不同的页里面,或者说放在不同的函数中,通过 form action 连起来 

邪恶AlbertLee 15:22:09
如果使用 continuation ,那么程序看上去像这个样子:

def register():
    yield BasicInfoPage()
    get user input data
    yield MoreInfoPage()
    get More info data
    Do Register action
    yield DonePage()

骨头15:28:35
def register():
    tmp = []
    tmp.append( BasicInfoPage())
    get user input data
    tmp.append( MoreInfoPage())
    get More info data
    Do Register action
    tmp.append( DonePage() )
    return tmp

这样写跟你实现的效果应该是相同的吧?

邪恶AlbertLee15:28:55
不一样。 BasicInfoPage() 返回的结果是一个纯的 html 页面的内容
yield 就是把这个页面发给Browser

?老骨头 15:30:17
我定义了一个这样的函数
def ff():
   print ‘a1′
   yield 1
   print ‘a2′
   yiled 2

可是我怎样调用这个函数呢
现在我用的办法是这样的
aa=list(ff())
这个办法对吗


邪恶AlbertLee 15:30:54
可以

打完收功。还有篇比较详细的参考,地址在:

http://www.nirvanastudio.org/python/continuations.html

2006年04月29日

         很遗憾,我已经开始动手写了。可是关于学习的记录却越来越少更新。从每月的更新数看的出来我的热情在减退,但我努力的坚持。希望能够把知识整理好。

          这篇内容也不会长,主要谈的是一个在python比较常用的解决问题的两个函数。上次是遇到探测一个对象的性质问题。在群里的lee兄教会了我两个方法。(其实在学习中早有学习到,不过真正的使用又是另外一回事)。

          那是一个models的对象,对于它的一些方法我不是很清楚,所以lee兄建议我使用type( )函数来查看性质,然后使用dir( ),来查看该对象是否有__len__方法(我需要看对象是否为空),结果果然奏效,通过len函数解决了问题。看来我需要多巩固学过的一些常用的函数,用于排查问题之类的,还是非常顺手的

2006年04月22日

这一篇其实没什么内容,讲的主要是django自带的web server会自动重启的问题。我不知道它到底是个BUG还是由于我本身对django的不了解导致的。

具体的症状和解决办法在这里都有描述:

http://blog.donews.com/fatbobman/archive/2005/12/21/665623.aspx

时区导致的问题。

2006年04月16日

在modou的blog中讲到这样一个函数——curry

比较复杂,但在django中的很多地方都使用到这个函数,内容如下:

def curry(*args, **kwargs):
    def _curried(*moreargs, **morekwargs):
        return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))
return _curried

函数中再嵌套函数_curride

它在执行的时候是这样:

>>> from django.utils.functional import curry
>>> def a(a, b, c):
…     print a, b, c
>>> b = curry(a, ‘a’, ‘b’)
>>> b(‘c’)
a b c

分析curry函数,它接收一个*args的元组以及**kwargs字典。而在执行示例中,curry(a,’a',’b')是把函数a作为元组的第一个元素放了进去.可以理解为(a,’a',’b)这样一个元组.

由于函数curry返回的是它自身嵌套的函数_curried,那么_curried被赋予了b,b则是_curried函数,不同的是其中包含了一个args[0]的元组下标,而这个args的内容就是(a,’a',’b'),args[0]就是之前的函数a了

这样下面的就很容易理解了

2006年03月29日

上一篇:http://blog.donews.com/vaneoooo/archive/2006/02/21/736657.aspx

记录了一部分的*、**内容,昨天邮件列表中yi yang给总结了一些,转到此作为补充:

>>> def test(*args):

…     print args

>>> test(1,2,3)

(1, 2, 3)
—————————————————————————

>>> def test1(**keywords):

…     print keywords

>>> test1(arg1=1,arg2=2,arg3=3)

{‘arg1′: 1, ‘arg2′: 2, ‘arg3′: 3}

>>> list=[1,2,3]
>>> def test3(a,b,c):

…     print a,b,c

>>> test3(*list)

1 2 3
————————————————————————

>>> dict={‘a’:1,’b':2,’c':3}
>>> def test4(a=None,b=None,c=None):

…     print a,b,c

>>> test4(**dict)

1 2 3
—————————————————————————

>>> def test5(a,b=None,c=None):

…     print a,b,c

>>> def test6(*args,**kw):

…     test5(*args,**kw)

>>> test5(5,b=3,c=1)
5 3 1
>>> test6(5,b=3,c=1)

5 3 1

2006年03月26日

HOHO,一个对我而言比较重要的知识点来了:

 方法  说明 
 __add__ , __radd__ , __iadd__  重载加法运算,以便连接序列。如:sequenec1+sequenec2
 append  为一个可变序列追加一个元素 
 __contains__  检测元素是否为序列成员,如:element in sequenec 
 count

 判断在一个可变序列中,元素出现的次数.如:sequenec.count(element)

 __delitem__  从可变序列中删除一个项目。如:del sequenec[index]
 __getitem__  根据下标访问元素,如:sequenec[index]
 index  获取元素在序列中第一次出现的索引。如:sequenec.index[element]
 insert  在可变序列的指定索引处插入一个元素。如:sequenec.insert[index,clcmcnt]
 __len__  判断序列长度,如:len(sequenec)
 __mul__ , __rmul__ , __imul__  重载乘法运算,以重复序列,如:sequenec*3
 pop  从可变序列中移除一个元素,如:sequenec.pop() 
 remove  从可变序列中移除第一次出现的一个值,如:sequenec.remove() 
 reverse  当场翻转一个可变序列,如:sequenec.reverse()
 __setitem__  为可变序列赋值,如:sequenec[index]=value
 sort  当场对一个可变序列排序,如:sequenec.sort()

重载内建函数:

内建函数  说明  特殊方法 
 abs(x)  返回x的绝对值    __abs__
 divmod(x , y)  返回一个元组,其中包含x%y的整数商和余数的部分    __divmod__
 len(x)  返回x的长度(x 应该是一个序列)  __len__
 pow(x , y[,z]  返回xy的结果。如果有3个参数,就返回(xy)%z  __pow__
 repr(x)  返回一个x的正式字符串表示(也就是说,可从中复制出对象x的一个字符串)  __repr__

类型转换:

 方法  说明 
 __coerce__  将两个值转换成相同类型
 __complex__  将对象转换成复数类型
 __float__  将对象转换成浮点数类型
 __hex__  将对象转换成十六进制字符串类型
 __int__  将对象转换成整数类型
 __long__  将对象转换成长整数类型
 __oct__  将对象转换成八进制字符串类型
 __str__  将对象转换成字符串类型。也用于获取对象的非正式字符串表示(即简单描述了对象的一个字符串) 
2006年03月25日

从金典整理出来的一个特殊方法的列表,由于PDT文件的模糊不清,所以会有暂缺的地方:


一元运算符
特殊方法
+
__add__ , __radd__
-
__sub__ , __rsub__
~
__mul__ , __rmul__
 
 

二元运算符
特殊方法
/
__div__ , __rdiv__ ,
//
__floordiv__
%
__mod__ , __rmod__
**
__pow__ , __rpow__
<<
暂缺
>>
__rshift__ , __rrshift__
&
__and__ , __rand__
^
__xor__ , __rxor__
i
__or__ , __ror__
+=
__iadd__
-=
__isub__
*=
__imul__
/=
__idiv__
//=
__ifloordiv__
%=
__imod__
**=
__ipow__
<<=
__ilshift__
>>=
__irshift__
&=
__iand__
^=
__ixor__
.=
__ior__
==
__eq__
!= , <>
__ne__
>
__get__
<
__lt__
>=
__ge__
<=
__le__
 
 

2006年03月23日

 

        [*****]这样的标题方式是在limodou那儿学来的,刚发现有个好处是,在某种程度上可以把同一个分类中不同主线的知识点串联起来,这样至少可以让内容乱的不是那么离谱。

         之前干劲十足的准备靠着词典一本,人脑一颗来翻译完django的38份文档,可惜翻到第一份的4/8就开始有点泄气了,一来是自己从来没有认真阅读过英语(以前英文课全睡觉耽误了),二来是面对38份,每份4-23页的文档,不免有点打退堂鼓。还好,熬下来了。

        今天到了第6页,速度快的话明天能完成《Request and Response objects》的阅读。现在先来说说已知的对象。

        “`path“`,它是一个字符串,返回的是代表该页面的路径(这是英文直翻的说法,实际上就是返回一个URL,但是不包括域名部分。)来个例子:

           http://www.google.com/i/love/python/

           在这个页面中使用了request.path,那么在页面中就会有这样的显示:/i/love/python/

           “`GET“`、“`POST“`、“`REQUEST“`三个对象我像是理解了,但又感觉模糊。想要清晰,就得自己身体力行地去用上一用,不感贸然乱说,等用了来写。

           “`FILES“`这个对象用于上传文件,是一个类似字典的对象(可以就把它看成一个字典),FILES对象的key是NAME,来源于<input type="file" name=""/>,而value似乎又包含字典,其中有三个key。具体代表什么可以看limodou的这篇日志

           还有一个META,刚学会怎么用。留着改天再写