Python变量和对象类型速记手册
变量和对象类型
Python中关于变量和对象类型有一些重要的概念:
Python中有几种主要的核心数据类型:
1 数值【不可变】
负数 | -x |
正数 | +x |
按位翻转 | ~x=-(x+1) |
绝对值 |
若x位复数,返回复数模 |
用x除以y,返回包含商和余数的tuple值(int(x/y),x%y) | divmod(x, y) |
x的y次幕(x ** y ) x % modulo |
pow(x ,y [,modulo]) 返回值类型与x同 |
复数 |
将x做实部,y做虚部创建复数 |
整数 |
将字符串和数字转换为整数,对浮点进行舍位而非舍入 long(x) 将字符串和数字转换为长整形 |
浮点数 |
将str和num转换为浮点对象 |
四舍五入,n为小数点位数 | round(x[,n]) |
进制转换 |
hex(x) 将整数或长整数转换为十六进制字符串 oct(x) 将整数或长整数转换为八进制字符串 |
平方根 | math.sqrt(math.pi*85) |
>= x 的最小整数 |
math.ceil(x) |
<= x 的最大整数 |
math.floor(x) |
对 x 朝向 0 取整 |
math.trunc(x) |
随机:数字生成 |
>>> random.random() #浮点数,x in the interval [0, 1) >>> random.getrandbits(16) #a python long int with k random bits 9213L >>> random.uniform(1,1000) #浮点数in the range [a, b) or [a, b] 400.88489201157114 >>> random.randint(1,1000) #整数random integer in range [a, b] 不推荐使用 817 >>> random.randrange(0,1001,2) #整数from range([start,] stop[, step]) 推荐使用 822 |
随机:序列操作sequences generate random permutation |
>>> random.choice([0,1,2,3]) #a random element >>> random.sample(xrange(10000000), 3) #unique random elements >>> random.shuffle(list) #洗牌,就地shuffle list,无返回值.可选参数random是一个返回[0.0, 1.0)间浮点数的无参函数名,默认为random.random. |
On the real line, there are functions to compute uniform, normal (Gaussian), lognormal, negative exponential, gamma, and beta distributions. For generating distributions of angles, the von Mises distribution is available. |
- 整型int
- 长整型long(无限精度)
- 浮点数float(双精度)
- 十进制数/小数decimal(固定精度浮点数)
- 复数complex
- 分数fraction
2 序列【有序】【索引:偏移量】
序列通用型操作 | 内置函数或表达式 |
合并 | ‘+’ 不允许+表达式中混合数字和字符串,使用'123'+str(9)或者int('123')+9 |
重复 | ‘*’ >>> print '----------------------------------------' >>> print '-'*40 |
索引(dictionary使用键) | seq[i]=seq[len(seq)-i],i是偏移量 |
切片 | seq[i:j:d](步长d=-1表示分片将会从右至左进行,实际效果就是反转序列) 将列表片段重新赋值 s[i :j ] = r 删除列表中一个片段 del s[i :j ] |
求长度(dictionary,set支持) | len(seq) |
单个最大/最小值 | max(seq),min(seq) |
每项最大/最小值组成的序列 | max(seq[,…]),min(seq[,…]) |
迭代协议 | 列表解析,in成员关系测试,map内置函数以及sorted,sum,any,all调用等其他内置函数 |
sum,any,all | sum返回可迭代对象中所有数字的和,可迭代对象中的任何/全部元素为True,any/all内置函数返回True |
排序(dictionary返回键的列表,set支持,tuple不支持) | sorted(seq) t = tuple(sorted(list(t))) 操作sorted(seq)返回对象;方法seq.sort()(tuple不支持)排序后不返回对象 |
从属关系(dictionary,set支持) | x in seq, x not in seq |
迭代 | 遍历访问元素:for x in seq: 遍历访问元素和索引:for index, item in enumerate(sequence): 使用range来产生索引:range(2,9,2) >>> range(0,10) 同时遍历多个序列:zip(L1,L2)/map(None,L1,L2) zip函数转置二维列表: >>> l = [[1, 2, 3], [4, 5, 6]] >>> zip(*l) [(1, 4), (2, 5), (3, 6)] |
列表解析(dictionary,set支持) |
列表解析替代嵌套循环:for循环和列表解析(通常比对应的for循环运行得更快)都是通用迭代工具,都能工作于遵守迭代协议的任意对象(可遍历对象,包括可自逐行读取的文件) >>> M = [[1,2,3],[4,5,6],[7,8,9]] >>> squares = [x**2 for x in [1,2,3,4,5]] >>> squares [1, 4, 9, 16, 25] 列表解析也可用于元组的转换: >>> T = (1,2,3,4,5) >>> L = [x+20 for x in T] >>> L [21, 22, 23, 24, 25] >>> [line.upper() for line in open('script1.py')] |
map调用 | >>> map(str.upper,open('script1.py')) #对可迭代对象每个元素都应用一个函数调用 |
2.1 字符串string【同构】【不可变】
字符的有序集合(虽然元素间没有分隔符) |
>>> set('abcde') |
‘\0’不会中断字符串 |
>>> s = "a\0b\tc\c" |
raw字符串 | r’\temp\spam’ |
类型方法 | find(s),isdigit(),isalpha() upper(),lower(),replace(s0,s1),split(‘’),rstrip() |
不可变:模拟改变元组 |
1 合并、分片、索引 3 转化为可变对象 |
字符串格式化 | s % type %[(name)][flags][width][.precision]code %[(键)][左对齐(-)正负号(+)补零(0)][整体宽度][.小数位数]code 基于元组的格式化:'%s is %d years old' % (name, age) 基于字典的格式化:'%s(age)d %(food)s' % vars() %s 任何对象的字符串表达(使用str) %r 任何对象的字符串表达(使用repr) %% 常量% |
正则表达式(使用模式定义字符串) 实现更多搜索,分割,替换 |
>>> import re |
对象的字符串表达 | str(o):string used by print(user-friendly) 打印(用户友好) repr(o):as-code string used by echoes 交互式回显 |
2.2 unicode字符串 【同构】【不可变】 u’spam’
支持所有的字符串操作 |
2.3 元组tuple【异构】【不可变】 t = (1,2,’3’)
不可变 |
元组的不可变性只适用于元组本身的顶层结构而并非其内容: >>>T = (1,[2,3],4) >>> T[1] = 'spam' >>> T[1][0] = ‘spam’ >>> T (1, ['spam', 3], 4) |
类似“常数”声明:提供完整性约束 | 如果在程序中以元组的形式传递一个对象的集合,可以确保元组在程序中不会被另一个引用修改,而列表就没有这样的保证了。(利于编写大型程序) 与其他语言中的const概念不同,在Python中其是与对象相结合的(元组对象本身的不可变性),而不是变量。 |
2.4 列表list【异构】【可变】 l = [1,2,’3’]
3 映射【无序】【索引:键】
3.1 字典dictionary【异构】【可变】 d = {1:’I’,2:’Love’,’3’:'Python’}
可变 | 对新的字典的键赋值,会创建该键 x[key] = value |
键 |
Python的dict实现,其实就是一个hash map,因此要求Key是hashable的 键为不可变对象:数字和字符串,只包括(像数字和字符串这样的)不可变参数的元组,才可以作为字典中有效的键。大多数Python对象可以作为键;但它们必须是可哈希的对象。 像列表和字典这样的可变类型,由于它们不是可哈希的,所以不能作为键。 也有一些可变对象(很少)是可哈希的。 |
唯一 | 一键对应多个值是不允许的 |
获取元素列表 | keys()返回键的列表,values()返回值的列表,items()返回tuples的列表 |
获取元素迭代器 | iteritems(), iterkeys(), 和itervalues()这些函数与返回列表的对应方法相似,只是它们返回惰性赋值的迭代器,所以节省内存。 |
for k in d: 等价于 for k in d.keys(): | |
'+'有序合并操作失效 |
update(x2) 用字典x2中的键/值对添加到原字典。重复键所对应的原有条目的值将被新键所对应的值所覆盖。 |
其他类型方法 |
get(x[,y]) 返回键x对应的值。若未找到返回default的值(注意,参数default的默认值为None)。get()方法和键查找(key-lookup)操作符( [ ] )相似,不同的是它允许你为不存在的键提供默认值。如果该键不存在,也未给出它的默认值,则返回None。此方法比采用键查找(key-lookup)更灵活,因为你不必担心因键不存在而引发异常。 pop(key) ,del d[key] clear() 删除词典的所有条目。 |
构造 |
D0 = {'name' = 'Bob', 'age' = 42} D1 = dict(name = 'Bob', age = 42) D2 = dict.fromkeys(seq, val=None) 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(如果不提供此值,则默认为None) D3 = dict(zip(keylist,vallist)) |
拷贝 |
copy() 浅拷贝:返回字典的高层结构的拷贝,但不复制嵌入结构,而复制那些结构的引用。
|
避免获取不存在的字典键错误 | if d.has_keys(k)(最好使用if k in d)测试 get方法为不存在的键提供默认值 d.get(key,defaultval) D. get ( "Newton" , "unknown" ) # = ' unknown ' try:XXX except KeyError:XXX 语句捕获修复异常等 |
4 扩展
4.1 集合set【无序】【异构】【可变】s = set([1,2,’3’]) <=set(t|l|d)
差集 | ‘-’ |
并集 | ‘|’ |
交集 | ‘&’ |
4.2 文件file f = open(‘examples/data.txt’,’w’)
open参数 | open(name[, mode[, buffering]]) -> file object 文件名: 在Python中,斜杠’/’永远都是正确的,即使是在Windows环境下。所有现代的操作系统(甚至Windows!)使用Unicode编码方式来存储文件名和目录名。 处理模式字符串: 'r', 'w' or 'a' for reading (default),writing or appending. 写或追加模式下若文件不存在则创建它。 字符串尾部加’b’可以进行二进制数据处理(行末转换关闭);加‘+’同时为输入输出打开;加‘U’实现input file的universal newline support(不能与'w' or '+'同时使用) 控制输出缓存,0 代表无缓存(写入方法调用时立即传给外部文件)0 means unbuffered, 1 means line buffered, and larger numbers specify the buffer size. |
||||||
文件迭代器 | 从文本文件中读取文字行的最佳方式是根本不用读取文件:使用迭代器逐行读取(让for循环在每轮自动调用next从而前进到下一行) for line in open('test.txt'):print line |
||||||
常用文件读操作 |
返回空字符串:文件底部; 返回包含新行符的字符串:空行 |
||||||
常用文件写操作 |
写入方法不添加行终止符 |
||||||
重定向输出流 |
import sys 暂时重定向 log = open('log.txt', 'a') # 2.6 print >> sys.stderr, 'Bad'*8 |
||||||
|
|||||||
字节字符串 | 从文件读取的数据回到脚本时是一个字符串 写文件时使用转换工具把对象转化为字符串(print不用) 1 eval能够吧字符串当做可执行代码 >>>eval['[1,2,3]'] [1,2,3] 2 pickle模块处理一般对象的存储 >>>import pickle >>>pickle.dump(D,ofie) >>>ofile.close() >>>E = pickle.load(ifile) 3 struct模块处理文件中的二进制数据 |
4.3 字节Byte
4.4 布尔型bool
0,'',(),[],{},None |
false |
'string',>1,<-1 |
true |
4.5 其他
关于内置数据类型,<<深入 Python 3>> Chapter 2 内置数据类型 Chapter 4 字符串 Chapter 11 文件讲的很到位,可供拾遗。此外,映射和集合类型也讲得很好。
记住,寻求帮助最好的办法是dir(object)和help(object.method)。
5.补充介绍
集合set,十进制数decimal,布尔值bool,占位符None
5.1集合set
set(集合)是非常有用的数据类型,可以用来处理集合类型的数据。最开始在Python 2.3引入,从Python 2.4开始变为内置类型(不需导入模块)。
什么是集合?无序、唯一。如果你想要检测一个值是否在集合中,sets在这一点非常的高效,比list快多了。
和之前所见的数据类型不一样(和file一样),没有特定的常量语法创建set对象,需要使用set的构造函数,生成一个set可以从序列(string、list、tuple)甚至映射(dictionary)直接生成。
set支持一般的数学集合操作,处理较大的数据集合时是很方便的。
>>>X = set("spam") #make 2 sets out of sequences
>>>Y = set(['h','a'])
>>>Y.add('m') #元素唯一性
>>>Y.add('m')
>>>X,Y
(set(['a','p','s','m']),set(['h','a','m']))
>>>X & Y #Intersection 并集
set(['a','m'])
>>>X | Y #Union 交集
set(['a','p','s','h','m'])
>>>X - Y #Difference 差集
set(['p','s'])
如果直接使用dictionary构造,则会取出键值作为集合的元素,如果想将字典的值生成集合怎么办呢?
>>> a = {3:'c',2:'b',1:'a'}
>>> print a
{1: 'a', 2: 'b', 3: 'c'}
>>> print sorted(a)
[1, 2, 3]
>>> b = set(a)
>>> print b
set([1, 2, 3])
>>> print sorted(b)
[1, 2, 3]
>>> c = set(a.values())
>>> print c
set(['a', 'c', 'b'])
>>> print sorted(c)
['a', 'b', 'c']
5.2 布尔型bool
Python2.3引入了明确的布尔数据类型bool,其值为True和False,而且True和False是预先定义的内置变量名。在内部,内置变量名True和False是bool的实例,实际上仅仅是内置的int的子类。
True和False的行为和整数1和0是一样的,除了他们有特定的逻辑打印形式(bool重新定义了str和repr的字符串格式),也就是说,True仅仅是定制了显示格式的整数1,在Python中True+3=4!
5.3 占位符None
Python长期以为一直支持特殊的占位符对象None:
>>> X = None #None placeholder
>>> X
>>> print X
None
>>> L = [None]*10
>>> L
[None, None, None, None, None, None, None, None, None, None]
>>> type(L) #Types
<type 'list'>
>>> type(type(L)) #Even types are objects
<type 'type'>
5.4 十进制数decimal(固定精度浮点数)
首先需要
>>> import decimal
和普通浮点数的区别:
>>> d = 3.141
>>> d + 1
4.141
>>> d + 1.111111
4.252111
>>> d + 1.1111111
4.2521111000000005
>>> d = decimal.Decimal('3.141')
>>> d + 1
Decimal('4.141')
>>> d + 1.111111
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Decimal' and 'float'
>>> d + decimal.Decimal('1.1111111')
Decimal('4.2521111')
更多数据结构,请查阅官方文档
http://docs.python.org/2/tutorial/datastructures.html
其他的Python要点
性能优化 | Python中一个主要的原则是:首先为了简单和可读性去编写代码,在程序运行后,并证明了确实有必要考虑性能后,再考虑该问题(time,timeit,profile模块)。更多情况是代码本身就已经足够快了。 |
面向对象 |
基本概念一样,this由代替self, 而且这个名字不一定要写成self,任何名字都可以,这也带来了一个缺点,你必须在形参里面指定,调用函数时不用传递该参数。 |
存储器 |
cPickle和pickle是叫做存储器的重要模块,可以非常方便地将一个对象存储到一个文件,然后再取存储从文件中取出来pickle.dump(object, file object),构造对象时,pickle.load(file object) [储存、取存储] |
异常 |
raise,except,try...finally |
系统库 | sys模块和os模块有很多强大功能,比如说os.system(命令)可用于执行shell命令 |
lambda形式 |
lambda语句被用来创建新的函数对象,并且在运行时返回它们。lambda语句用>来创建函数对象。本质上,lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。 注意,即便是print语句也不能用在lambda形式中,只能使用表达式。 |
Python语句
random模块高级用法:
distributions on the real line: |
uniform(self, a, b) | Get a random number in the range [a, b) or [a, b]. triangular(self, low=0.0, high=1.0, mode=None) gauss(self, mu, sigma) normalvariate(self, mu, sigma) lognormvariate(self, mu, sigma) expovariate(self, lambd) gammavariate(self, alpha, beta) betavariate(self, alpha, beta) paretovariate(self, alpha) weibullvariate(self, alpha, beta) vonmisesvariate(self, mu, kappa) |
internal state |
seed(self, a=None) setstate(self, state) getstate(self) jumpahead(self, n) |