2.1对象(Object)
对象是python语言中最基本的概念,在python中处理的每样东西都是对象
python中有许多内置对象可供编程者使用
数字、字符串、序列(列表、元组、字典、集合)、命令、函数等
非内置对象需要导入模块(package)才能使用
• 对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。
• ==比较操作符:用来比较判断两个对象的value(值)是否相等
• is同一性运算符:比较判断的是对象间的唯一身份标识,也就是id是否相同
查询对象类型
内置的 type() 函数可以用来查询变量所指的对象类型。
>>> a, b, c, d= 20,5.5, True,4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'><class 'float'><class 'bool'><class 'complex'>
isinstance 和type 的区别在于:
type()不会认为子类是一种父类类型。
isinstance()会认为子类是一种父类类型。
class A:
pass
class B(A):
pass
isinstance(A(), A) #returns True
type(A())== A # returns True
isinstance(B(), A) #returns True
type(B())== A # returns False
2.2变量(Variable)
Python的变量用来存放Python对象的引用
(1)变量的定义
在定义变量名的时候,需要注意以下问题:
• 变量名必须以字母或下划线开头,但以下划线开头的变量在Python中有特殊含义
• 变量名中不能有空格以及标点符号(括号、引号、逗号、斜线、反斜线、冒号、句号、问号等等)
• 不能使用关键字作变量名,可以导入keyword模块后使用print(keyword.kwlist)查看所有Python关键字
• 不建议使用系统内置的模块名、类型名或函数名以及已导入的模块名及其成员名作变量名,这将会改变其类型和含义,可以通过dir(__builtins__)查看所有内置模块、类型和函数
• 变量名对英文字母的大小写敏感,例如student和Student是不同的变量
(2)变量的使用
Python中一切都是对象,变量实际上是“没有类型”的,是一个指针,变量中存放的是对象的引用,而对象的引用指向这个对象。
所以在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量,Python解释器会根据赋值或运算来自动推断变量类型,指向什么类型的值(对象)的变量就是什么类型的变量。
赋值的作用就是让变量指针(对象引用)指向某个对象。如果对象尚未存在,则在内存中创造对象,一个对象在内存中唯一存在。如果对象引用(变量)尚未存在,则将变量和对象进行绑定。如果对象引用已经存在,就进行简单的重新绑定,以便引用“=”右边的对象。
举个例子,指向同一个对象的变量的值是相同的,但当为其中一个变量修改值以后,其内存地址将会变化,但这并不影响另一个变量。
>>> x = 3
>>> id(x)
1786684560
>>> y = x
>>> id(y)
1786684560
>>> x += 6
>>> id(x)
1786684752
>>> y
3
>>> id(y)
1786684560
• 字符串和元组属于不可变序列,这意味着不能通过下标的方式来修改其中的元素值。
>>> x = (1,2,3)
>>> print(x)
(1, 2, 3)
>>> x[1] = 5
Traceback (most recentcall last):
File "<pyshell#7>", line 1,in <module>
x[1] = 5
TypeError: 'tuple' objectdoes not support item assignment
• 对于列表、集合、字典等可变序列类型而言,情况稍微复杂一些。以列表为例,列表中包含的是元素值的引用,而不是直接包含元素值。如果是直接修改序列变量的值,则与Python普通变量的情况是一样的:
• 而如果是通过下标来修改序列中元素的值,或通过可变序列对象自身提供的方法来增加和删除元素时,序列对象在内存中的起始地址不变的,仅仅是被改变值的元素地址发生变化:
a中包含的是a[0],a[1],a[2](元素的引用),它们指向元素1,2,3,而不是a直接包含元素1,2,3。
a相当于指向一个链表的头节点变量a[0]的头指针
某节点变量a[n]指向内存中的一个对象,同时指向链表中的下一个节点变量a[n+1](列表尾除外)
若a=[1],b=1,则a==[b],id(a[0])==id(b),a[0]==b
若a=[1],b=[1],则a==b, a[0]==b[0],id(a[0])==id(b[0]),但id(a)!=id(b)
它们指向的不是一个链表
若a=[1],b=a,则a==b, a[0]==b[0],id(a[0])==id(b[0]),id(a)==id(b)
它们指向的是一个链表
(3)变量的删除
使用del命令来显式删除变量(解除与对象之间的指向关系),若删除变量后对象不再有变量指向,则删除该对象
列表中部分元素删除后,列表会自动收缩其内存空间以保证各元素连续存储
del命令无法删除元组或字符串中的指定元素,但可以删除整个元组或字符串
(4)动态类型机制与基于值的内存管理模式
Python使用“动态类型”机制,也就是说,在Python程序中,任何时候可以根据需要,某个对象引用都可以重新绑定到另一个不同的对象上(不要求是相同的类型),这和其他强化型语言如(C++,Java)不太一样,只允许重新绑定相同类型的对象上。在Python中,因为有“动态类型”机制,所以一个对象引用可以执行不同类型的对象适用的方法。
动态类型机制决定了Python基于值(对象)的内存管理模式
基于值的内存管理方式,即如果为不同变量赋值为相同值,这个值在内存中只有一份,多个变量指向同一块内存地址。
Python具有自动内存管理功能,对于没有任何变量指向的值,Python自动将其删除。Python会跟踪所有的值,并自动删除不再有变量指向的值。因此,Python程序员一般情况下不需要太多考虑内存管理的问题。尽管如此,仍可显式使用del命令删除不需要的值或显式关闭不再需要访问的资源
下面介绍Python的几种对象类型
2.3数字(Number)
Number属于Python不可变对象,可以是任意大的数值
Python3 的数字类型分为 int(整数类型)、float(浮点数类型)、bool(布尔类型)、complex(复数类型)
注意:在Python2 中没有布尔型的,它用数字 0 表示 False,用 1 表示True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。Python3中也没有Python2 中的 Long。
(1)整数类型
• 十进制整数:如,0、-1、9、123
• 十六进制整数:以0x开头,如0x10、0xfa、0xabcdef
• 八进制整数:以0o开头,如0o35、0o11
• 二进制整数:以0b开头,如,0b101、0b100
(2)浮点数类型
小数,可以用科学计数法e、E作为幂的符号
deffunctionname( parameters ):
"函数_文档字符串"
(3)虚数类型
>>>c= 8+10j
>>>c.real #查看复数实部
8.0
>>>c.imag #查看复数虚部
10.0
>>>a.conjugate() #返回共轭复数
(3-4j)
>>>a*b #复数乘法
(-9+38j)
>>>a/b #复数除法
(0.6393442622950819+0.03278688524590165j)