Category Archives: Python|R

Core Python Programming Reading Note 3

1. stringIO, CStringIO
StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO。

我们看到了StringIO的行为,基本与file一致。StringIO提供了一个方法,可以方便的获取其中的数据:StringIO.getvalue()。
如果使用read方法获取其中的数据,必须通过seek先设置”文件指针”的位置。
Python标准模块中还提供了一个CStringIO模块,它的行为与StringIO基本一致,但运行效率方面比StringIO更好。
但使用cStringIO模块时,有几个注意点:
1. CStringIO.StringIO不能作为基类被继承;
2. 创建cStringIO.StringIO对象时,如果初始化函数提供了初始化数据,新生成的对象是只读的。所以下面的代码是错误的:
s = cStringIO.StringIO(“JGood/n”);
s.write(“OOOKKK”);
2. module
模块是按照逻辑上组织Python代码的方法,那么文件爱你是物理层上组织代码的方法。因此一个文件可以被看作一个独立的模块。一个模块也可以被看作一个文件。
模块的文件名就是模块的名字加上扩展名.py。每个模块都定义了自己独立的名字空间。
模块的搜索路径:sys.path列表。像该列表加入自己的新模块路径即可:sys.path.append(“/home/luffy/pycode”)
三个名字空间:内建名字空间(__builtins__),局部名字空间和全局名字空间。最先加载的是内建空间,随后加载模块的全局名字空间。局部空间的内容是随时变化的(全局空间是不变的)。获得局部空间和全局空间的符号:globals()和locals()。

Python的一个有用的特性是你可以在任何需要房子数据的地方获得一个名字空间。所以给函数添加属性可以(例如添加version和__doc__属性等):

可以看出,局部变量和同一名字空间下的变量是不一样的。
—–习惯的import顺序—–
Python标准库模块
Python三方模块
应用程序自定义模块
—–from-import语句—–
把模块的名称引入到当前域.
但是from module import *的操作会污染当前作用域的名字空间,要谨慎shiyo
—–import xxx as yyy语句—–
import Tkinter as tk
—–引入时执行模块—–
加载模块会直接导致这个模块被执行。也就是被导入模块的顶层代码将直接被执行。
一个模块只会被加载一次,无论他被引入多少次。这可以组织多重导入时代码被多次执行。
—–模块名称重复—–

C:Usersluffy>python importer.py
importee abc
importee efg
importee abc
这种引入方法是和不好的,所以推荐使用import和白完整的标识符名称。
__import__()函数
__import__(module_name[, globals[, locals]])
reload()函数
重新导入模块。重新导入的模块需要的直接模块名而非字符串。
3. Package
包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的Python应用程序执行环境。用户解决下面问题:
为平坦的名称空间加入有层次的组织结构;
把有联系的模块结合在一起(子包);
解决有冲突的模块名称;
使用目录结构而不是一大堆混乱的文件。
初始化包需要有有一个__init__.py文件,__init__.py的文件将会被执行。否则导致一个ImportWarning信息。
sys.modules变量包含了一个由当前载入(完整&成功)到解释器的模块组成的字典。模块名作为键,它们的位置作为值。
4. lambda函数
lambda函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。常常和map,reduce,filter等函数中使用,例如阶层:
print reduce(lambda x,y:x*y, range(1, 1001))
自定义排序方法:
list_people=[People(21,’male’),People(20,’famale’),People(34,’male’),People(19,’famale’)]
list_people.sort(lambda p1,p2:cmp(p1.age,p2.age))
其他简写:
>>> arrayA = [1,2,3,4,5,6,7]
>>> arrayB = [ number for number in arrayA if number % 2 ]
>>>people_who_want_to_watch_av_film = [person1, person2, person3, person4]
然后,我们检查他们的年龄,产生能够观看的人员的列表,并打印出来:
>>> people_who_can_watch_av_film = [‘Hi, %s %s, you can watch av!’ % (person[‘surname’], person[‘givename’]) for person in people_who_want_to_watch_av_film if person[‘age’] >= 18]
lambda工厂式:

删除之中的偶数

5. class & magic method
(1). __init__ & __del__

(2). __str__和__unicode__
__str__() is a Python “magic method” that defines what should be returned if you call str() on the object. Thus, you should always return a nice, human-readable string for the object’s __str__. Although this isn’t required, it’s strongly encouraged.

