1、在Python 语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。 如:x=1 1这个整形对象被创建,然后将这个对象的引用赋值给x这个变量 2、多元赋值,其实就是元组赋值 x,y,z=1,2,'string' 等价于 (x,y,z)=(1,2,'string') 利用多元赋值实现的两个变量的值交换 >>> x, y = 1, 2 >>> x 1 >>> y 2 >>> x, y = y, x >>> x 2 >>> y 1 3、编写模块 # 1. 起始行 # -*- coding: cp936 -*- # 2. 模块文档 """This is a test module again""" # 3. 模块导入 import sys import os # 4. 变量定义 debug=True # 5. 类定义语句 class FooClass(object): """FooClass""" flag=1 def foo(self): print "FooClass.foo() is invoked, "+str(self.flag) # 6. 函数定义语句 def test(): """test function""" foo=FooClass() if debug: print 'ran test()' foo.foo() print foo.flag # 7. 主程序 if __name__ == '__main__': test() print "what are these?" 4、时刻记住一个事实 那就是所有的模块都有能力来执行代码。最高级别的Python 语句--也就是说, 那些没有缩进的代码行在模块被导入时就会执行, 不管是不是真的需要执行。由于有这样一个“特性”,比较安全的写代码的方式就是除了那些真正需要执行的代码以外, 几乎所有的功能代码都在函数当中。再说一遍, 通常只有主程序模块中有大量的顶级可执行代码,所有其它被导入的模块只应该有很少的顶级执行代码,所有的功能代码都应该封装在函数或类当中。 5、动态类型 变量赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的引用会被赋值给左侧的变量。 6、变量在内存中是通过引用计数来跟踪管理的 一个对象增加新的引用:对象被创建、对象的别名被创建、作为参数传递给函数、方法或类、成为容器对象中的一个元素 一个对象减少引用:变量赋值给另外一个对象、del显示删除一个变量、引用离开了它的作用范围、对象被从一个窗口对象中移除、窗口对象本身被销毁 7、异常处理 #try-except-else语句,else 子句在try 代码块运行无误时执行 #异常处理最适用的场合,是在没有合适的函数处理异常状况的时候 try: fobj=open(fname,'r') except IOError,e: print "file open error: ",e else: for eachLine in fobj: print eachLine, fobj.close() 8、所有的Python 对像都拥有三个特性:身份,类型和值。这三个特性在对象创建的时候就被赋值,除了值之外,其它两个特性都是只读的 9、布尔值 每个对象天生具有布尔 True 或 False 值。空对象、值为零的任何数字或者Null对象 None 的布尔值都是False 10、对象身份比较 >>> x=1.0 >>> y=1.0 >>> x is y False >>> x is not y True >>> id(x) 19094432 >>> id(y) 19094416 比较两个变量是否指向同一个对象,但是整数和字符串有缓存机制,有可能指向同一个对象 11、cmp() 内建函数cmp()用于比较两个对象obj1 和obj2, 如果obj1 小于obj2, 则返回一个负整 数,如果obj1 大于obj2 则返回一个正整数, 如果obj1 等于obj2, 则返回0。它的行为非常 类似于C 语言的strcmp()函数。比较是在对象之间进行的,不管是标准类型对象还是用户自定 义对象。如果是用户自定义对象, cmp()会调用该类的特殊方法__cmp__()。 12、str()和repr() str()函数得到的字符串可读性好, 而repr()函数得到的字符串通常可以用来重新获得该对象, 通常情况下 obj == eval(repr(obj)) 这个等式是成立的。 str()得到的字符串对人比较友好,而repr()得到的字符串对python比较友好 13、isinstance()和type(),主要体现的是代码的优化 from types import * def displayNumType0(num) : print num,'is', if type(num) is IntType : print 'an integer' elif type(num) is LongType : print 'a long' elif type(num) is FloatType : print 'a float' elif type(num) is ComplexType : print 'a complex' else : print 'not a number at all !!!' def displayNumType1(num): print num, 'is', if(isinstance(num,(int,long,float,complex))): print 'a number of type: ',type(num).__name__ else: print 'not a number at all !!!' 14、标准类型的分类 (1)存储类型 标量/原子类型: 数值(所有的数值类型),字符串(全部是文字) 容器类型: 列表、元组、字典 (2)更新类型 可变类型: 列表, 字典 不可变类型: 数字、字符串、元组 (3)访问模型 根据访问我们存储的数据的方式对数据类型进行分类。在访问模型中共有三种访问方式:直接存取,顺序,和映射。 直接访问: 数字 顺序访问: 字符串、列表、元组 映射访问: 字典 映射类型类似序列的索引属性,不过它的索引并不使用顺序的数字偏移量取值, 它的元素无序存放, 通过一个唯一的key 来访问, 这就是映射类型, 它容纳的是哈希键-值对的集合。 汇总: 数据类型 存储模型 更新模型 访问模型 数字 Scalar 不可更改 直接访问 字符串 Scalar 不可更改 顺序访问 列表 Container 可更改 顺序访问 元组 Container 不可更改 顺序访问 字典 Container 可更改 映射访问 15、不同数据类型之间的运算,在运算之前,要将两个操作数转换为同一数据类型,数字强制类型转换原则是整数转换为浮点数, 非复数转换为复数。 16、python除法: (1)传统除法,若操作数是整数,则进行取整操作,若操作数是浮点数,则执行真正的除法 >>> 1/2 0 >>> 1.0/2 0.5 (2)真正的除法,未来的除法,不管操作数是什么类型,都要进行真正的除法运算 >>> from __future__ import division >>> 1/2 0.5 >>> 1.0/2.0 0.5 (3)地板除,不管操作数是什么数据类型,都进行取整操作 >>> 1//2 0 >>> 1.0//2 0.0 17、工厂函数 工厂函数就是指这些内建函数都是类对象, 当你调用它们时,实际上是创建了一个类实例,有以下这些工厂函数: int(), long(), float(),complex(),bool() >>> int('F',16) 15 >>> int('15') 15 18、内建函数 (1)适用于所有数据类型的内建函数: abs(num):返回 num 的绝对值 coerce(num1, num2):将num1和num2转换为同一类型,然后以一个 元组的形式返回。 divmod(num1, num2):除法-取余运算的结合。返回一个元组(num1/num2,num1 %num2)。对浮点数和复数的商进行下舍入(复数仅取实数部分的商) pow(num1, num2, mod=1):取 num1 的 num2次方,如果提供 mod参数,则计算结果再对mod进行取余运算 round(flt, ndig=0):接受一个浮点数 flt 并对其四舍五入,保存 ndig位小数。若不提供ndig 参数,则默认小数点后0位。 (2)适用于整数的内建函数: hex(num) 将数字转换成十六进制数并以字符串形式返回 oct(num) 将数字转换成八进制数并以字符串形式返回 chr(num) 将ASCII值的数字转换成ASCII字符,范围只能是0 <= num <= 255。 ord(chr) 接受一个 ASCII 或 Unicode 字符(长度为1的字符串),返回相应的ASCII或Unicode 值。 unichr(num) 接受Unicode码值,返回 其对应的Unicode字符。所接受的码值范围依赖于你的Python是构建于UCS‐2还是UCS‐4。 19、布尔值 对于值为零的任何数字或空集(空列表、空元组和空字典等)在Python 中的布尔值都是False。 >>> bool('1') True >>> bool('0') True >>> bool('fdsafds') True >>> bool('') False >>> bool([]) False >>> bool([3]) True >>> bool(1) True >>> bool(0) False 20、数字类型相关模块 decimal: 十进制浮点运算类 Decimal array: 高效数值数组(字符,整数,浮点数等等) math/cmath: 标准C库数学运算函数。常规数学运算在match模块,复数运算在cmath模块 operator: 数字运算符的函数实现。比如 tor.sub(m,n)等价于 m - n random: 多种伪随机数生成器 21、随机数,要导入random模块 randrange(): 它接受和 range() 函数一样的参数, 随机返回range([start,]stop[,step])结果的一项 uniform(): 几乎和 randint()一样,不过它返回的是二者之间的一个浮点数(不包括范围上限)。 random(): 类似 uniform() 只不过下限恒等于0.0,上限恒等于1.0 choice(): 随机返回给定序列(关于序列,见第六章)的一个元素 示例: >>> import random >>> for i in range(5): print random.randrange(0,100), 1 58 77 38 3 >>> for i in range(5): print random.uniform(0,10), 7.26383692825 2.76070616182 7.37142561958 7.8026850248 4.7771524698 >>> for i in range(5): print random.random(), 0.232856863437 0.0784714114799 0.238714810514 0.0698641200863 0.386250556331 >>> for i in range(5): print random.choice([1,2,3,'4','5','suo']), 3 5 1 suo 4 22、成员关系操作符 (in, not in) 成员关系操作符使用来判断一个元素是否属于一个序列的,返回值为True或False 23、len()函数,可以得到序列长度 24、访问序列中的元素可以使用负索引,范围是 -1 到序列的负长度,-len(sequence), -len(sequence) <= index <= -1.正负索引的区别在于正索引以序列的开始为起点,负索引以序列的结束为起点 25、序列切片操作 >>> s = 'abcdefgh' >>> s[0:4] 'abcd' >>> s[1:5] 'bcde' >>> s[::-1] # 可以视作"翻转"操作 'hgfedcba' >>> s[::2] # 隔一个取一个的操作 'aceg' >>> s = 'abcde' >>> for i in [None] + range(-1, -len(s), -1): ... print s[:i] ... abcde abcd abc ab a 26、字符串、序列、元组类型转换 list(iter): 把可迭代对象转换为列表 str(obj): 把obj 对象转换成字符串(对象的字符串表示法) unicode(obj): 把对象转换成Unicode 字符串(使用默认编码),是str()函数的unicode版本 basestring(): 抽象工厂函数,其作用仅仅是为str 和unicode 函数提供父类,所以不能被 实例化,也不能被调用(详见第6.2 节) tuple(iter): 把一个可迭代对象转换成一个元组对象 一旦一个Python 的对象被建立,我们就不能更改其身份或类型了.如果你把一个列表对象传给list()函数,便会创建这个对象的一个浅拷贝,然后将其插入新的列表中。 所谓浅拷贝就是只拷贝了对对象的索引,而不是重新建立了一个对象!如果你想完全的拷贝一个对象(包括递归,如果你的对象是一个包含在容器中的容器),你需要用到深拷贝。 27、序列类型可用的内建函数 enumerate(iter): 接受一个可迭代对象作为参数,返回一个enumerate 对象(同时也是一个迭代器), 该对象生成由iter 每个元素的index 值和item 值组成的元组(PEP 279) len(seq): 返回seq 的长度 max(iter,key=None) max(arg0,arg1...,key=None): 返回iter 或(arg0,arg1,...)中的最大值,如果指定了key,这个key 必须是一个可以传给sort()方法的,用于比较的回调函数. min(iter, key=None) min(arg0, arg1.... key=None): 返回iter 里面的最小值;或者返回(arg0,arg2,...)里面的最小值;如果指定了key,这个key 必须是一个可以传给sort()方法的,用于比较的回调函数. reversed(seq): 接受一个序列作为参数,返回一个以逆序访问的迭代器(PEP 322) sorted(iter, func=None, key=None, reverse=False): 接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func,key 和reverse 的含义跟list.sort()内建函数的参数含义一样. sum(seq, init=0): 返回seq 和可选参数init 的总和, 效果等同于reduce(operator.add,seq,init) zip([it0, it1,... itN]): 返回一个列表,其第一个元素是it0,it1,...这些元素的第一个元素组成的一个元组,第二个...,类推. 28、字符串 Python 里面单引号和双引号的作用是相同的,Python 里面没有字符这个类型,而是用长度为1 的字符串来表示这个概念,字符串是不可变的,所以你不能仅仅删除一个字符串里的某个字符,你能做的是清空一个空字符串,或者是把剔除了不需要的部分后的字符串组合起来形成一个新串。 29、字符串模块 >>> import string >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> string.ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> string.atol('10') 10L 虽然对初学者来说string 模块的方式更便于理解,但出于性能方面的考虑, 我们还是建议你不要用string 模块。原因是Python 必须为每一个参加连接操作的字符串分配 新的内存,包括新产生的字符串。 30、字符串格式化 Python 支持两种格式的输入参数。第一种是元组,这基本上是一种的Cprintf()风格的转换参数集; Python 支持的第二种形式是字典形式.字典其实是一个哈希键-值对的集合。这种形式里面,key 是作为格式字符串出现,相对应的value 值作为参数在进行转化时提供给格式字符串. >>> dic={'key1':'suo','key2':'dai','key3':80} >>> '%(key1)s love %(key2)s %(key3)d years' % dic 'suo love dai 80 years' 格式字符串既可以跟print 语句一起用来向终端用户输出数据,又可以用来合并字符串形成新字符串,而且还可以直接显示到GUI(Graphical User Interface)界面上去. 31、原始字符串 在原始字符串里,所有的字符都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符 >>> import re >>> m=re.search(r'\\[rtfvn]',r'Hello World!\n') >>> if m is not None: m.group() '\\n' 32、Unicode 字符串操作符( u/U ) 它用来把标准字符串或者是包含Unicode 字符的字符串转换成完全地Unicode 字符串对象。 33、字符串内建函数 各种内建函数,参见API 34、字符串三引号 它允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符.三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的WYSIWYG(所见即所得)格式的。 >>> hi='''hi \n are you''' >>> hi 'hi \n are you' >>> print hi hi are you >>> 35、字符串不可变性 字符串是一种不可变数据类型,就是说它的值是不能被改变或修改的。这就意味着如果你想修改一个字符串,或者截取一个子串,或者在字符串的末尾连接另一个字符串等等,你必须新建一个字符串。 >>> s='xingruiping' >>> s[2]='K' Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> s[2]='K' TypeError: 'str' object does not support item assignment 36、Unicode字符串 ASCII码:str()和chr() UNICODE:unicode()和unichr() 程序中出现字符串时一定要加个前缀 u. 不要用 str()函数,用unicode()代替. 不要用过时的 string 模块 -- 如果传给它的是非ASCII 字符,它会把一切搞砸。 不到必须时不要在你的程序里面编解码 Unicod 字符.只在你要写入文件或数据库或者网络时,才调用encode()函数; 相应地,只在你需要把数据读回来的时候才调用decode()函数.