- 博客(132)
- 资源 (5)
- 收藏
- 关注
原创 Python 中调用父类中的方法,super() 函数介绍
1. 概述super() 返回父类的临时对象,然后可以调用父类的方法。常用于扩展父类的方法,通过使用super() 语句直接调用父类的方法,无需再子类中重新实现, 使用最少的代码来扩展父类的方法。一个例子:创建一个矩形类,包含长宽2个属性, 周长和面积2个函数。class Rectangle: def __init__(self, length, width): self.length = length self.width = width
2021-09-07 16:04:17
5825
原创 Python 中的魔术方法(九)自定义反射,__instancecheck__和 __subclasscheck__
可以通过定义魔术方法来控制使用内置函数isinstance()和issubclass()行为的反射方式。
2021-09-06 16:30:41
657
原创 Python 中的魔术方法(八)上下文管理器,__enter__和 __exit__
1.__enter__和 __exit__上下文管理器的行为由两个魔术方法决定:__enter__(self) - 定义上下文管理器在 with 语句创建的块的开头应该做什么。__enter__的返回值 绑定到 with 语句的目标,即 as 语句后面的名称。 __exit__(self, exc_type, exc_value, exc_tb) 此方法在执行流离开 with 上下文时调用。如果发生异常,则exc_type、exc_value和 分别exc_tb保存异常类型、值和回溯信息...
2021-09-06 16:15:49
1407
原创 Python 中的魔术方法(七)自定义容器行为, __setitem__ 和 __getitem__ 等
1. 协议Python 中创建自定义序列通常的方式是继承内置的数据类型,使用collections模块中的UserDict UserList等数据。如果要创建完全自定义的序列, 需要实现Python 中自定义容器类型其中一些协议。首先,有用于定义不可变容器的协议:要创建不可变容器,您只需要定义 __len__ 和 __getitem__对于可变容器, 需要实现__setitem__ 和__delitem__。如果容器对象需要支持迭代,还需要实现一个返回一个迭代器的 __iter__...
2021-09-06 15:43:51
428
1
原创 Python 中的魔术方法(六)属性访问控制, __getattr__ 和 __getattribute__
1.__getattr__ 和 __getattribute__区别__getattr__只在没有找到目标属性时调用。很适合作为属性缺失时的缺省回调函数。__getattribute__在查看对象的实际属性之前调用,需要注意避免无限递归。一个代码示例来展示两个方法的使用, 创建一个自定义字典, 可以使用 obj.attr 的语法来访问字典内的数据。 如 obj = {"a": "b"} ,obj.a 返回 b。 增加一个size属性,返回字典数据个数。In [1]: from ...
2021-09-06 15:22:04
633
原创 Python 中的魔术方法(五)类的展示方法, __str__ 和 __repr__
1.__str__ 和 __repr__Python的内置函数 repr() 能够把对象用字符串的形式表达出来,方便我们辨认。这就是“字符串表示形式”。根据 Python 文档中定义 __str__:通过 str(object) 以及内置函数 format() 和 print() 调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须是字符串对象。 __repr__:是由 repr() 内置函数调用,用来输出一个对象的“官方”字符串表示。返回值必须是字符串对象,此方法通..
2021-09-06 11:50:41
362
原创 Python 中的魔术方法(四)数学运算方法, __add__(+), __or__(|)等方法
和比较运算符一样, 也可以通过魔术方法自定义 数字运算符的行为,1. 一元运算符方法 说明 运算符 __pos__(self) 实现取正的行为 +obj __neg__(self) 实现取负的行为 -obj __abs__(self) 实现内置 abs() 函数的行为 abs(obj) __invert__(self) 实现 ~ 运算符实现反转行为 ~(obj) __round__(self, n) 实现内置 ..
2021-09-03 15:57:50
993
原创 Python 中的魔术方法(三)自定义比较方法, __eq__(==), __lt__(<)等方法
相较于 a.is_equal(b), a.is_greater_than(b)这种语法的函数调用来进行对象的对比, 使用运算符的比较 a == b, a > b这样的语法更加直观。Python 种提供了一系列的魔术方法, 来实现对象的对比。方法 说明 运算符 __eq__(self, other) 定义相等运算符的行为 == __ne__(self, other) 定义不等式运算符的行为 != __lt__(self, other)...
2021-09-03 14:31:38
1141
原创 Python 中的魔术方法(二)__call__, 重载 ()的功能, 使实例像函数一样工作
Python 中的一个特殊魔术方法 __call__ 允许类的实例表现得好像它们是函数一样。 你可以“调用”它们,并将实例化过程中的参数,作为函数的参数来使用。__call__(self, *args, **kwargs)允许将类的实例作为函数调用。ins()本质上就是 ins.__call__.请注意,__call__接受任意数量的参数;代码示例class Card: def __init__(self, suit, rank): self.suit = s...
2021-09-03 11:53:05
803
原创 Python 中的魔术方法(一)__new__和__init__, 构造和初始化的区别
1. 概念在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法。2. 构造和初始化最基本的魔术方法,大家经常用的__init__。这是我们初始化定义的对象行为的方式。但是当我实例化一个类 instance = MyClass() 时,__init__并不是第一个被叫到的。而是令一个方 法__new__,由它实际上创建了实例,然后将创建时的任何参数传递给初始化程序。在对象生命周期的另一端,是__del__方法。我们仔细看看这 3...
2021-09-03 11:27:38
469
原创 Python 更加优雅的读取资源方式 importlib.resources
1. 简介这个模块使得Python的导入系统提供了访问*包*内的*资源*的功能。如果能够导入一个包,那么就能够访问那个包里面的资源。资源可以以二进制或文本模式方式被打开或读取。Python项目使用项目内的资源文件,例如项目所需的数据文件。通常使用以下方法硬编码数据文件的路径 将数据文件放入包装中,并使用进行定位__file__ 使用setuptools.pkg_resources访问数据文件资源如 项目文件结构如下, 在test.py 中要使用data.txt 中的数据myproj.
2021-09-02 16:21:55
4703
原创 Python 并发编程(三)对比(multiprocessing, threading, concurrent.futures, asyncio)
1. 对比Python 3.2 引入了concurrent.futures。3.4版本引入了asyncio到标准库, python3.5以后使用async/await语法。库 Class/Method 并发类型 适用任务 multiprocessing Pool 并行 cpu 密集型 concurrent.futures ProcessPoolExecutor 并行 cpu 密集型 threading Thread 并
2021-09-01 16:59:37
8127
3
原创 Python 并发编程(一)基本概念(进程、线程、协程)
1. 并发与并行并发和并行是相似的术语,但它们并不是一回事并发是在 CPU 上同时运行多个任务的能力。任务可以在重叠的时间段内启动、运行和完成。在单个 CPU 的情况下,多个任务在上下文切换的帮助下运行,其中存储进程的状态,以便稍后调用和执行。并行性是在多个 CPU 内核上同时运行多个任务的能力。通俗点解释就是,区别就在于是否可以“同时”处理。比如正在用 pad 看电影,这时电话响了,暂停电影然后接电话,挂掉电话之后继续看电影,这就是并发。电影继续播着,一边看电影一边讲电话就是并行.
2021-09-01 14:41:51
218
原创 Python 深入理解dict---为什么 dict 查询元素比 list 快?
前言:查看https://wiki.python.org/moin/TimeComplexity中的数据可以看到在 list 中查找元素的复杂度为 O(n) , 在 dict 中查找元素的复杂度 为 O(1)本文来探讨以下其中的原理。1. hash字典建立在另一种技术之上:哈希表hash 函数是一种可以将任意长度的数据映射到固定长度值的函数,称为哈希。hash 函数有 3 大特点:速度快: 确定性: 同一数据hash计算后,永远产生唯一的确定值。 固定长度:无论输入多..
2021-08-31 19:21:09
1777
原创 Python中的内存管理---list的内存使用
前言使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的拓展其中的元素个数。 也可以使用运算符 如: [1] + [2] 生成新的数组[1, 2]extend()、"+"、"+="的区别"+"将两个 list 相加,会返回到一个新的 list 对象 append 在原 list 上进行修改,没有返回值从以下代码可以看到, 调用 b = b + [3, 4] 之后, 通过id(b) 查看 b 变成了一个新对..
2021-08-31 14:18:42
5211
原创 【算法题】求最大递减序列
思路同:求数组中子数组的最大和代码:In [1]: def get_longest_decrease_sub_array(array): ...: cur_list = max_list = array[0:1] ...: for i in range(1,len(array)): ...: if array[i]<array[i-1]: ...: cur_list.append(array[i]) ...
2021-08-30 17:13:39
204
原创 【算法题】求数组中子数组的最大和
思路:其实和求数组中的最大值差不多,需要维护一个最大值,然后和当前子数组的和对比。只要当前子数组的和是大于0的,对于后面的数据就是有用的。如果当前子数组的和小于 0 了,则丢弃这个子数组,从下一个元素重新计算代码:In [1]: def get_max_sum_of_sub_array(array): ...: cur_sum, max_sum=0,0 ...: for i in array: ...: cur_sum +=i ...
2021-08-30 17:08:25
185
原创 【算法题】给定两个有序区间列表,找到这两个列表的交集
示例:输入: arr1=[[1, 3], [5, 6], [7, 9]], arr2=[[2, 3], [5, 7]]返回:[2, 3], [5, 6], [7, 7]输入:arr1=[[1, 3], [5, 7], [9, 12]], arr2=[[5, 10]]返回:[5, 7], [9, 10]思路:2个区间的关系, 一共有四种可能,没有交集, 部分交集,被包含, 相等。因为要求的是两个有序区间列表的交集, 使用 2个指针分别遍历一个区间列表,然后将求当前...
2021-08-30 16:14:15
401
原创 【算法题】判断链表是回文链表
思路:将链表反转,然后和原链表对比,如果相等即为回文链表。记录当前节点和之前和之后的节点 将当前节点的指针反转,由指向后一个节点改为指向前一个节点(没有前面节点时, 指向None) 依次处理下一个数据,直到最后一个数据,将其指向新链表的头即可代码如下, 定义一个反转链表的函数reverseIn [10]: class Node: ...: def __init__(self, value, next=None): ...: self.value
2021-08-26 19:59:35
158
原创 【算法题】返回单向链表的中间节点
思路如果 单向链表中的节点总数为偶数,则返回第二个中间节点。Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null ,返回 4Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> null ,返回 4同:【算法题】判断链表是否成环使用快慢两个指针,遍历单链表。 快指针步长是慢指针的2倍, 快指针遍历结束时, 慢指针所指的数据就是中间节...
2021-08-26 17:36:10
204
原创 【算法题】判断链表是否成环
思路:使用快、慢两个指针以不同的速度遍历链表,若块指针能再次遇到慢指针,则链表中存在环代码:In [1]: class Node: ...: def __init__(self, value, next=None): ...: self.value = value ...: self.next = next ...:In [2]: def has_cycle(node): ...: slow, fast =.
2021-08-26 16:54:30
163
原创 【算法题】给定两个包含退格符的字符串(由字符“#”标识),检查这两个字符串是否相等。
思路:输入 str1="xy#z", str2="xzz#", 返回为 True, 使用了回退符之后,str1 和str2 都变成了xz,所以两个字符串相等。需要一个函数返回应用过退格符之后的字符串维护一个退格符计数器, 使用一个指针从右向左遍历字符串,若字符是退格符 # , 计数器 +1.若字符不是退格符, 此时若计数器==0,返回当前字符 若计数器 > 0, 计数器 -1代码:...
2021-08-26 15:37:50
210
原创 【算法题】给定排序数组,求总和为 0 的三元组
思路同,【算法题】给定一个排序数字数组和一个目标 K,在数组中找到和为 K 的2个数的坐标。依次遍历数组数据,在之后的子数组中查找和为 ( - 当前值)的2个数, 这样3个数的和就是 0 了。代码:In [1]: def find_triplets_sum_to_zero(array): ...: def find_pairs_of_target_sum(arr, tar): ...: left, right = 0, len(arr)-1 ...
2021-08-26 14:23:26
215
原创 【算法题】给定一个排序数字数组和一个目标 K,在数组中找到和为 K 的2个数的坐标。
思路已知输入数组为排序数组, 使用两个指针从头和尾对数组进行遍历,若2数之和大于目标值, 则移动右指针,减小当前数的和;若2数之和小于目标值, 则移动左指针,增加当前数的和;直到找到目标数据,或者2个指针相遇,结束遍历。代码:In [1]: def two_index_of_target_sum(array, tar): ...: left, right = 0, len(array)-1 ...: ...: while left <...
2021-08-26 11:09:36
903
1
原创 【算法题】给定一个包含 0 和 1 的数组,如果允许用 1 替换不超过“k”个 0,请找出全为 1 的最长连续子数组的长度。
思路:使用一个窗口框出子数组, 判断如果窗口内0的个数小于等于k,则右边界增加扩大窗口。若窗口内0的个数大于k,则左边界增加减小窗口内数据。每次记录窗口size,获取最大值。思路同【算法题】求带有 K 个不同字符的最长子字符串代码In [1]: def longest_sub_array_with_k_replace(array, k): ...: max_len = 0 ...: left, right, end = 0, 0, len(array).
2021-08-26 10:16:45
1501
原创 【算法题】求带有 K 个不同字符的最长子字符串
思路:使用一个窗口框出字串, 判断如果窗口内字符个数小于等于k,则右边界增加扩大窗口。若窗口内字符个数大于k,则左边界增加减小窗口内数据。每次记录窗口size,获取最大值,若最大值小于k,则没有满足条件的字串,返回0.代码如下:In [1]: def longest_sub_sting_with_k_distinct(string, k): ...: max_len = 0 ...: left, right, end = 0, k, len(string).
2021-08-25 20:15:30
554
原创 【算法题】求长度为 K 的子数组的最大和
思路:将长度为K的子数组,依次遍历并求和,找到最大的和并返回代码如下In [1]: def max_sub_array_of_size_k(array, k): ...: max_sum = 0 ...: for i in range(0, len(array)-k+1): ...: cur_sum = sum(array[i:i+k]) ...: max_sum = max(max_sum, cur_sum) .
2021-08-25 19:43:24
1395
原创 【操作系统】基础与IO(同步/异步, 阻塞/非阻塞)
1. 硬件和软件计算机资源分为硬件资源和软件资源。硬件资源:包括cpu,内存,显卡,网卡,声卡,硬盘等,每个硬件完成特定的功能,比如显卡完成在显示设备上显示图形,声卡实现声音的处理 软件资源:各种程序, 如web浏览器, 文本编辑工具等。2. 操作系统与应用程序软件中,专门负责和硬件资源交互的软件成位硬件驱动程序。比如网卡发送数据,声卡播放声音等。驱动程序提供给应用程序接口,供应用程序调用接口来使用硬件。2.1 没有操作系统的问题计算机上面会同时有多个应用程序运行,应用都会使用显..
2021-08-25 16:28:46
244
原创 Python 并发编程(二) GIL (全局解释器锁)
Python 全局解释器锁 GIL(GlobalInterpreterLock),简单来说是一个互斥锁,它同一时间只允许一个线程控制 Python 解释器。这意味着在任何时间点都只能有一个线程处于执行状态。由于即使在具有多个 CPU 内核的多线程架构中,GIL 也只允许一次执行一个线程,因此 GIL 被称为 Python 最“臭名昭著”的特性。1. 为什么需要GILPython 使用引用计数进行内存管理。这意味着在 Python 中创建的对象有一个引用计数变量,用于跟踪指向该对象的引用数量...
2021-08-23 16:22:56
373
原创 Python中的内存管理---引用计数与垃圾收集
1. CPython介绍Python 是一种解释型编程语言。你的 Python 代码实际上被编译成更多计算机可读的指令,称为字节码 (即我们经常在__pycache__文件夹中见到的 .pyc 文件)。当您运行代码时,这些指令由虚拟机解释。默认的 Python 实际上是CPython,是用 C 编写的,运行时由它解释 Python 字节码。除 CPython 之外还有其他实现常见python解释器 名称 CPython IronPython Jython PyP...
2021-08-23 15:28:11
282
原创 Python 如何写干净的代码 Clean-Code
1. 什么是Clean-CodeClean-Code 是一组规则和原则,有助于保持我们的代码可读、可维护和可扩展。我们花在阅读代码上的时间比实际编写代码的时间多得多,这就是为什么编写易于维护的代码很重要。1.1 Clean-Code的特点容易理解 更有效率 易于维护, 拓展, 调试 需要更少的文档2. 代码标准代码标准是编码规则、指南和最佳实践的集合。从以下几个方面介绍一下代码标准编程实践和原则 文件组织 代码格式(缩进、声明、语句) 命名约定 注释2.1 代码原则
2021-08-19 15:06:55
945
原创 Python 更好的文件路径处理模块 pathlib详解
1. 为什么需要pathlib在pathlib出现之前, Python 的标准库os.path支持操作文件路径, 使用字符串表示文件路径。In [1]: import os.pathIn [2]: os.path.abspath('test')Out[2]: 'C:\\Users\\Public\\Documents\\test'如以上代码, abspath函数的返回是一个字符串. 如果想要获取父目录, 需要使用字符串的split方法In [3]: path = os.path..
2021-08-17 15:47:48
3277
原创 Python中with语句详解, 2种方式创建自定义的上下文管理器
1. Python中的资源管理在编程中面临的一个常见问题是如何正确管理外部资源,例如文件、锁和网络连接。如果创建和打开资源后, 而不实现关闭, 就会出现内存泄漏.正确管理资源需要一个Setup阶段和一个Teardown, Teardown阶段需要执行一些清理操作,例如关闭文件、释放锁或关闭网络连接.file = open("hello.txt", "w")file.write("Hello, World!")file.close()如果调用 .write() 期间发生异常,.close
2021-08-16 14:50:55
1306
原创 Python中生成随机数据random模块总结
1. 伪随机查看 python 标准库random的文档, 第一行是该模块为各种分布实现了伪随机数生成器random模块本质上是用数据的算法来实现的, 生成的数据看似随机, 但依然是可重现的。1.1seed, getstate, setstate通过指定初始化随机数, random.seed 可以使后续生成的随机数具有确定性.In [1]: import randomIn [2]: random.seed(100)In [3]: [random.random() ...
2021-08-13 17:21:16
2553
原创 Python 中的json模块dumps参数详解
1.什么是JSON维基百科中的定义: JSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。一个数据示例:{ "firstName": "Micheal", "lastName":..
2021-08-13 11:48:03
19225
6
原创 Python中的数据类dataclass详解
1. 为什么需要数据类1.1 ☹️内置数据类型的局限假设遇到一个场景, 需要保存一些运动员信息的数据对象. 可以使用基本的数据类型tuple和dict实现.如需要创建一个球员jordan, 信息包括球员姓名, 号码, 位置, 年龄.使用tupleIn [1]: jordan = ('Micheal Jordan', 23, 'PG', 29)In [2]: jordan[0]Out[2]: 'Micheal Jordan'劣势: 创建和取值基于位置, 需要记住坐标对应的....
2021-08-12 15:53:05
36811
9
原创 Python中的包和模块 module, package
1. 概述模块化编程是指将大型、繁杂的编程任务拆分为更小的、各自独立的、更易于管理的子任务或模块的过程。然后可以将各个模块拼凑在一起以创建更大的应用程序。应用程序中模块化代码有几个优点: 简单性:一个模块通常只关注问题的一小部分。这使得开发更容易,更不容易出错。 可维护性:模块化设计为任务强制划分了逻辑边界。如果模块之间以最小化相互依赖的方式编写,那么对单个模块的修改对程序其他部分产生影响的可能性就会降低。(甚至可以在不了解模块外的应用程序的情况下对模块进行更改。) 可重用
2021-08-09 16:27:18
420
原创 Python中的命名空间介绍 -- 以及nonlocal 和global 的使用
1. 命名空间Python程序运行时, 会根据需要创建命名空间. 按照命名空间的生命周期来划分, 可将命名空间分为4种内置 ( Built-in ) 全局 ( global ) 闭包 ( Enclosing ) 本地 ( local )1.1 内置命名空间内置空间中保存着Python内置的变量对象(如 print函数, list对象等), 内置命名空间由Python解释器创建和销毁, 只要python程序在运行, 内置空间的变量就是生效的. 如:任何时候都可以调用print函数和使用l.
2021-08-05 20:56:34
677
1
原创 Python中的*args和**kwargs理解
1.Python函数的参数Python函数的传参, 支持两种方式, 一种是基于位置传递(Positional Arguments), 一种是基于变量名称传递(Keyword Arguments).比如定义一个函数func 接受4个参数In [1]: def func(a, b, c, d): ...: print(a, b, c, d)可以基于位置传参, (1, 2, 3, 4)根据位置顺序分别赋值给参数a, b, c, d.In [2]: func(1, 2, 3, .
2021-08-03 20:53:36
1370
5
原创 Python 迭代器与生成器的区别
先说结论: ① 所有的生成器都是迭代器. ② 迭代器(iterator)用类实现, 生成器(generator)用函数实现Python 中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象(如: tuple, list, dict)1.迭代器迭代器的实现是基于类, 要使得类的实例是一个生成器, 需要满足2个条件.定义一个__iter__方法, 内容要 return self...
2021-08-03 16:54:46
7385
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