首页 > 代码库 > 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.