Python对象类型(二)
1. 字典:
Python的字典不是序列,而是一种映射。映射是一个其他对象的集合,但是他们是通过键而不是相对位置来存储的。映射没有任何可靠的从左至右的顺序。他们简单的将键映射到值。字典是python核心对象集合中唯一的映射类型。
1) 映射操作:
作为常量编写时,字典编写在大括号中,并包含一系列的“键:值”对。在我们需要将键和值关联的时候,字典是很有用的。作为一个例子:
>>>D={'name':'zhangs','age':19,'says':'hello world'}
>>>D['name']
'zhangs'
>>> D
{'name':'zhangs', 'age': 19, 'says': 'hello world'}
>>>D['age']+=1
>>> D
{'name':'zhangs', 'age': 20, 'says': 'hello world'}
>>>D['job']='dev'
>>> D
{'name':'zhangs', 'age': 20, 'says': 'hello world', 'job': 'dev'}
通过键索引一个字典,是python中编写搜索最快的方法。
2) 重访嵌套:
>>>rec={'name':{'first':'zhang','last':'smith'},'job':['dev','mgr'],'age':21.5}
>>> rec['name']['last']
'smith'
>>> rec['job'][-1]
'mgr'
>>> rec['job'].append('coder')
>>> rec
{'name': {'first': 'zhang', 'last': 'smith'}, 'job': ['dev', 'mgr','coder'], 'age': 21.5}
Python对象在内存中如何存储,才能如此自由的使用字典?
3) 键的排序:for 循环
字典仅支持通过键获取元素。但是他也支持类型特定的操作。下面是将字典排序输出的两种示例:
>>>d={'a':1,'c':2,'b':3}
>>>l=list(d.keys())
>>>l
['a','c', 'b']
>>>l.sort()
>>>l
['a','b', 'c']
>>>for i in l:
... print(i,'=>',d[i])
...
a => 1
b => 3
c => 2
>>>for i in sorted(d):
... print(i,'=>',d[i])
...
a => 1
b => 3
c => 2
4) 迭代和优化:
从左到右的扫描一个对象的每个python工具都使用迭代协议。
列表解析和相关的函数编程工具(例如map和filter)通常运行的比for循环快:这是对有大数据集合的程序由重大影响的特性之一。
Python中的组要原则就是:首先为了简单和可读性去编写代码,在程序可以工作,并证明确实有必要考虑性能后,正在考虑该问题。更多的情况是diamante本身就应经够快了。若果确实要提高代码性能,python提供了time、timeit模块和profile模块。
5) 不存在的键:if测试:
>>> d
{'a': 1, 'c': 2, 'b': 3}
>>> 'd' in d
False
>>> 'b' in d
True
当然还有其他方法:get方法(带有默认值的条件索引),try语句(一个捕获异常并从异常中回复的工具),if/else表达式:
>>> a=d.get('x','a')
>>> a
'a'
>>> a=d.get('b','a')
>>>
A
3
>>> a=d['x'] if 'x' in d else 0
>>> a
0
2. 元组
元组(tuple)想一个不可以改变的列表。元组是序列,但是具有不可变性。语法上讲,他们编写在圆括号中而不是方括号中,他们支持任意类型、任意嵌套以及常见的序列操作:
>>>t=(1,2,3,4)
>>>len(t)
4
>>>t+(5,6)
(1, 2, 3,4, 5, 6)
>>>t[0]
1
>>>t*2
(1, 2, 3,4, 1, 2, 3, 4)
>>>t[1:]
(2, 3, 4)
1) 元组专有调用方法:
>>> t.index(2)
1
>>> t.count(3)
1
2) 与字典和列表一样,元组同样支持混合类型和嵌套,但是不能增长或缩短,他是不可变的。
3) 为什么使用元组
相比较列表,元组唯一的优势是不可变性。列表的值可能在任何地方改变,但是元组则保证数据不会改变。
>>> def a():
return (1,2)
... ...
>>> c,d=a()
>>> c
1
>>> d
2
>>>
3. 文件:
文件对象是python代码对电脑上外部文件的主要接口。文件是核心类型,但是他有些特殊:没有特定的常量语法创建文件。要创建一个文件对象,需要调用内置的open函数。
4. 集合
集合可以通过调用内置的set函数而创建,且支持一般的数学集合操作,结合更像一个无值的字典的键:
>>>x=set('spam')
>>> x
{'a', 'm', 'p','s'}
>>>y={'h','a','m'}
>>> x,y
({'a', 'm', 'p','s'}, {'a', 'm', 'h'})
>>>x&y
{'a', 'm'}
>>> x|y
{'p', 'a', 's','m', 'h'}
>>> x-y
{'p', 's'}
>>>{x**2 for x in range(4)}
{0, 1, 4, 9}
5. Python添加了新的数值类型:十进制数和分数。他们用来解决浮点数的局限性和内在的不精确性。
>>> import decimal
>>> d=decimal.Decimal('2.21')
>>> d
Decimal('2.21')
>>> print(d)
2.21
>>> from fractions import Fraction
>>> f=Fraction(2,3)
>>> f+1
Fraction(5, 3)
>>> f+Fraction(1,2)
Fraction(7, 6)
6. python还添加了布尔值
7. 编写代码处理对象类型,至少有三种方法实现:
>>> l=[1,2]
>>> type(l)
<class 'list'>
>>> if type(l)==type([]):
... print('yes')
...
yes
>>> if type(l)==list:
... print('yes')
...
yes
>>> if isinstance(l,list):
... print('yes')
...
Yes
但是如此写代码会限制代码灵活性,使得对象只能使用一种类型。