【Python2】03、Python对象

2023-01-31 02:01:59 python 对象 python2

一、Python对象的相关术语

      python中一切皆对象,Python程序中保存的所有数据都是围绕对象这个概念展开的;所有的对象都是由类实例化而来的,只不过这些类有些是python内置的类;例如,整数和浮点数,字符串都是由python内置的类实例化而来的。除此之外用户还可以自定义类型,就是类。


python程序中存储的所有数据都是对象

每个对象都有一个身份、一个类型和一个值

         例如,school=“MaGe linux”会以“MaGe Linux”创建一个字符串对象,其身份是指向它在内存中所处位置的指针(其在内存中的地址),而school就是引用这个具体位置的名称

对象的类型也称对象的类别,用于描述对象的内部表示及它支持的方法和操作

创建特定类型的对象时,有时也将该对象称为该类型的实例

class:自定义类型

type:内置类型

instance:实例化

实例被创建后,其身份和类型就不可改变

       如对象值是可修改的,则称为可变对象

       如果对象的值不可修改,则称为不可变对象

如果某个对象包含对其它对象的引用,则将其称为容器


大多数对象都拥有大量特有的数据属性和方法

类=数据(变量)+方法(函数)

       属性:与对象相关的值;就是类实例化为对象时可以为内部的变量赋值,对象内部可用变量名就称之为对象的属性

       方法:被调用时将在对象上执行某些操作的函数

       使用点(.)运算符可以访问属性和方法

In [1]: name="xiejun"      #name是引用内存中的地址的名称

In [2]: id(name)
Out[2]: 28642832           #身份就是内存中的地址

In [3]: type(name)
Out[3]: str                #类型也就是类

In [4]: str.    
str.capitalize  str.fORMat      str.isupper     str.rfind       str.startswith
str.center      str.index       str.join        str.rindex      str.strip
str.count       str.isalnum     str.ljust       str.rjust       str.swapcase
str.decode      str.isalpha     str.lower       str.rpartition  str.title
str.encode      str.isdigit     str.lstrip      str.rsplit      str.translate
str.endswith    str.islower     str.mro         str.rstrip      str.upper
str.expandtabs  str.isspace     str.partition   str.split       str.zfill
str.find        str.istitle     str.replace     str.splitlines


Python内置函数id()可返回一个对象的身份,即该对象在内存中的位置

is运算符用于比较两个对象的身份

type()用于返回一个对象的类型

对象类型本身也是一个对象,称为对象的类

该对象的定义是唯一的,且对于某类型的所有实例都是相同的

所有类型对象都有一个指定的名称,可用于执行类型检查,


两个对象的比较:

1、值比较:对象中的数据是否相同

2、身份比较:两个变量名引用的是否为同一对象

3、类型比较:两个对象的类型是否相同

In [4]: num1=5

In [5]: num2=5

In [6]: num1==num2        #值相同
Out[6]: True

In [7]: num1 is num2      #值相同身份不一定相同,只是此处恰好相同
Out[7]: True

In [8]: type(num1) is type(num2)  #类型相同
Out[8]: True


二、Python对象类型

1、Python核心数据类型

类型分类                                 对象类型                                                               例子

数字                  int,long(长×××),foloat,complex(复数),bool(布尔值)        3077, 3.14, 300000

字符                                  str,unicode,                                             ‘mageedu.com’, “spam”

列表                         [‘one’, ‘two’, ‘three’]

字典                        {‘course’:’linux’, ‘tutor’:’mage’}

元组                        (32, ‘spam’, ‘eggs’)

文件                         myFile=open(‘/tmp/tfile’,’r’)

集合                         set(‘abc’), frozenset(不可变类型)                              {‘a’, ‘b’, ‘c’}

其它类型                  类类型、None(空)、bool(布尔型)

编程单元类型            函数、模块、类

与实现相关的类型      编译的代码堆栈跟踪

其它文件类型工具:pipes(管道),fifos(先进先出管道),Sockets


2、类型转换

 1)使用内置函数:           #显示转换

             str(),repr()精确值或format()转换为特定格式:将非字符型数据转换为字符串

           int():转换为整数

             float():转换为浮点数

             list():将字符串转换为列表

             tuple():将字符串转换为元祖

             set():将字符串转为集合

             frozenset():将字符串转换为不可变集合

             dict(d):创建字典;d必须元素为键值对的元祖的列表

             chr():将整数转换为字符

              ord():将字符转换为整数值

             hex():将整数转换为十六制字符串

              bin():二进制

              oct():八进制

In [20]: l1="xie jun"

In [21]: type(l1)
Out[21]: str

In [22]: l2=list(l1)