__unicode__(self)同理,调用buildin函数unicode(obj)时调用。
__repr__(self)同理,输出更详细的类型信息
(3). 私有机制
python对象没有权限控制,所有的变量都是外部可以调用的。但是程序员只有一些约定俗成的方法:私有变量加双下划线。如__name。
(4). __iter__
buildin函数iter
i1 = iter(itr, ‘c’)
这个意思是说,返回itr的iterator,而且在之后的迭代之中,迭代出来’c’就立马停止。对这个itr有什么要求呢?这个itr在这里必须是callable的,即要实现__call__函数
i1 = iter(itr)
这里itr必须实现__iter__函数,这个函数的返回值必须返回一个iterator对象

# i1必须是callable的,否则无法返回callable-iterator

(5). super()
调用父类的方法:

这里我们发现python的继承不会自动调用父类的构造器/析构器,必须亲自调用它。
1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象;
2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用super);
5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一个父类函数被调用多次。
(6). 函数的名称,doc_string
func_doc The function’s documentation string, or None if unavailable Writable
__doc__ Another way of spelling func_doc Writable
func_name The function’s name Writable
__name__ Another way of spelling func_name Writabl
(7). magic method
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
object.__cmp__(self, other) #Called by comparison operations if rich comparison (see above) is not defined. Should return a negative integer if self other
object.__hash__(self) #Called by built-in function hash()
If a class does not define a __cmp__() or __eq__() method it should not define a __hash__() operation either;
if it defines__cmp__() or __eq__() but not __hash__(), its instances will not be usable in hashed collections.
If a class defines mutable objects and implements a __cmp__() or __eq__() method, it should not implement __hash__(),
since hashable collection implementations require that a object’s hash value is immutable
(if the object’s hash value changes, it will be in the wrong hash bucket).

Posted in Python|R.

Core Python Programming Reading Note 2

1. zip, enumerate
enumerate(list) 参数为可遍历的变量,为字符串或列表,返回(index,元素)的组合。
例1 找到某一个字符串中1出现的位置:

例2:

Continue reading

Posted in Python|R.

Core Python Programming Reading Note 1

1. build-in functions
int(obj)
str(obj)
len(obj)
type(obj)
help(obj) 获得对象说明
dir(obj) 显示对象属性/方法列表

操作和man帮助类似,space翻页,q退出。
2. id, type, isinstance
每一个对象有一个id值,使用id()函数得到的。对象还可以使用type()来获得类型信息。

关于类和对象的类型:

判断对象是不是某个类的:isinstance函数:

当一个对象的引用计数为0时,将会被gc自动收集。
3. eval,exec,compile
eval(str [,globals [,locals ]])
函数将字符串str当成有效Python表达式来求值,并返回计算结果。
同样地, exec语句将字符串str当成有效Python代码来执行..exec(str) 这种形式也被接受,但是它没有返回值。
最后,execfile(filename [,globals [,locals ]])
函数可以用来执行一个文件,看下面的例子:

默认的,eval(),exec,execfile()所运行的代码都位于当前的名字空间中. eval(), exec,和 execfile()函数也可以接受一个或两个可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:

# 将上边的字典作为全局和局部名称空间

如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用。
注意例子中exec语句的用法和eval(), execfile()是不一样的. exec是一个语句(就象print或while), 而eval()和execfile()则是内建函数.
当一个字符串被exec,eval(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。
compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串, filename是定义该字符串变量的文件,kind参数指定了代码被编译的类型– ‘single’指单个语句, ‘exec’指多个语句, ‘eval’指一个表达式. cmpile()函数返回一个代码对象,该对象当然也可以被传递给eval()函数和exec语句来执行,例如:

4. is(is not) & ==(!=)
is 是变量是否指向同一对象,即id()的相同。==是对象的内容是否相等(通过对象内建函数__cmp__来定义)。

需要注意的是,数值常量和字符串常量会被哈希缓冲。所以指向相同字符串的变量,其id也会相同。
几种python中没有的机制:
a). 不分float, double,只有float
b). 没有指针
c). 没有char/byte类型
d). 没有short类型,但是有int和long。其类型自动判断。

★5. map, reduce, filter, apply
使用C语言编写并作了优化,代替循环来提升性能。
map(fun , list) #将list的每个元素作用于一元函数fun,并且返回所有fun值的列表

apply(func [, args [, kwargs ]]) #间接执行一个函数func,它的参数在列表args中,或者在字典kwargs中。apply的返回值就是func的返回值。apply()的元祖参数是有序的,元素的顺序必须和func()形式参数的顺序一致。
#需要把一个图片拆分为大小相同的很多的小图片。按照以前写程序的思想就是写两重循环了,枚举开始左上角的点。

在数据分析时,集合对象的操作和map,filter,reduce等函数尤其重要。

Book 《Python核心编程 第二版》

Posted in Python|R.