现在的位置: 首页 > 综合 > 正文

python学习笔记(1)

2013年06月11日 ⁄ 综合 ⁄ 共 7478字 ⁄ 字号 评论关闭
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()函数.

抱歉!评论已关闭.