美文网首页Python语言自学Python入门与进阶
Python高级知识点学习(四)

Python高级知识点学习(四)

作者: kakarotto | 来源:发表于2018-10-23 19:16 被阅读3579次

序列类型

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

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

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

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

序列类型的一些协议

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

image.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))

打印结果:
<class 'dict'>
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 copy
one = {
     "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

相关文章

  • Python高级知识点学习(四)

    序列类型 Python中的序列类型,序列类型可以使用for循环遍历。 序列类,序列是python中非常重要的协议,...

  • Python高级变量类型

    仅用学习参考 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数...

  • Python高级知识点学习(一)

    Python中一切皆对象 和Java相比,Python的面向对象更加彻底。函数和类也是对象,是python的一等公...

  • Python高级知识点学习(二)

    深入类和对象 鸭子类型问:什么是鸭子类型?答:当看到一只鸟走起路来像鸭子,游泳像鸭子,叫起来也像鸭子,那么这只鸟就...

  • Python高级知识点学习(七)

    HTTP、Socket、TCP概念 socket属于常用的http协议之下的让我们可以使用tcp/ip协议的一个接...

  • Python高级知识点学习(六)

    Python中的迭代协议 迭代协议有两个概念: 可迭代类型(Iterable) 迭代器(Iterator) 迭代器...

  • Python高级知识点学习(八)

    线程同步 - condition介绍 多线程中的另外一个重要点就是condition:条件变量。condition...

  • Python高级知识点学习(九)

    并发、并行,同步、异步,阻塞、非阻塞 并发、并行 并发是在一个时间段内,有几个程序在同一个cpu上运行,但是任意时...

  • Python高级知识点学习(五)

    dict的子类 首先,不建议自己编写代码继承dict和list这种原生使用c语言编写的,因为有时候,用c语言写的d...

  • Python高级知识点学习(三)

    mro算法 类属性和实例属性的查找顺序 何为类属性:定义在类内部的的一些变量或者方法,都统称为类属性 何为实例属性...

网友评论

    本文标题:Python高级知识点学习(四)

    本文链接:https://www.haomeiwen.com/subject/ihiazftx.html