写在前面
经历了秋招之后,发现SLAM找工作没有实打实的项目真的很难,而且自己又换了方向,现在基本全得用Python,所以乘积梳理一番,在Python的简单学习过程中需要注意的地方。什么事情都不能一撮而就啊!加油
【Day007】 字符串和常用数据结构
1. 列表
f = [x for x in range(1, 10)]
print(f)
f = [x + y for x in 'ABCDE' for y in '1234567']
print(f)
# 用列表的生成表达式语法创建列表容器
# 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
f = [x ** 2 for x in range(1, 1000)]
print(sys.getsizeof(f)) # 查看对象占用内存的字节数
print(f)
# 请注意下面的代码创建的不是一个列表而是一个生成器对象
# 通过生成器可以获取到数据但它不占用额外的空间存储数据
# 每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)
f = (x ** 2 for x in range(1, 1000))
print(sys.getsizeof(f)) # 相比生成式生成器不占用存储数据的空间
print(f)
for val in f:
print(val)
上面的是生成器语法,当然除了那些之后还可以用yeild
关键字, 借此可以将普通函数 改造成生成器函数!(意味着不占用额外的内存!,只有在需要的时候才占用!)
2. 元组
首先要明白,元组其实和列表基本上差不多,唯一的 区别是:元组中的元素不能修改!
那么不能修改的好处体现在什么地方呢?
(1)多线程时候——线程安全元组中的元素是无法修改的,事实上我们在项目中尤其是多线程环境(后面会讲到)中可能更喜欢使用的是那些不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。所以结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然如果一个方法要返回多个值,使用元组也是不错的选择。
(2)节省内存,更快元组在创建时间和占用的空间上面都优于列表。我们可以使用sys模块的getsizeof函数来检查存储同样的元素的元组和列表各自占用了多少内存空间,这个很容易做到。我们也可以在ipython中使用魔法指令%timeit来分析创建同样内容的元组和列表所花费的时间,下图是我的macOS系统上测试的结果
3.类
(1) 关于类属性,相当于的C++中的static一样吧,我的个人感觉,在类之中,但是又在方法之外
(2)还要区别实例对象以及
关于Random.seed(1)
是为了每次生成的随机数保持一致而设置的,不然很多东西没有办法统一
比如如果不设置的话,教程给的代码结果和实际操作的结果就不一致,没有办法判别
———————————————分割线——————————————————————
上面那样知识点一样的零零散散的方式对看代码帮助不大,接下来还是整块代码来看比较合适吧,这就还是记录小知识点,遇到了就记一下!