首页 > 代码库 > python学习手册——1介绍python对象类型
python学习手册——1介绍python对象类型
在python ,数据以对象的形式出现——无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象。尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合、
由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型。
python程序可以分解成模块,语句,表达式以及对象,如下所示:
1.程序由模块构成
2.模块包含语句
3.语句包含表达式
4.表达式建立并处理对象
为什么使用内置类型
1.内置对象使程序更容易编写。
2.内置对象是扩展的组件。
3.内置对象往往比定制的数据结构更有效率。
4.内置对象是语言的标准的一部分。
python 的核心数据类型
对象类型 例子 常量/创建
数字 1234,3.1415,3+4j,Decimal
字符串 ‘spam‘,"guido‘s",b‘a\xolc‘
列表 [1,[2,‘three‘],4]
字典 {‘food‘:‘spam‘,‘taste‘:‘yum‘}
元组 (1,‘spam‘,4,‘U‘)
文件 myfile=open(‘eggs‘,‘r‘)
集合 set(‘abc‘),{‘a‘,‘b‘,‘c‘}
其他类型 类型,NONE,布尔型
编程单元类型 函数,模块,类
与实现相关的类型 编译的代码堆栈跟踪
数字:
python的基本数字类型还是相当基本的。python的数字支持一般的数学运算。例如,加号(+)代表加法,星号(*)表示乘法,双星号(**)表示乘方。
>>> 123+222 345 >>> 2.65*4 10.6 >>> 2**100 1267650600228229401496703205376L
除了表达式,和python一起分发的还有一些常用的数学模块,模块只不过是我们导入以供使用的一些额外工具包。
>>> import math >>> math.pi 3.141592653589793 >>> math.sqrt(85) 9.219544457292887
math模块包括更高级的数学工具,如函数,而random模块可以作为随即数字的生成器和随机选择器。
>>> import random >>> random.random() 0.30460311868409107 >>> random.choice([1,2,3,4]) 3 >>> random.choice([1,2,4,5]) 5
字符串:
序列的操作
作为序列,字符串支持假设其中各个元素包含位置顺序的操作。例如,如果我们有一个含有四个字符的字符串,我们通过内置的len函数验证其长度并通过索引操作得到其各个元素。(python区分大小写)
>>> S='spam' >>> len(s) Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> len(s) NameError: name 's' is not defined >>> len(S) 4 >>> S[0] 's' >>> S[1] 'p'
在python中,索引是按照是从最前面的偏移量进行编码的,也就是从0开始,第一项索引为0,第二项索引为1,以此类推。
注意我们在这里是如何把字符串赋给一个名为S的变量的。但是,Python变量不需要提前声明。当给一个变量赋值的时候就创建了它,可能赋的是任何类型的对象,并且当变量出现在一个表达式中的时候,,就会用其值替换它。
在pythonk ,我们能够反向索引,从最后一个开始
>>> S[-1] 'm' >>> S[-2] 'a' >>> S[len(S)-2] 'a'
值得注意的是,我们能够在方括号中使用任意表达式,而不仅仅是使用数字常量——只要python需要一个值,我们可以使用一个常量,一个变量或任意表达式。python的语法在这方面是完全通用的。
除了能简单地从位置进去索引,序列也支持一种所谓分片的操作,这是一种一步就能够提取整个分片的方法。例如:
>>> S 'spam' >>> S[1:3] 'pa'
它们的一般形式为X[I:J],表示“取出在X中从偏移量为I,直到但不包括偏移量为J的内容“。
在一个分片中,左边界默认为0,并且右边界默认为分片序列的长度。 这引入了一些常用法的变体。
>>> S[1:] 'pam' >>> S[0:3] 'spa' >>> S[:3] 'spa' >>> S[:] 'spam'
最后,作为一个序列,字符串也支持使用加号进行合并:
</pre><pre name="code" class="python">>>> S 'spam' >>> S+'XYZ' 'spamXYZ' >>> S*8 'spamspamspamspamspamspamspamspam'
注意加号:对于数字来说是加法,对于字符串为合并。
不可变性
注意:在这前的例子中,没能通过任何操作对原始的字符串进行改变。每个字符串都被定义为生成新的字符串作为其结果,因为字符串中python的具有不可变性——在创建后就不能就地改变。
>>> S 'spam' >>> S[0]='Z' Traceback (most recent call last): File "<pyshell#36>", line 1, in <module> S[0]='Z' TypeError: 'str' object does not support item assignment >>> S='Z'+S[1:] >>> S 'Zpam'
python中的其他序列中也会工作,包括列表和元组。尽管这样,除了一般的序列操作,字符串还有独有的一些操作为方法存在(对象函数)
例如,字符串的find方法是一个基本的子字符串查找的操作(它将返回一个传入子字符串的偏移量,或者没有找到的情况下返回-1),而字符串的replace方法将会对全局进去搜索和替换。
>>> S.find('pa') 1 >>> S 'Zpam' >>> S.replace('pa','xyz') 'Zxyzm' >>> S 'Zpam'
尽管这些字符串方法的命名有改变的含义,但在这里我们都不会改变原始的字符串,而是会创建一个新的字符串作为结果——因为字符串具有不可变性,我们必须这样做。字符串方法将是pythonk中文本处理的头号工具。其他的方法还能够实现通过分隔符将字符串拆分为子字符串,大小写变换,测试字符串的内容,去掉字符串后的空格字符。
>>> line='aaa,bbb,cccc,dd' >>> line.split(',') ['aaa', 'bbb', 'cccc', 'dd'] >>> line 'aaa,bbb,cccc,dd' >>> s='spam' >>> s.upper() 'SPAM'
>>> s.isalpha() True >>> line='aaa,bbb,ccc,dd\n' >>> line=line.rstrip() >>> line 'aaa,bbb,ccc,dd'
>>> '%s,eggs,and%s'%('spam','SPAM!') 'spam,eggs,andSPAM!' >>> '{0},eggs,and{1}'.format('spam','SPAM!') 'spam,eggs,andSPAM!'
寻求帮助:
>>> dir(s) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
dir函数简单地给出了方法的名称。要查询它们是做什么的,你可以传递给help函数。
>>> help(s.replace) Help on built-in function replace: replace(...) S.replace(old, new[, count]) -> string Return a copy of string S with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.