Python 内建数据结构、函数及文件总结——《利用Python进行数据分析》第三章总结笔记
前言
一、数据结构和序列
1. 元组
从上面的定义,我们可以知道
- 长度固定,可以使用 + 或者 * 生成更长的元组
tup = 1, 2, 4
print(tup + (2, 3) * 2)
-
元组不可变
-
元组一旦创建,各个位置上的对象是无法被修改的,但是像元组中对象可变,例如列表,则可以在内部修改
# tuple函数 将任意序列或者迭代数转换成元组 tup = tuple(['foo', [1, 2], True]) # tup[2] = False 错误,元组不可变 tup[1].append(3) print(tup)
-
-
元素是Python对象,见上面的例子
1.1 元组拆包
# tuple函数 将任意序列或者迭代数转换成元组
tup = tuple(['foo', [1, 2], True])
# tup[2] = False 错误,元组不可变
tup[1].append(3)
print(tup)
a , (b,d,e), c = tup
print(a, b, c, d, e)
1.2 元组方法
实例方法较少,常见的方法是count方法,用于 计量某个元素在元组中出现的次数:
a = (1, 2, 2, 2, 3, 4, 2)
print(a.count(2))
2. 列表
2.1 增加和移除元素
增加
append和insert
append到将元素添加到列表尾部,而insert则可以在对应位置添加元素
_list = [1, 2, 3, 4]
_list.append(5)
print(_list)
_list.insert(0, 0)
print(_list)
移除
pop和remove
pop对应insert,append对应remove,pop 移除特定位置的元素,remove会找到列表中第一个符合要求的元素并移除。
_list = [1, 2, 3, 4]
_list.append(5)
print(_list)
_list.insert(0, 0)
print(_list)
_list.pop(0)
print(_list)
_list.remove(3)
print(_list)
是否存在
in 和 not, in判断值是否在列表中,not判断是否不在列表
2.2 连接和联合
两种方式: + 和 extend方法
extend 的代价较小,性能更优
2.3 排序
sort 函数,默认会按升序排列
其中的key选项,是一个二级排序,用于生成排序值的函数
b = ['saw', 'small', 'He', 'foxes', 'six']
b.sort(key = len)
print(b)
2.4 二分搜索和已排序列表的维护
python 内建的bisect 模块实现了二分搜索和已排序列表的插值。其中bisect为找到元素应当被插入的位置,并保持序列排序,而insort会将元素插入到相应位置
import bisect
c = [1, 2, 2, 2, 3, 4, 7]
print(bisect.bisect(c, 2))
bisect.insort(c, 6)
print(c)
2.5 切片
使用切片符号可以对大多数序列类型选取子集,它的基本形式就是[start:stop]
其完整形式可以是[start:stop:step],start表示开始位置的索引,stop结束位,step为步进值
3. 内建序列函数
3.1 enumerate
对数据建立索引,会对序列构造应一个字典,元素值 :序列值(索引)
thisList = ['a', 'b', 'v']
mapping = {}
for i, v in enumerate(thisList):
mapping[v] = i
print(mapping)
3.2 sorted
会返回一个任意序列中的元素新建的已排序列表
print(sorted([43,4, 2,565,3]))
3.3 zip
将序列的元素配对、新建一个元组构成的列表,可以处理任意长度的序列,生成列表长度由最短的序列决定
seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
zipped = zip(seq1, seq2)
print(list(zipped))
seq3 = [False, True]
print(list(zip(seq1,seq2 ,seq3)))
3.4 reversed
就是将序列倒序排列
4. 字典
很好理解就是 C++中的 unordered_map<object, object>, object表示对象类型,字典是键值对结构,键和值都是Python对象
del关键字删除键, pop方法删除值
key方法和value方法会分别提供字典键、值得下迭代器
合并方法为update
4.1 从序列生成字典
mapping = dict(zip(range(5), reversed(range(5))))
print(mapping)
4.2 默认值
4.3 有效的字典类型
其实就是用hash方法检查是否可以哈希化——键必须是不可变的对象
5.集合
无序且元素唯一的容器,和字典类似,但是只有键没有值,创建方式有两种,set方法或者字面值集与大括号的语法。
python集合操作表
函数 | 替代方法 | 描述 |
---|---|---|
a.add(x) | N/A | 将元素x加入到集合a |
a.clear() | N/A | 将集合重置为空,清空所有元素 |
a.remove(x) | N/A | 从集合a移除元素x |
a.pop() | N/A | 移除任意元素,如果集合是空集则抛出keyError |
a.union(b) | a | b | a 和 b 中的所有不同元素 |
a.update(b) | a |= b | 将 a 的内容设置为 a 和 b 的并集 |
a.intersection(b) | a & b | a、b中同时包含的元素 |
a.intersection_update(b) | a &= b | 将a的内容设置为a 和 b 的交集 |
a.difference(b) | a - b | 在a 不在 b 的元素 |
a.difference_updated(b) | a -= b | 将 a 的内容设置为在 a 不在b的元素 |
a.symmsymmetric_difference(b) | a^b | 所有在a或b中,但不是同时在a、b中的元素 |
a.symmetric_difference_update(b) | a ^= b | 将a的内容设上一行所诉元素 |
a.issubset(b) | N/A | 如果a包含于b返回True |
a.issuperset(b) | N/A | 如果a包含b返回True |
a.isdisjoint(b) | N/A | a、b没有交集返回True |
6. 列表、集合和字典的推导式
strings = ['a', 'bat', 'as', 'car', 'dove', 'python', 'cpp', 'java']
List = [x for x in strings if len(x) > 2]
print(List)
这种推导式可以嵌套!但是如果嵌套层数过多,会影响代码的可读性
二. 函数
1. 命名空间,作用域和本地函数
函数有两种连接变量的方式:全局、本地
而在python中有一种更贴切地描述变量作用域的名称是命名空间。在函数内部,任意变量都是默认分配到本地空间的,本地命名空间是在函数调用时生成,其实做个概念就是笔者在C++面向对象时接触到的内存的栈区。
2. 返回多值
def f():
a = 5
b = 6
c = 7
return a, b, c
a, b, c = f()
上诉代码其实就是函数 f 返回了一个元组对象,然后元组又按照我们之前所学的方式就是利用元组拆包方式,将函数返回的元组拆分成多个变量接收。
3. 函数是对象
4. 匿名(Lambda)函数
strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
strings.sort(key=lambda x : len(set(list(x))))
print(strings)
5. 柯里化:部分参数应用
6. 生成器
6.1 生成器表达式
gen = (x ** 2 for x in range(5))
print(gen)
print(list(gen))
7. 错误和异常处理
def attempt_float(x):
try:
return float(x)
except:
return x
print(attempt_float('2343.3243'))
print(attempt_float('sodfnfd'))
三、文件与操作系统
模式 | 描述 |
---|---|
r | 只读模式 |
w | 只写模式,创建新文件(清除路径下的同名文件) |
x | 只写模式,创建新文件,但路径下存在同名文件则会创建失败 |
a | 添加到已存在的文件(如果不存在则创建) |
r+ | 读写模式 |
b | 二进制文件模式,添加到别的模式中(rb, wb) |
t | 文件的文本模式(自动将字节解码为Unicode),如果没有指明模式,则默认使用此模式,也可以添加到别的模式中。 |