设为首页 加入收藏

TOP

Python核心技术与实战 笔记(一)
2019-09-20 11:45:42 】 浏览:160
Tags:Python 核心 技术 实战 笔记

基础篇

知识图谱

Jupyter Notebook

优点

  • 整合所有的资源
  • 交互性编程体验
  • 零成本重现结果

实践站点

列表与元组

列表和元组,都是 一个可以放置任意数据类型的有序集合

l = [1, 2, 'hello', 'world'] # 列表中同时含有 int 和 string 类型的元素
l
[1, 2, 'hello', 'world']

tup = ('jason', 22) # 元组中同时含有 int 和 string 类型的元素
tup
('jason', 22)
  • 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素 (mutable)
  • 元组是静态的,场地大小固定,无法增加删除或者改变 (immutable)
  • 都支持负数索引;
  • 都支持切片操作;
  • 都可以随意嵌套;
  • 两者可以通过 list()tuple() 函数相互转换;

列表和元组存储方式的差异

由于列表是动态的,所以它需要存储指针,来指向对应的元素。增加/删除的时间复杂度均为 O(1)。

l = []
l.__sizeof__() // 空列表的存储空间为 40 字节
40
l.append(1)
l.__sizeof__()
72 // 加入了元素 1 之后,列表为其分配了可以存储 4 个元素的空间 (72 - 40)/8 = 4
l.append(2)
l.__sizeof__()
72 // 由于之前分配了空间,所以加入元素 2,列表空间不变
l.append(3)
l.__sizeof__()
72 // 同上
l.append(4)
l.__sizeof__()
72 // 同上
l.append(5)
l.__sizeof__()
104 // 加入元素 5 之后,列表的空间不足,所以又额外分配了可以存储 4 个元素的空间

使用场景

  • 如果存储的数据和数量不变,那么肯定选用元组更合适
  • 如果存储的数据和数量是可变的,那么则用列表更合适

区别

  • 列表是动态的,长度可变,可以随意的增加、删除或者改变元素;列表的存储空间略大于元组,性能略逊于元组;
  • 元组是静态的,长度大小固定,不可对元素进行增加、删除、修改操作,元组相对于列表更加的轻量级、性能稍优;

思考题

# 创建空列表
# option A:list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive
empty_list = list()

# option B:[]是一个内置的C函数,可以直接被调用,因此效率高
empty_list = []

字典与集合

字典是一系列无序元素的组合,其长度大小可变,元素可以任意的删除和改变,相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成。而集合和字典基本相同,唯一的区别,就是集合没有件和值的配对,是一系列无序的、唯一的元素组合。

# 定义字典
d = {'name': 'jason', 'age': 20}
# 增加元素对'gender': 'male'
d['gender'] = 'male' 
# 增加元素对'dob': '1999-02-01'
d['dob'] = '1999-02-01' 
d
{'name': 'jason', 'age': 20, 'gender': 'male', 'dob': '1999-02-01'}
# 更新键'dob'对应的值 
d['dob'] = '1998-01-01' 
# 删除键为'dob'的元素对
d.pop('dob') 
'1998-01-01'
d
{'name': 'jason', 'age': 20, 'gender': 'male'}

# 定义集合
s = {1, 2, 3}
# 增加元素 4 到集合
s.add(4)
s
{1, 2, 3, 4}
# 从集合中删除元素 4
s.remove(4) 
s
{1, 2, 3}


d = {'b': 1, 'a': 2, 'c': 10}
# 根据字典键的升序排序
d_sorted_by_key = sorted(d.items(), key=lambda x: x[0]) 
 # 根据字典值的升序排序
d_sorted_by_value = sorted(d.items(), key=lambda x: x[1])

可以使用 get(key,default) 函数来进行字典索引。如果键不存在,调用该函数可以返回一个默认的值。

集合不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。

字典和集合性能

字典和集合是进行性能高度优化的数据结构,特别是对于查找、添加和删除操作。

字典和集合的工作原理

字典和集合的内部结构都是一张哈希表

  • 对于字典而言,这张哈希表存储了哈希值,键和值这三个元素
  • 对于集合而言,区别就是哈希表内没有键和值的配对,只有单一的元素了

插入操作

每次向字典或集合插入一个元素时,Python 会首先计算键的哈希值(hash(key)),再和 mask = PyDicMinSize - 1 做与操作,计算这个元素应该插入哈希表的位置 index = hash(key) & mask。如果哈希表中此位置是空的,那么这个元素就会被插入其中。而如果此位置已被占用,Python 便会比较两个元素的哈希值和键是否相等。

  • 若两者都相等,则表明这个元素已经存在,如果值不同,则更新值。
  • 若两者中有一个不相等,这种情况我们通常称为哈希冲突(hash collision),意思是两个元素的键不相等,但是哈希值相等。这种情况下,Python 便会继续寻找表中空余的位置,直到找到位置为止。

查找操作

先通过哈希值找到目标位置,然后比较哈希表这个位置中元素的哈希值和键,与需要查找的元素是否相等,如果相等,则直接返回,否则继续查找,知道为空或抛出异常为止

删除操作

暂时对这个位置得到元素赋予一个特殊的值,等到重新调整哈希表的大小时,再将其删除。

字符串

  • Python 中字符串使用单引号、双引号或三引号表示,三者意义相同,并没有什么区别。其中,三引号的字符串通常用在多行字符串的场景。
  • Python 中字符串是不可变的(前面所讲的新版本 Python 中拼接操作’+='是个例外)。因此,随意改变字符串中字符的值,是不被允许的。
  • Python 新版本(2.5+)中,字符串的拼接变得比以前高效了许多,你可以放心使用。
  • Python 中字符串的格式化(string.format,f)常常用在输出、日志的记录等场景。

输入与输出

输入输出基础

生产环境中使用强制转换时,请记得加上 try except

文件输入输出

所有 I/O 都应该进行错误处理。因为 I/O 操作可能会有各种各样的情况出现,而一个健壮(robust)的程序,需要能应对各种情况的发生,而不应该崩溃(故意设计的情况除外)。

JSON 序列化与实战

  • json.dumps() 函数,接受 python 的基本数据类型,然后将其序列化为 string;
  • json.loads() 函数,接受一个合法字符串,然后将其序列化为 python 的基本数据类型;

条件与循环

  • 在条件语句中,if 可以单独使用,但是 elif 和 else 必须和 if 同时搭配使用;而 If 条件语句的判断,除了 boolean 类型外,其他的最好显示出来。
  • 在 for 循环中,如果需要同时访问索
首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇构建支持中文字体的moviepy镜像 下一篇django下创建多个app,如何设置每..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目