In [23]: type(l2)
Out[23]: list

In [24]: print l2
['x', 'i', 'e', ' ', 'j', 'u', 'n']

In [25]: l3=12345

In [26]: type(l3)
Out[26]: int

In [27]: l4=list(l3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-da565bf35804> in <module>()
----> 1 l4=list(l3)

TypeError: 'int' object is not iterable

In [28]:


In [36]: d1=dict([("x",1),("y",2)])     # d必须是元素为键值对的元祖的列表   

In [37]: d1
Out[37]: {'x': 1, 'y': 2}


3、数字类型

python的数字字面量

布尔型:True,False    1,0

整数:

浮点数:

复数:


注意:

       字面量是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值,如:int a=123这里的a为左值,123为右值。
常量和变量都属于变量,只不过常量是赋过值后不能再改变的变量,而普通的变量可以再进行赋值操作

例如:

int a;               #a变量
const int b=10;              #b为常量,10为字面量
string str="hello world";                #str为变量,hello world为也字面量


数字类型操作

Python使用5种数字类型:布尔型、整型、长整型、浮点型和复数,所有数字类型均为不可变

数字操作:wKioL1fWJSejqZDOAAB5a6Xg5Fw991.png


比较运算:wKiom1fWJSiRYS2AAABmTJWj82Y353.png

In [7]: 3<<3          #就是在用二进制表示向左移动3位,加3个0
Out[7]: 24

In [8]: 24>>3         #就是在用二进制表示向向移动3位,去掉前3位,剩下2位就是2**0+2**1=3
Out[8]: 3

In [9]: 9<<3
Out[9]: 72

In [10]: 9>>3
Out[10]: 1

In [11]: 10>>3
Out[11]: 1

In [12]: 20>>3
Out[12]: 2

In [14]: 56>>3
Out[14]: 7
 
In [15]: import math            #实现高级算计运算的库

In [16]: math.
math.acos       math.cos        math.factorial  math.ldexp      math.sin
math.acosh      math.cosh       math.floor      math.lgamma     math.sinh
math.asin       math.degrees    math.fmod       math.log        math.sqrt
math.asinh      math.e          math.frexp      math.log10      math.tan
math.atan       math.erf        math.fsum       math.log1p      math.tanh
math.atan2      math.erfc       math.gamma      math.modf       math.trunc
math.atanh      math.exp        math.hypot      math.pi         
math.ceil       math.expm1      math.isinf      math.pow        
math.copysign   math.fabs       math.isnan      math.radians    

In [16]: math.pi
Out[16]: 3.141592653589793

In [17]: math.sqrt
Out[17]: <function math.sqrt>

In [18]: math.sqrt(4)          #开平方
Out[18]: 2.0

 
In [22]: math.pow(2,4)          #平方
Out[22]: 16.0


4、序列类型

序列表示索引为非负整数的有序对象集合,包括字符串、列表和元组

字符串字面量:把文本放入单引号(必须在同一行) ,双引号(必须在同一行),三引号(跨行)中;

       字符串是字符的

       列表和元组是任意Python对象的序列

字符和元组属于不可变序列,而列表则支持插入、删除和替换元素

所有序列都支持迭代

如果要使用unicode编码,则在字符之前使用字符u进行标识,如u“magedu”

文档字符串:模块、类或函数的第一条语句是一个字符串的话,该字符串就是就成为文档字符串,可以使用__doc__引用。

In [24]: str1="magedu"

In [25]: type(str1)
Out[25]: str

In [26]: str2=u"magedu"      #3.0的Python则不用加u

In [27]: type(str2)
Out[27]: unicode


In [28]: def printName():
   ....:     "test function"
   ....:     print "hello magedu.com"
   ....: 

In [31]: printName
Out[31]: <function __main__.printName>

In [32]: printName()
hello magedu.com

In [33]: printName().
.Xauthority    .bash_loGout   .bashrc        .ipython/      .tcshrc        
.bash_history  .bash_profile  .cshrc         .lesshst       .viminfo       

In [33]: printName().__doc__            #调用函数
hello magedu.com

In [34]: printName.__doc__              #引用函数对象
Out[34]: 'test function'


适用于所有序列的操作和方法:

s[i]: 索引运算符

s[i:j]为切片运算符

s[i:j:stride]为扩展切片运算符

min(s)和max(s)只适用于能够对元素排序的序列

sum(s)只适用于数字序列 

wKioL1fWMU3jXNeBAAC4aVUH9cg377.png


适用于字符串的的操作:

Python 2提供两种字符串对象类型

      字节字符串: 字节(8bit数据)序列

       Unicode字符串: Unicode字符(16bit数据)序列

                  Python可以使用32 bit整数保存Unicode字符,但此为可选特性

wKioL1fWRTGCmonoAABdKcolRMc574.png

In [51]: name="xiejun"

In [52]: name.
name.capitalize  name.format      name.isupper     name.rindex      name.strip
name.center      name.index       name.join        name.rjust       name.swapcase
name.count       name.isalnum     name.ljust       name.rpartition  name.title
name.decode      name.isalpha     name.lower       name.rsplit      name.translate
name.encode      name.isdigit     name.lstrip      name.rstrip      name.upper
name.endswith    name.islower     name.partition   name.split       name.zfill
name.expandtabs  name.isspace     name.replace     name.splitlines  
name.find        name.istitle     name.rfind       name.startswith  
    
In [52]: name.capitalize()
Out[52]: 'Xiejun'

In [56]: name.index("u")
Out[56]: 4


In [47]: l1=list("xiejun")

In [48]: l1
Out[48]: ['x', 'i', 'e', 'j', 'u', 'n']

In [49]: ''.join(l1)
Out[49]: 'xiejun'

In [50]: ';'.join(l1)
Out[50]: 'x;i;e;j;u;n'


适用于列表的操作:

       容器类型

       任意对象的有序集合,通过索引访问其中的元素,可变对象,支持异构,任意嵌套

      支持在原处修改,

wKioL1fWQ1_jh-noAABfd5E9sLI371.png

In [65]: l1=[1,2,3,4,5]

In [66]: l1[0]
Out[66]: 1

In [68]: l1[1:3]
Out[68]: [2, 3]

In [69]: l1[1:3]=''

In [70]: l1
Out[70]: [1, 4, 5]

In [72]: l1[:]=''

In [73]: l1
Out[73]: []


可用于列表的方法:

        list(s)可将任意可迭代类型转换为列表,而如果s已经是一个列表,则该函数构造的新列表是s的一个浅复制

wKiom1fWQ1uyO7uNAACNXVz6HI0073.png

l1+l2:是合并2个列表,返回一个新的列表,不会修改原列表

l1*N:把l1重复N次,返回一个新列表

in:成员判定符,

not in:

列表解析:[ ]

In [76]: l1=[1,23,"xj"]

In [77]: l1*2
Out[77]: [1, 23, 'xj', 1, 23, 'xj']

In [78]: 2 in l1
Out[78]: False

In [79]: 23 in l1
Out[79]: True

In [80]: 23 not in l1
Out[80]: False

In [81]: 2 not in l1
Out[81]: True

注意列表复制时:

In [1]: l1=[1,2,3,4]

In [2]: l2=l1               #浅复制

In [4]: print l2
[1, 2, 3, 4]

In [5]: l1.
l1.append   l1.extend   l1.insert   l1.remove   l1.sort
l1.count    l1.index    l1.pop      l1.reverse  

In [5]: l1.append(4)

In [6]: l1
Out[6]: [1, 2, 3, 4, 4]

In [7]: l2
Out[7]: [1, 2, 3, 4, 4]

In [8]: id(l1)
Out[8]: 19737488

In [9]: id(l2)
Out[9]: 19737488

In [10]: l3=l1[:]          #深复制

In [11]: l3
Out[11]: [1, 2, 3, 4, 4]

In [12]: id(l3)
Out[12]: 19724480

In [15]: l1.append(6)

In [16]: l1
Out[16]: [1, 2, 3, 4, 4, 6]

In [17]: l2
Out[17]: [1, 2, 3, 4, 4, 6]

In [18]: l3
Out[18]: [1, 2, 3, 4, 4]



In [3]: import copy

In [4]: copy.
copy.Error           copy.deepcopy        copy.name
copy.PyStringMap     copy.dispatch_table  copy.t
copy.copy            copy.error           copy.weakref



In [5]: l1=[1,2,3]

In [6]: id(l1)
Out[6]: 36145056

In [7]: l2=copy.deepcopy(l1)       #深复制

In [8]: l2
Out[8]: [1, 2, 3]

In [9]: id(l2)
Out[9]: 37443344


元组:

In [26]: t2=1,2,3      #括号可省略,但特殊情况下必须使用括号,建议不省略

In [27]: type(t2)
Out[27]: tuple

In [28]: t3="1",2

In [29]: type(t3)
Out[29]: tuple

注意:虽然元祖是不可变类型(不支持原处修改),但如果元祖内嵌套了可变类型的元素,那么此元素的修改不会返回新元祖(支持原处修改)


序列操作总结:

wKiom1fWQ1qgLEHFAAEFj0-hmyc085.png


5、映射类型

字典在其它编程语言中又称作关联数组或散列表

通过键实现元素存取,无序集合,可变类型容器,长度可变,支持异构、嵌套

格式:{key1:value1,key2:value2,...}

           {}:空字典

映射类型表示一个任意对象的集合,而且可以通过另一个几乎是任意键值的集合进行索引

与序列不同,映射是无序的,它通过键进行索引

       任何不可变对象都可用作字典的键,如字符串、数字、元组等

       包含可变对象的列表、字典和元组不能用作键

m[k]运算符用于选择映射对象中的一项,其中“k”是一个键值

       引用不存在的键会引发KeyError异常

m.iteritems():返回一个迭代器,m.next()的结果是键值对的元祖

m.itervalues():返回一个迭代器,m.next()的结果是值

m.iterkeys():返回一个迭代器,m.next()的结果是键

m.next():遍历迭代器对象


m.viewitems()

m.viewkeys()

m.viewvalues()


zip()

In [43]: zip
Out[43]: <function zip>

In [45]: zip('abc',"123")
Out[45]: [('a', '1'), ('b', '2'), ('c', '3')]

In [46]: dict(zip('abc','123'))
Out[46]: {'a': '1', 'b': '2', 'c': '3'}


字典的方法和操作:wKioL1fXl1KQc_clAANH7R6H38E644.png


6、集合类型

无序排列,可哈希,支持集合关系测试,不支持索引,元素获取、切片

没有特定语法格式:只能通过工厂函数创建

In [48]: s1=set()

In [49]: s1
Out[49]: set()

In [50]: print s1
set([])

In [51]: s2=set(123)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-51-a88bf1ca99f8> in <module>()
----> 1 s2=set(123)

TypeError: 'int' object is not iterable

In [52]: s2=set(1,2,3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-52-2a6eb463Da1e> in <module>()
----> 1 s2=set(1,2,3)

TypeError: set expected at most 1 arguments, got 3

In [53]: s2=set([1,2,3])      #集合的元素要支持迭代的

In [54]: s2
Out[54]: {1, 2, 3}

In [55]: print s2
set([1, 2, 3])

In [56]: s3=set("xiejun")          

In [57]: s3
Out[57]: {'e', 'i', 'j', 'n', 'u', 'x'}

In [58]: print s3
set(['e', 'i', 'j', 'n', 'u', 'x'])

In [65]: s5=set(["Mon",'Tus'])

In [66]: s5
Out[66]: {'Mon', 'Tus'}

集合是唯一项的无序集

与序列不同,集合不提供索引或切片操作

与字典不同,集合不存在相关的键值

放入集合中的项目必须是不可变的

集合有两种类型:

        可变集合:set()

        不可变集合:frozenset()


集合类型的方法和操作:wKiom1fXmBLgBPPhAAG5Dz6zCLQ857.png


可变集合类型set的方法:

wKioL1fXmMbD8APfAAE8292ehZk684.png


三、其它总结

1、引用计数与垃圾收集

所有对象都有引用计数

        给对象分配一个新名称或将其放入一个容器中,其引用计数都会增加

        使用del语句或为变量名重新赋值时,对象的引用计数会减少

        sys.getrefcount()可以获得对象的当前引用计数

一个对象的引用计数器归零时,它将被垃圾收集机制回收


2、点号运算符

       属性:数据

                        返回一个数据,显示则要使用print语句

       方法:操作(),就是函数

                         调用,执行一段代码


括号:调用可调用对象(函数,类,对象中的方法)


3、如何获取使用帮助

获取对象支持使用的属性和方法:dir(),

某方法的具体使用帮助:help(),例如:help(list.pop),

获取可调用对象的文档字串:print obj.__doc__


4、容器、类型、对象

 1)容器类对象(列表,元祖,字典字面量)可以在不使用续航符的情况下分布于多行,最后一个元素的后面允许使用一个逗号

 2)列表和字典都支持两种类型的复制操作:浅复制和深复制,深复制可使用copy模块中的deepcopy()实现

 3)Python中的所有对象都是“第一类的”这意味着使用标识符命名的所有对象都有相同的状态,于是,能够命名的所有对象都可以直接当数据进行处理。

 4)所有序列都支持迭代

 5)所有序列都支持的操作和方法

        s[i]

        s[i:j]

        s[i:j:stride]

        len(s)

        min(s)

        max(s)

         sun(s)

          all(s)

          any(s)

         s1+s2

         s1*N

         obj in s1

         obj not in s1

 6)可变序列的操作

        s1[index]=value  元素赋值

        s1[i:j]=t    切片赋值

         s1[i:j:stride]=t 

        del s1[index]

        del s1[i:j]

         del s1[i:j:stride]

相关文章