一切皆对象
Python中,一切都是对象;(包括函数)
这意味着内置数据结构(列表、字典、元组、集合)本身也能存储其他内置数据结构
我们在各个内置数据结构中存储的都是对象:“简单”的字符串是对象,“复杂”的字典也是对象
- 因此,可以有字典的字典、列表的列表、集合的元组、字典的集合…
例如,如果有一个形如表格的数据结构,可以创建字典的字典,每个内层字典用来表示表格中的一行数据,从而可以方便的管理这些数据
而如果表格只是一次性使用(直接输出),可以创建列表的列表并进行遍历- 另外,可以使用
pprint
(pretty print)模块来美观地打印复杂数据结构
例如,打印字典的字典d
,可以写
import pprint
pprint.pprint(d)
所有对象都有一个唯一的对象标识符,可通过id()
BIF来查看
而所有对象都可以赋给变量(变量动态赋值:声明时无需指定类型)
对 Python程序员来说,“Don’ t panIc!”是一个字符串对象,42则是一个数字对象
与其他编程语言中一样,对象可以有状态(属性或值)和行为(方法)
与对象有关的函数和操作符
检查一个对象是否在另一个对象中,使用in
操作符(或用not in
)
>>> if 1 in [0,1,2]:
print("true")
true
len
内置函数返回对象的大小
>>> len([0,1,2])
3
Pyhton是面向对象的编程语言?
虽然可以采用一种面向对象的方式使用类、对象、实例等编写Python程序
不过,不一定非得这么做。与其他一些编程语言不同(特别是Java),一些简单的程序不需要从类开始:可以直接写你需要的代码,程序也能很好地工作。
要强调的是, Python中的一切都表现得像是来自某个类的对象。
从这个方面来说,可以认为 Python更基于对象而不纯粹是面向对象,在 Python中面向对象编程是可选的。
认识4个内置数据结构
在变量中存储单个数据值无需太多工作,下面来看 Python为存储值集合提供的内置支持:
Python提供了4个内置数据结构,可以用来保存任何对象集合,它们分别是列表、元组、字典和集合。
- 列表:有序的可变对象集合
程序员说听到“列表”, 首先跃入脑海的可能都是“链表”;然而,Python的列表更类似你印象中的数组,而不是链表
将python列表视作一种“高层集合”,列表并不关心其储存的列表项的数据类型,而只是提供一种机制,能够以列表的形式存储数据
- 列表是有序的,列表就像一个数组——它存储的对象按顺序放置在槽中
- (与数组不同) Python中的列表是动态的,因为它们可以根据需要扩展(和收缩),使用列表前不需要预声明列表的大小。
- 列表是异构的(而非同构),因为不需要预声明所要存储的对象的类型,同一列表中可以混合存储不同类型的对象,甚至可以在列表中存储另一个列表
- 列表是可变的,可以在任何时间通过增加、删除或修改对象来修改列表。
- 元组:有序的不可变对象集合
元组是“不可变”的列表 - 字典:无序的键/值对集合
字典相当于我们所说的关联数组、映射map(C++和Java中)、符号表或散列(Perl和Ruby中)。
可以把 Python的字典想成一个两列多行的数据结构。
- 字典中每个唯一键有一个与之关联的值,与键关联的值可以是任意对象。
- 字典是无序的,增加键/值对时可能有一个顺序,但字典不会保持这个顺序,(对Python来说)这个顺序没有任何意义
- (类似于列表)字典是可变的,可以根据需要动态扩展(和收缩)
- 集合:无序的唯一对象(避免重复)集合
- 集合中不允许有重复的对象
- 集合允许完成并集、交集和差集操作
- 类似列表和字典,集合是动态的,可以根据需要扩展(和收缩)。
- 类似字典,集合是无序的,所以不能对集合中对象的顺序做任何假设。
- 集合能实现非常快速的查找。如果主要操作是查找,集合往往是首选的数据结构,使用集合就比列表的顺序搜索要快得多。
Python解释器将“空列表”表示为
[]
;将“空字典”表示为{}
;将“空集合”表示为set()
;将“空元组”表示为()
;