3.1.3.3 zip
- zip将列表,元组或者其他序列的元素列表配对,新建一个元组的列表:
- zip可以处理任意长度的序列,生成的列表序列有最短的决定
seq1 = ['foo','bar','baz']
seq2 = ['one','two','three']
zipped = zip(seq1,seq2)
list(zipped)
Out[5]: [('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
- zip常用场景:同时遍历多个序列
seq3 = [False,True]
list(zip(seq1,seq2,seq3))
Out[7]: [('foo', 'one', False), ('bar', 'two', True)]
for i, (a,b) in enumerate(zip(seq1,seq2)):
print('{0}:{1},{2}'.format(i,a,b))
0:foo,one
1:bar,two
2:baz,three
3.1.3.4 reversed
- reversed函数将序列的元素倒序排列
list(reversed(range(10)))
Out[9]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
3.1.4字典dict
- 字典也叫哈希表或者关联数组,键和值都是python对象
- 可以访问,插入,设置字典中的元素
empty_dict = {}
d1 = {'a':'some value','b':[1,2,3,4]}
d1[7] = 'an integer'
d1
Out[13]: {7: 'an integer', 'a': 'some value', 'b': [1, 2, 3, 4]}
d1['b']
Out[14]: [1, 2, 3, 4]
3.1.4.1从列表生成字典
mapping = dict(zip(range(5),reversed(range(5))))
mapping
Out[16]: {0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
3.1.4.2默认值
- 字典的get和pop方法会返回一个默认值
- value = some_dict.get(key,default_value)
- 带有默认值的get会在key参数不是字典的键时返回一个None,pop会返回一个异常
- 想要生成一个符合要求的字典,可以向字典中传入类型或者能在各位置生成默认值的函数
3.1.4.3有效的字典键类型
- 字典的值可以是任何对象,但键必须是不可变的对象(标量类型(整型,浮点数,字符串)或者元组(元组内对象也必须是不可变的))
- 使用hash()函数可以检查一个对象是否可以哈希化(即是否可以用作字典的键)
hash((1,2,(2,3)))
Out[18]: 1097636502276347782
hash((1,2,[2,3]))#因为列表是可变的,失败
Traceback (most recent call last):
File "<ipython-input-19-576218ff90d3>", line 1, in <module>
hash((1,2,[2,3]))
TypeError: unhashable type: 'list'
- 可以将列表变为元组,从而元组的所有对象可以哈希化,则列表可以哈希化
3.1.5集合
- 集合是一种无序且元素唯一的容器
- set()函数创建集合或者直接{}创建
- 集合支持数学上的联合,交集,差集,对称差集
a = {1,2,3,4,5}
b = {3,4,5,6,7,8}
a.union(b)#联合
Out[22]: {1, 2, 3, 4, 5, 6, 7, 8}
a | b#并集
Out[23]: {1, 2, 3, 4, 5, 6, 7, 8}
a.intersection(b)
Out[24]: {3, 4, 5}
a & b
Out[25]: {3, 4, 5}
3.1.6列表,集合,字典的推导式
-
列表的推导式允许过滤一个容器的元素,用一种简单的表达式转换传递给过滤器的元素
- 生成一个新的列表
- [expr for val in collection if condition]
strings = ['a','as','bat','car','dove','python']
[x.upper() for x in strings if len(x) > 2]#把字符串长度小于2的过滤掉
Out[28]: ['BAT', 'CAR', 'DOVE', 'PYTHON']
-
字典的推导式:
- dict_comp = {key-expr: value-expr for value in collection}
-
集合的推导式:
- set_comp = {expr for val in collection if condition}
- 创建一个集合,集合里包含列表中字符串的长度
unique_lengths = {len(x) for x in strings}
unique_lengths
Out[30]: {1, 2, 3, 4, 6}
3.1.6.1嵌套列表推导式
3.2函数
3.2.4匿名函数lambda()
- lambda x: x*x 等价于:def f(x): return x*x
- 匿名函数对象自身并没有一个显式的__name__属性
3.2.6生成器
- 通过一致的方式遍历序列,例如对列表中的对象或者文件中的一行行内容
- 此特性是通过迭代器协议实现的,迭代器协议是一种令对象可遍历的通用方式。
- 迭代器就是一种用于在上下文中(比如for循环)向python解释器生成对象的对象
- 生成器是构造新的可遍历对象的一种比较简洁的方式,一般的函数执行并返回单个结果,生成器返回一个多结果的序列
- 创建一个生成器,将函数中返回关键字return替换成yield
3.2.7错误和异常处理
-
def attempt_float(X): try: return float(x) except: return x
-
def attempt_float(X): try: return float(x) except ValueError: return x
-
def attempt_float(X): try: return float(x) except (TypeError,ValueError): return x
3.3文件与操作系统
重要的python文件方法
方法 描述 f.read([size]) 将文件数据作为字符串返回,size控制读取的字节数 f.readline([size]) 返回文件中行内容的列表,size参数可选 f.write(str) 将字符串写入文件 f.writelines(strings) 将字符串序列写入文件 f.close() 关闭文件 f.flush 将内部I/O缓冲器内容刷新到硬盘 f.seek(pos) 移动到指定的位置(整数) f.tell() 返回当前的文件位置,返回值是整数 f.closed() 如果文件已关闭,返回TRUE3.3.1字节与Unicode文件
- 默认的python是文本模式,所以需要处理python字符串(Unicode)