列表的排序操作
list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
list2 = sorted(list1)
# sorted函数返回列表排序后的拷贝不会修改传入的列表
# 函数的设计就应该像sorted函数一样尽可能不产生副作用
list3 = sorted(list1, reverse=True)
# 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
list4 = sorted(list1, key=len)
# 给列表对象发出排序消息直接在列表对象上进行排序
list1.sort(reverse=True)
使用列表的生成式语法来创建列表
# 用列表的生成表达式语法创建列表容器
# 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
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)) # 相比生成式生成器不占用存储数据的空间
有了列表的情况下,为什么还要元组呢?
1. 元组中的元素是无法修改的,事实上我们在项目中尤其是多线程环境中可能更喜欢
使用的是那些不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必
要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面
因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全
的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。所以
结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然
如果一个方法要返回多个值,使用元组也是不错的选择。
2. 元组在创建时间和占用的空间上面都优于列表。我们可以使用sys模块的getsizeof
函数来检查存储同样的元素的元组和列表各自占用了多少内存空间,这个很容易做到。
我们也可以在ipython中使用魔法指令%timeit来分析创建同样内容的元组和列表所花
费的时间。