【python高级编程学习笔记】语法实践

首先我们要了解的我们常用的Python是由C语言实现的即CPython, python< 3.6。

容器类型

Python提供了许多内置的数据类型,如果选择明智的话,可以高效解决许多问题。
你可能已经学过下面这些集合类型,因为在开发过程中很常用:
• 列表(list)
• 元组(tuple)
• 字典(dictionary)
• 集合(set)
Python的容器类型当然不止这4种,它的标准库扩展了其可选列表。在许多情况下,问题的答案可能正如选择正确的数据结构一样简单。

列表/元组

Python最基本的两个集合类型就是列表与元组,它们都表示对象序列。
二者之间的根本区别:列表是动态的,其大小可以改变;而元组是不可变的,一旦创建就不能修改。

在Python中,列表被实现为长度可变的数组。强调这一点是因为在日常开发中使用频率很高,所以对应用的性能影响很大。

实现细节

从细节上来看,Python中的列表是由对其他对象的引用组成的连续数组。指向这个数组的引用及其长度被保存在一个列表头结构中。这就意味这每次新增、删除列表元素都需要改变数组的大小(重新分配空间),幸运的是,Python在创建这些数组时采用了指数过分配(exponential over-allocation),所以并不是每次操作都需要改变数组大小。

列表推导

使用循环创建一个列表

evens = []
for i in range(10):
    if i % 2 == 0:
        evens.append(i)

evens  
[0, 2, 4, 6, 8] 

这种写法可能适用于C语言,但在Python中的实际运行速度很慢,原因如下。
解释器在每次循环中都需要判断序列中的哪一部分需要修改。
需要用一个计数器来跟踪需要处理的元素。
由于append()是一个列表方法,所以每次遍历时还需要额外执行一个查询函数。
列表推导正是解决这个问题的正确方法。

[i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]

当数据量足够大时,可以发现列表推导的运行速度是更快的

列表推导的基础使用方式
if判断嵌套
[i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
if…else…判断嵌套
[i if i % 2 == 0 else -1 for i in range(10)]
[0, -1, 2, -1, 4, -1, 6, -1, 8, -1]
函数嵌套
def func(i):
    ret = i+10
    if ret % 4:
        return 3
    else:
        return 4
[func(i) for i in range(10)]
[3, 3, 4, 3, 3, 3, 4, 3, 3, 3]

字典(哈希表)

字典可以存储具有唯一键映射关系的键值对,且具有无序性。

实现细节

python使用哈希表实现的字典底层的数据结构,这也就是为什么只有可哈希的对象才能做字典的键。python中不可变的内置类型(数字、字符串、元组)都是可哈希的,可变类型(列表、字典、集合)是不可哈希的。

字典推导

字典推导与类表推导实现的方式一致,且具有相同的优点。

{number: number**2 for number in range(100)}

字典遍历

字典具有3个基本操作,添加元素、获取元素和删除元素。在日常使用中需要注意,在需要频繁的字典元素做添加、删除操作时,最好是创建一个新的字典,而不时始终在旧的字典上信息操作。
当我们创建一个字典后,对字典进行新增元素再进行大量的元素删除,当遍历字典时,会遍历字典曾经达到过的最大元素数目,也就是说被删除的元素的哈希地址并不会同时被释放。

有序字典

字典的遍历时会有新增和最终遍历的顺序是不一致的,这也是由底层的数据结构所造成的,键是哈希后排序存储在一个连续的存储空间上的,所以遍历的结果通常不是我们预期的。
所以需要使用有序字典,解决我们问题,python标准库的collections模块提供了OrderedDict的有序字典。

    from collections import OrderedDict
    od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])   # 创建字典
    print(od)
    od = OrderedDict()   # 创建空字典
    od['a'] = 1   # 更新或新增元素
    od['b'] = 2
    od['c'] = 3
    od.update({'d':4})   # 更新或新增元素
    print(od)
    od.pop('a')   # 删除元素
    print(od)

OrderedDict([('a', 1), ('b', 2), ('c', 3)])
OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
OrderedDict([('b', 2), ('c', 3), ('d', 4)])

集合

  • set 一种可变的、无序的、有限的集合,其元素是唯一的,不可变的对象。
  • frozenset 一种不可变的、无序的、有限的集合,其元素是唯一的,不可变的对象。

使用场景

    x = {"apple", "banana", "cherry"}
    y = {"google", "runoob", "apple"}
    # 返回两个集合的差集
    print(x.difference(y))
    print(y.difference(x))

    # 返回两个集合中不重复的元素集合。
    print(x.symmetric_difference(y))

    # 返回两个集合的交集
    print(x.intersection(y))

    # 返回两个集合的并集
    print(x.union(y))

{'banana', 'cherry'}
{'google', 'runoob'}
{'banana', 'google', 'cherry', 'runoob'}
{'apple'}
{'apple', 'banana', 'google', 'cherry', 'runoob'}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不太灵光的程序员

有用的话可以请博主喝杯咖啡续命

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值