博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python高级知识点学习(四)
阅读量:6470 次
发布时间:2019-06-23

本文共 2320 字,大约阅读时间需要 7 分钟。

序列类型

Python中的序列类型,序列类型可以使用for循环遍历。

序列类,序列是python中非常重要的协议,如何通过实现这个协议,将类变为序列类。

Python中的序列分类两个维度区分:

  • 容器序列:可以放置任意类型的数据。
  • 可变序列、不可变序列。

序列类型的一些协议

from collections import abc

跟容器相关的数据结构的抽象基类都是放到abc里的,可以查看源码看下继承关系:

img_1e3e333170a4420d30e8fb74b501136d.png
image.png

img_d5d344f82f671d1cf777e41ca4045413.png
image.png

list中的extend方法、+、 +=、以及append区别:

a = [1, 2]# 新对象上+ [3, 4]c = a + [3, 4]#就地加, 还是a对象上边操作a += (3, 4)a.extend(range(3))a.append((1, 2))print(a)打印结果:[1, 2, 3, 4, 0, 1, 2, (1, 2)]

可切片对象

列表的切片:模式[start:end:step]

start:从哪开始
end:从哪结束
step:步长

例如:a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

a[::]

  • 切片操作返回的是一个新的列表,不会改变原列表。

实现可切片对象,最关键的是要实现一个魔法函数:__getitem__

什么时候不使用列表List

某些情况最好选择Python中其他内置的数据结构:array和deque。

array 和 List 重要区别:

  • array只能存放指定的数据类型,List不同
  • array性能比List高

列表推导式、生成器表达式、字典推导式

列表推导式:又名列表生成式,通过一行代码来生成列表。

列表生成式性能高于列表操作,

第一:能用尽量用, 因为效率高
第二:如果逻辑过于复杂,建议不要使用,会失去高可读性

生成器表达式:改为小括号即可:

(i for i in range(21) if i % 2 == 1)
转换为lsit ,list((i for i in range(21) if i % 2 == 1))

字典推导式:

一行代码生成 dict。

dict的abc继承关系

from collections.abc import Mapping, MutableMapping

dict属于 mapping 类型

from collections.abc import Mapping, MutableMapping# dict属于 mapping 类型a = {}print(type(a))print(isinstance(a, MutableMapping))打印结果:
True

上边代码中,a 并不是继承了MutableMapping,只是实现了MutableMapping中的一些魔法函数。

dict常用方法:

  • clear方法:清空dict
  • copy方法:返回浅拷贝

浅拷贝的时候会互相影响:

one = {     "a": {"name": "zhao"},     "b": {"age": "20"}}two = one.copy()two['a']['name'] = 'wang'print(two)print(one)打印结果:{'a': {'name': 'wang'}, 'b': {'age': '20'}}{'a': {'name': 'wang'}, 'b': {'age': '20'}}

深拷贝:

import copyone = {     "a": {"name": "zhao"},     "b": {"age": "20"}}two = copy.deepcopy(one)two['a']['name'] = 'wang'print(two)print(one)打印结果:{'a': {'name': 'wang'}, 'b': {'age': '20'}}{'a': {'name': 'zhao'}, 'b': {'age': '20'}}
  • fromkeys方法:快速生成以list元素为key的dict,fromkeys参数接受可迭代对象。
new_list = ["a", "b"]new_dict = dict.fromkeys(new_list, {"age": "18"})运行结果:{'a': {'age': '18'}, 'b': {'age': '18'}}
  • get方法:
new_dict = {"a": "a", "b": "b"}print(new_dict.get('c', 'c'))打印结果:c
  • setdefault方法:去dict中取值,如果没有值,则设置完默认值后再取值,如果有值,则只取值。
# dict没有值:a = {"a": "a", "b": "b"}b = a.setdefault("c", "c")print(b)print(a)打印结果:c{'a': 'a', 'b': 'b', 'c': 'c'}
# dict有值a = {"a": "a", "b": "b", "c": "2"}b = a.setdefault("c", "c")print(b)print(a)打印结果:2{'a': 'a', 'b': 'b', 'c': '2'}
  • update方法:合并两个dict
img_a2af7ccb93ec0a5541bb653791d21688.jpe
qrcode_for_gh_60369a20e6f5_258.jpg

可以关注我的微信公众号,会更新Python知识点,也会有其他语言和软件开发中的各种坑,都会记录在公众号。

转载地址:http://ufjko.baihongyu.com/

你可能感兴趣的文章
nginx+keepalived做高可用
查看>>
安装盘启动系统,挂载硬盘,然后进入shell模式修改配置文件
查看>>
安装 Active Directory 架构管理单元
查看>>
Linux系统巡检常用命令
查看>>
C++ 中字符串与数值的相互转换
查看>>
邮件江湖群狼环伺 U-Mail邮件系统防狼有术
查看>>
全球五大顶级域名统计:5月第三周新增20.3万个
查看>>
MFS--分布式文件系统
查看>>
我的友情链接
查看>>
nagios下 监控内存的插件
查看>>
linux磁盘分区
查看>>
传说FreeBSD等比Linux更稳定,更“健壮”
查看>>
cmake安装MySQL数据库实例
查看>>
朝韩合并的几个好处
查看>>
<05>linux的文本基础操作
查看>>
对Pthread线程进行简单的类封装
查看>>
用户登录程序实现--基于MYSQL (自己导入jar包)
查看>>
Fedora14安装后配置
查看>>
test
查看>>
2014年,什么工作最吃香?数据存储架构师!
查看>>