一切皆为对象,一切皆为对象的引用
6种基本数据类型
Python3中有6种基本数据类型,分别为:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
基本类型分类
按照是否可变,可以分为两大类,即:
- 不可变数据类型:Number、String、Tuple
- 可变数据类型:List、Dictionary、Set
可变数据 VS 不可变数据
不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象。
可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
# 不可变数据 VS 可变数据
>>> a = 1
>>> id(a) # id()函数求变量的地址
1534356544
>>> b = 1
>>> id(b)
1534356544
>>> a = a + 1
>>> id(a)
1534356576
>>> a = [1, 2, 3]
>>> id(a)
1529292707976
>>> b = [1, 2, 3]
>>> id(b)
1529292708296
>>> a = a.append(4)
>>> id(a)
1529292707976
# 从上面一段代码可以得出,数据类型是否可变主要围绕改变变量值的时候其地址是否发生变化
# 修改数值地址发生变化为不可变类型
# 修改数值地址不发生变化的为可变类型
Number
Python3支持int、float、bool、complex(复数)
Python3只有一种整型,int
,表示长整型
Python3中,bool也为Number,True和False关键字的值分别为1和0,可以和数值相加
>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d)) # type()函数求变量的对象类型
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
>>> instance(a, int) # instance()函数判断变量是否与指定类型相同
True
# type()和instance()的区别在于,type认为子类不属于父类,而instance会将子类对象也当做父类的对象
注意:
数值的除法包括了两种,/
返回浮点数,而//
返回整数
可以用del语句 删除一些对象引用
>>> 2 / 4
0.5
>>> 2 // 4
0
>>> a = b = c = 5
>>> del a, b
String
Python3中使用单引号'
或者双引号"
括起来
>>> a = 'I am a string'
>>> b = "I am a string too"
字符串的的截断格式为:变量[头下标:尾下标]
,截断得到的字符串包含头下标所在字符而不包含尾下标所在字符串。正序下标从0开始,倒序从-1开始。
>>> str = 'hello,python!'
>
>>> str[0:-1]
hello,python
>>> str[2:]
llo,python!
>>> str * 2 # *号用来复制字符串
hello,python!hello,python!
Tuple
写在小括号()
中用逗号分隔,元组中的元素类型可以不相同。元组也可以通过下标访问,其下标排序和字符串类似。
>>> tuple = () # 空元组的赋值
>>> tuple = (123, ) # 一个元素的元组的赋值
>>> tuple = (123, 'hello', 56.7)
>>> tuple[1:2]
hello, 56.7
>>> tuple * 2 # 乘号在这也是表示复制哦
(123, 'hello', 56.7, 123, 'hello', 56.7)
List
写在[]之间,用逗号将元素分隔开,元素类别可以各不相同,可以是数字、字符或者列表,可以通过下标索引和截取,截取后的列表为新列表。
列表List和Tuple在表示上只差了括号,索引和截断规律基本相同。但List是可变数据类型,而元组为不可变数据类型。
String、List和Tuple都属于sequence(序列)。
>>> list = [123, 'hello', 56.7]
# 常见内置函数
list.append(5) # 在列表最后添加一个元素,也可以添加另一个列表
list.pop() # 最尾巴的元素踢出来
Set
由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { }
或者 set()
函数创建集合,注意:创建一个空集合必须用 set()
而不是 { }
,因为 { } 是用来创建一个空字典。
>>> s = set()
>>> s1 = {1, 2, 3}
>>> s2 = set({1, 2, 3})
集合最酷的地方在于,它可以用来测试成员是否在集合内,还能做集合操作
a = {1, 2, 3, 4, 5}
if 1 in a:
print('1在集合a内')
else:
print('1不在集合a内')
# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
print(a - b) # a和b的差集 {'b', 'd', 'r'}
print(a | b) # a和b的并集 {'l', 'r', 'a', 'c', 'z', 'm', 'b', 'd'}
print(a & b) # a和b的交集 {'a', 'c'}
print(a ^ b) # a和b中不同时存在的元素 {'l', 'r', 'z', 'm', 'b', 'd'}
Dictionary
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用{ }
标识,它是一个无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型。在同一个字典中,键(key)必须是唯一的。
# 逐个配对
dict = {}
dict['one'] = "hello"
dict[2] = "python"
# 键值对序列赋值
dict([('Test', 1), ('Test1', 2), ('Test2', 3)])
# 循环结构
{x: x**2 for x in (2, 4, 6)}
dict(Test=1, Test1=2, Test2=3)
# 常见内置函数
dict.clear() # 清空所有对象
dict.keys() # 返回字典的所有键的序列dict_keys([‘Test’, 'Test1', 'Test2'])
dict.values() # 输出所有值的序列dict_values([1, 2, 3])